@getmicdrop/venue-calendar 3.4.2 → 3.4.3
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/CarouselView.legacy-DdcBQB8k.js +65 -0
- package/dist/CarouselView.legacy-DdcBQB8k.js.map +1 -0
- package/dist/Checkout.legacy-ColJbEgW.js +1147 -0
- package/dist/Checkout.legacy-ColJbEgW.js.map +1 -0
- package/dist/FeaturedView.legacy-CtZabSNQ.js +128 -0
- package/dist/FeaturedView.legacy-CtZabSNQ.js.map +1 -0
- package/dist/GalleryCard-Ch072lif.js +84 -0
- package/dist/GalleryCard-Ch072lif.js.map +1 -0
- package/dist/GalleryView.legacy-CQOF_kYd.js +52 -0
- package/dist/GalleryView.legacy-CQOF_kYd.js.map +1 -0
- package/dist/GroupedListView.legacy-BWqs_hha.js +148 -0
- package/dist/GroupedListView.legacy-BWqs_hha.js.map +1 -0
- package/dist/Success.legacy-BcuRT_6P.js +191 -0
- package/dist/Success.legacy-BcuRT_6P.js.map +1 -0
- package/dist/VenueCalendar-DXZ34Hv2.js +26492 -0
- package/dist/VenueCalendar-DXZ34Hv2.js.map +1 -0
- package/dist/api/api.cjs +1 -1
- package/dist/api/api.cjs.map +1 -1
- package/dist/api/api.mjs +198 -163
- package/dist/api/api.mjs.map +1 -1
- package/dist/api/events.d.ts +31 -1
- package/dist/api/index.d.ts +2 -2
- package/dist/api/types.d.ts +61 -0
- package/dist/colors-BZoMuXdh.js +62 -0
- package/dist/colors-BZoMuXdh.js.map +1 -0
- package/dist/types/index.d.ts +24 -32
- package/dist/venue-calendar.css +1 -1
- package/dist/venue-calendar.es.js +21 -25502
- package/dist/venue-calendar.es.js.map +1 -1
- package/dist/venue-calendar.iife.js +50 -24
- package/dist/venue-calendar.iife.js.map +1 -1
- package/dist/venue-calendar.umd.js +50 -24
- package/dist/venue-calendar.umd.js.map +1 -1
- package/package.json +2 -1
- package/src/lib/theme.js +18 -10
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"VenueCalendar-DXZ34Hv2.js","sources":["../node_modules/js-cookie/dist/js.cookie.mjs","../src/lib/utils/timezone.js","../src/lib/utils/datetime.js","../src/lib/utils/event-transform.js","../src/lib/utils/utils.js","../src/lib/utils/constants.js","../node_modules/@getmicdrop/svelte-components/dist/utils/transitions.js","../node_modules/@getmicdrop/svelte-components/dist/primitives/Icons/ChevronLeftOutline.svelte","../node_modules/@getmicdrop/svelte-components/dist/primitives/Icons/ChevronRightOutline.svelte","../node_modules/@getmicdrop/svelte-components/dist/primitives/Icons/ChevronDownOutline.svelte","../node_modules/@getmicdrop/svelte-components/dist/primitives/Icons/ChevronUpOutline.svelte","../node_modules/@getmicdrop/svelte-components/dist/primitives/Icons/CloseOutline.svelte","../node_modules/@getmicdrop/svelte-components/dist/primitives/Icons/CheckOutline.svelte","../node_modules/@getmicdrop/svelte-components/dist/primitives/Icons/ShareOutline.svelte","../node_modules/@getmicdrop/svelte-components/dist/primitives/Icons/EyeOutline.svelte","../node_modules/@getmicdrop/svelte-components/dist/primitives/Icons/EyeSlashOutline.svelte","../node_modules/@getmicdrop/svelte-components/dist/primitives/Icons/CloseCircleOutline.svelte","../node_modules/@getmicdrop/svelte-components/dist/primitives/Icons/ExclamationCircleOutline.svelte","../node_modules/@getmicdrop/svelte-components/dist/primitives/Icons/ExclamationTriangleOutline.svelte","../node_modules/@getmicdrop/svelte-components/dist/primitives/Icons/LogoInstagram.svelte","../node_modules/@getmicdrop/svelte-components/dist/tokens/typography.js","../node_modules/@getmicdrop/svelte-components/dist/tokens/variants.js","../node_modules/tailwind-merge/dist/bundle-mjs.mjs","../node_modules/@getmicdrop/svelte-components/dist/tokens/sizing.js","../node_modules/@getmicdrop/svelte-components/dist/utils/haptic.js","../node_modules/@getmicdrop/svelte-components/dist/primitives/Button/Button.svelte","../node_modules/@getmicdrop/svelte-components/dist/primitives/Card.svelte","../node_modules/@getmicdrop/svelte-components/dist/primitives/Checkbox/Checkbox.svelte","../node_modules/@getmicdrop/svelte-components/dist/utils/formatters.js","../node_modules/@getmicdrop/svelte-components/dist/primitives/Input/Input.svelte","../node_modules/@getmicdrop/svelte-components/dist/utils/portal.js","../node_modules/@getmicdrop/svelte-components/dist/primitives/Modal/Modal.svelte","../node_modules/@getmicdrop/svelte-components/dist/primitives/Spinner/Spinner.svelte","../node_modules/@getmicdrop/svelte-components/dist/components/Heading.svelte","../node_modules/@getmicdrop/svelte-components/dist/components/Text.svelte","../node_modules/filepond/dist/filepond.esm.js","../node_modules/filepond-plugin-image-preview/dist/filepond-plugin-image-preview.esm.js","../node_modules/filepond-plugin-image-exif-orientation/dist/filepond-plugin-image-exif-orientation.esm.js","../node_modules/filepond-plugin-file-validate-type/dist/filepond-plugin-file-validate-type.esm.js","../node_modules/filepond-plugin-file-validate-size/dist/filepond-plugin-file-validate-size.esm.js","../node_modules/sortablejs/modular/sortable.esm.js","../node_modules/@getmicdrop/svelte-components/dist/recipes/feedback/EmptyState/EmptyState.svelte","../node_modules/@googlemaps/js-api-loader/dist/index.js","../node_modules/@getmicdrop/svelte-components/dist/assets/svg/cancel.svg","../node_modules/@getmicdrop/svelte-components/dist/recipes/modals/InputModal.svelte","../node_modules/carbon-icons-svelte/lib/Renew.svelte","../node_modules/carbon-icons-svelte/lib/CheckmarkFilled.svelte","../node_modules/@getmicdrop/svelte-components/dist/__LIB_STORES__.js","../node_modules/@getmicdrop/svelte-components/dist/calendar/MonthSwitcher/MonthSwitcher.svelte","../node_modules/@getmicdrop/svelte-components/dist/calendar/OrderSummary/OrderSummary.svelte","../node_modules/@getmicdrop/svelte-components/dist/calendar/ShowTimeCard/ShowTimeCard.svelte","../node_modules/@getmicdrop/svelte-components/dist/calendar/ShowCard/ShowCard.svelte","../node_modules/@getmicdrop/svelte-components/dist/calendar/AboutShow/AboutShow.svelte","../node_modules/@getmicdrop/svelte-components/dist/calendar/FAQs/FAQs.svelte","../src/lib/browse-widgets/defaults.ts","../src/lib/browse-widgets/status.ts","../node_modules/carbon-icons-svelte/lib/Apple.svelte","../node_modules/carbon-icons-svelte/lib/ArrowLeft.svelte","../node_modules/carbon-icons-svelte/lib/Calendar.svelte","../node_modules/carbon-icons-svelte/lib/Checkmark.svelte","../node_modules/carbon-icons-svelte/lib/ChevronDown.svelte","../node_modules/carbon-icons-svelte/lib/ChevronLeft.svelte","../node_modules/carbon-icons-svelte/lib/Close.svelte","../node_modules/carbon-icons-svelte/lib/Email.svelte","../node_modules/carbon-icons-svelte/lib/ErrorFilled.svelte","../node_modules/carbon-icons-svelte/lib/Fire.svelte","../node_modules/carbon-icons-svelte/lib/Gift.svelte","../node_modules/carbon-icons-svelte/lib/Help.svelte","../node_modules/carbon-icons-svelte/lib/LocationFilled.svelte","../node_modules/carbon-icons-svelte/lib/Locked.svelte","../node_modules/carbon-icons-svelte/lib/Search.svelte","../node_modules/carbon-icons-svelte/lib/Share.svelte","../node_modules/carbon-icons-svelte/lib/Ticket.svelte","../node_modules/carbon-icons-svelte/lib/Time.svelte","../node_modules/carbon-icons-svelte/lib/Warning.svelte","../node_modules/carbon-icons-svelte/lib/WarningAltFilled.svelte","../node_modules/carbon-icons-svelte/lib/WarningFilled.svelte","../node_modules/carbon-icons-svelte/lib/WifiOff.svelte","../src/components/ScarcityBadge.svelte","../src/lib/browse-widgets/utils.ts","../src/lib/browse-widgets/variants/time-pills/TimePillsListView.svelte","../src/components/Calendar/Calendar.svelte","../src/components/CalendarToolbar/CalendarToolbar.svelte","../src/lib/browse-widgets/adapter.ts","../src/lib/browse-widgets/variants/time-pills/TimePillsGalleryCard.svelte","../src/lib/browse-widgets/variants/time-pills/TimePillsGalleryView.svelte","../src/lib/browse-widgets/variants/time-pills/TimePillsCarouselView.svelte","../src/lib/browse-widgets/variants/time-pills/TimePillsFeaturedView.svelte","../src/components/SkeletonLoader/SkeletonLoader.svelte","../src/lib/utils/logger.js","../src/lib/utils/api.js","../src/components/PoweredByMicdrop.svelte","../src/components/Modals/NetworkErrorModal.svelte","../src/components/CalendarContainer/CalendarContainer.svelte","../src/assets/icons/calendar-month.svg","../src/assets/icons/list-outline.svg","../src/assets/icons/grid-outline.svg","../src/lib/theme.js","../__SKIP_NAVIGATION__","../src/components/Events/Details/PriceTag.svelte","../src/components/Events/Details/PriceTagSkeleton.svelte","../src/components/Events/Details/TicketActions.svelte","../src/components/Events/Details/StickySidebar.svelte","../src/components/Modals/WaitlistModal.svelte","../src/components/Events/Details/Disclaimer.svelte","../src/components/Tab/+page.svelte","../src/components/Views/EventDetailsView.svelte","../node_modules/@stripe/stripe-js/dist/index.mjs","../src/lib/utils/stripe-errors.ts","../src/lib/premium-ticket-experience/mock-data.ts","../src/lib/premium-ticket-experience/defaults.ts","../__SKIP_ENVIRONMENT__","../node_modules/@getmicdrop/svelte-components/dist/stripe/useStripeTheme.svelte.js","../src/lib/premium-ticket-experience/variants/v3-airbnb-split/CheckoutTimer.svelte","../src/lib/premium-ticket-experience/variants/v3-airbnb-split/CheckoutForm.svelte","../src/lib/premium-ticket-experience/variants/v3-airbnb-split/OrderSummary.svelte","../src/lib/premium-ticket-experience/variants/v3-airbnb-split/CheckoutSidebar.svelte","../src/lib/premium-ticket-experience/variants/v3-airbnb-split/CheckoutMobileFooter.svelte","../src/lib/premium-ticket-experience/variants/v3-airbnb-split/CheckoutMain.svelte","../src/components/Events/Checkout/GiftCardInput.svelte","../src/components/Views/Checkout.svelte","../src/lib/premium-ticket-experience/transform.ts","../src/lib/premium-ticket-experience/variants/v3-airbnb-split/SuccessTicket.svelte","../src/lib/premium-ticket-experience/variants/v3-airbnb-split/SuccessActions.svelte","../src/lib/premium-ticket-experience/variants/v3-airbnb-split/SuccessMain.svelte","../src/components/Views/Success.svelte","../src/lib/web-component.js","../src/lib/VenueCalendar.js"],"sourcesContent":["/*! js-cookie v3.0.5 | MIT */\n/* eslint-disable no-var */\nfunction assign (target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i];\n for (var key in source) {\n target[key] = source[key];\n }\n }\n return target\n}\n/* eslint-enable no-var */\n\n/* eslint-disable no-var */\nvar defaultConverter = {\n read: function (value) {\n if (value[0] === '\"') {\n value = value.slice(1, -1);\n }\n return value.replace(/(%[\\dA-F]{2})+/gi, decodeURIComponent)\n },\n write: function (value) {\n return encodeURIComponent(value).replace(\n /%(2[346BF]|3[AC-F]|40|5[BDE]|60|7[BCD])/g,\n decodeURIComponent\n )\n }\n};\n/* eslint-enable no-var */\n\n/* eslint-disable no-var */\n\nfunction init (converter, defaultAttributes) {\n function set (name, value, attributes) {\n if (typeof document === 'undefined') {\n return\n }\n\n attributes = assign({}, defaultAttributes, attributes);\n\n if (typeof attributes.expires === 'number') {\n attributes.expires = new Date(Date.now() + attributes.expires * 864e5);\n }\n if (attributes.expires) {\n attributes.expires = attributes.expires.toUTCString();\n }\n\n name = encodeURIComponent(name)\n .replace(/%(2[346B]|5E|60|7C)/g, decodeURIComponent)\n .replace(/[()]/g, escape);\n\n var stringifiedAttributes = '';\n for (var attributeName in attributes) {\n if (!attributes[attributeName]) {\n continue\n }\n\n stringifiedAttributes += '; ' + attributeName;\n\n if (attributes[attributeName] === true) {\n continue\n }\n\n // Considers RFC 6265 section 5.2:\n // ...\n // 3. If the remaining unparsed-attributes contains a %x3B (\";\")\n // character:\n // Consume the characters of the unparsed-attributes up to,\n // not including, the first %x3B (\";\") character.\n // ...\n stringifiedAttributes += '=' + attributes[attributeName].split(';')[0];\n }\n\n return (document.cookie =\n name + '=' + converter.write(value, name) + stringifiedAttributes)\n }\n\n function get (name) {\n if (typeof document === 'undefined' || (arguments.length && !name)) {\n return\n }\n\n // To prevent the for loop in the first place assign an empty array\n // in case there are no cookies at all.\n var cookies = document.cookie ? document.cookie.split('; ') : [];\n var jar = {};\n for (var i = 0; i < cookies.length; i++) {\n var parts = cookies[i].split('=');\n var value = parts.slice(1).join('=');\n\n try {\n var found = decodeURIComponent(parts[0]);\n jar[found] = converter.read(value, found);\n\n if (name === found) {\n break\n }\n } catch (e) {}\n }\n\n return name ? jar[name] : jar\n }\n\n return Object.create(\n {\n set,\n get,\n remove: function (name, attributes) {\n set(\n name,\n '',\n assign({}, attributes, {\n expires: -1\n })\n );\n },\n withAttributes: function (attributes) {\n return init(this.converter, assign({}, this.attributes, attributes))\n },\n withConverter: function (converter) {\n return init(assign({}, this.converter, converter), this.attributes)\n }\n },\n {\n attributes: { value: Object.freeze(defaultAttributes) },\n converter: { value: Object.freeze(converter) }\n }\n )\n}\n\nvar api = init(defaultConverter, { path: '/' });\n/* eslint-enable no-var */\n\nexport { api as default };\n","/**\n * Timezone Utilities\n *\n * Provides timezone normalization and validation for venue calendar.\n * Handles legacy timezone formats and normalizes to IANA timezone IDs.\n */\n\n/** Default timezone when none specified */\nexport const DEFAULT_TIMEZONE = 'UTC';\n\n/**\n * Map of legacy timezone values to IANA timezone IDs.\n * Used to normalize various timezone formats from the API.\n */\nexport const LEGACY_TIMEZONE_MAP = {\n // US timezones - common abbreviations\n 'PST': 'America/Los_Angeles',\n 'PDT': 'America/Los_Angeles',\n 'MST': 'America/Denver',\n 'MDT': 'America/Denver',\n 'CST': 'America/Chicago',\n 'CDT': 'America/Chicago',\n 'EST': 'America/New_York',\n 'EDT': 'America/New_York',\n 'HST': 'Pacific/Honolulu',\n 'AKST': 'America/Anchorage',\n 'AKDT': 'America/Anchorage',\n \n // Common city names\n 'Pacific': 'America/Los_Angeles',\n 'Mountain': 'America/Denver',\n 'Central': 'America/Chicago',\n 'Eastern': 'America/New_York',\n \n // UTC variants\n 'UTC': 'UTC',\n 'GMT': 'UTC',\n 'Z': 'UTC',\n \n // Numeric offsets (common ones)\n '-08:00': 'America/Los_Angeles',\n '-07:00': 'America/Denver',\n '-06:00': 'America/Chicago',\n '-05:00': 'America/New_York',\n '-04:00': 'America/New_York', // EDT\n '+00:00': 'UTC',\n};\n\n/**\n * Check if a timezone string is valid IANA timezone.\n * @param {string} tz - Timezone string to validate\n * @returns {boolean}\n */\nexport function isValidTimezone(tz) {\n if (!tz || typeof tz !== 'string') return false;\n try {\n Intl.DateTimeFormat(undefined, { timeZone: tz });\n return true;\n } catch {\n return false;\n }\n}\n\nexport const isValidIANATimezone = isValidTimezone;\n\n/**\n * Normalize a timezone value to IANA format.\n * Handles legacy abbreviations, city names, and UTC offsets.\n *\n * @param {string} tz - Timezone string (may be legacy format)\n * @returns {string} IANA timezone ID (or 'UTC' if invalid)\n *\n * @example\n * getIANATimezone('PST') // 'America/Los_Angeles'\n * getIANATimezone('America/New_York') // 'America/New_York'\n * getIANATimezone('Eastern') // 'America/New_York'\n * getIANATimezone(null) // 'UTC'\n */\nexport function getIANATimezone(tz) {\n // Handle null/undefined/empty\n if (!tz || typeof tz !== 'string') {\n return DEFAULT_TIMEZONE;\n }\n\n const trimmed = tz.trim();\n \n // Check legacy map FIRST (before isValidTimezone)\n // This ensures that offset strings like '-08:00' get converted to IANA timezones\n // rather than being returned as-is (since Intl.DateTimeFormat accepts offsets)\n \n // Check legacy map (case-insensitive for abbreviations)\n const upper = trimmed.toUpperCase();\n if (LEGACY_TIMEZONE_MAP[upper]) {\n return LEGACY_TIMEZONE_MAP[upper];\n }\n\n // Check legacy map with original case (for city names and offsets)\n if (LEGACY_TIMEZONE_MAP[trimmed]) {\n return LEGACY_TIMEZONE_MAP[trimmed];\n }\n \n // Already valid IANA timezone (check after legacy map)\n if (isValidTimezone(trimmed)) {\n return trimmed;\n }\n\n // Default to UTC for unknown timezones\n return DEFAULT_TIMEZONE;\n}\n","/**\n * DateTime Utilities\n *\n * Consolidated date/time formatting with timezone support.\n * Uses Intl.DateTimeFormat for consistent timezone-aware formatting.\n *\n * NOTE: When @getmicdrop/svelte-components is updated to include the datetime\n * module, these functions can be replaced with re-exports.\n *\n * @example\n * import { formatEventTime, formatTimeRange, getDateParts } from './datetime.js';\n *\n * const time = formatEventTime(event.startDateTime, event.timeZone);\n * const range = formatTimeRange(event.startDateTime, event.endDateTime, event.timeZone);\n * const { day, month, date } = getDateParts(event.startDateTime, event.timeZone);\n */\n\n// Re-export timezone utilities from existing module\nexport { getIANATimezone, LEGACY_TIMEZONE_MAP } from './timezone.js';\n\n/** Default timezone when none specified */\nexport const DEFAULT_TIMEZONE = 'UTC';\n\n// =============================================================================\n// Timezone Utilities\n// =============================================================================\n\n/**\n * Check if a timezone string is valid IANA timezone.\n * @param {string} tz - Timezone string to validate\n * @returns {boolean}\n */\nexport function isValidTimezone(tz) {\n if (!tz || typeof tz !== 'string') return false;\n try {\n Intl.DateTimeFormat(undefined, { timeZone: tz });\n return true;\n } catch {\n return false;\n }\n}\n\nexport const isValidIANATimezone = isValidTimezone;\n\n// =============================================================================\n// Format Functions\n// =============================================================================\n\n/**\n * Parse and validate an ISO date string.\n * @param {string} utcIso - ISO date string\n * @returns {Date|null}\n */\nfunction parseISO(utcIso) {\n if (!utcIso || typeof utcIso !== 'string') return null;\n const date = new Date(utcIso);\n return isNaN(date.getTime()) ? null : date;\n}\n\n/**\n * Format a datetime in the specified timezone.\n * @param {string} utcIso - ISO date string\n * @param {string} timezone - IANA timezone\n * @param {Object} options - Intl.DateTimeFormat options\n * @returns {string}\n */\nfunction formatInTz(utcIso, timezone, options) {\n const date = parseISO(utcIso);\n if (!date) return '';\n \n const tz = isValidTimezone(timezone) ? timezone : DEFAULT_TIMEZONE;\n return new Intl.DateTimeFormat('en-US', { ...options, timeZone: tz }).format(date);\n}\n\n/**\n * Format event time (e.g., \"7:00 PM\").\n * @param {string} utcIso - ISO date string\n * @param {string} timezone - IANA timezone\n * @returns {string}\n */\nexport function formatEventTime(utcIso, timezone) {\n return formatInTz(utcIso, timezone, {\n hour: 'numeric',\n minute: '2-digit',\n hour12: true,\n });\n}\n\n/**\n * Format event date (e.g., \"Dec 25, 2023\").\n * @param {string} utcIso - ISO date string\n * @param {string} timezone - IANA timezone\n * @returns {string}\n */\nexport function formatEventDate(utcIso, timezone) {\n return formatInTz(utcIso, timezone, {\n month: 'short',\n day: 'numeric',\n year: 'numeric',\n });\n}\n\n/**\n * Format event datetime (e.g., \"Dec 25, 2023 at 7:00 PM\").\n * @param {string} utcIso - ISO date string\n * @param {string} timezone - IANA timezone\n * @returns {string}\n */\nexport function formatEventDateTime(utcIso, timezone) {\n const date = formatEventDate(utcIso, timezone);\n const time = formatEventTime(utcIso, timezone);\n return date && time ? `${date} at ${time}` : date || time;\n}\n\n/**\n * Format time range (e.g., \"7:00 PM - 10:00 PM\").\n * @param {string} startUtc - Start ISO date string\n * @param {string} endUtc - End ISO date string\n * @param {string} timezone - IANA timezone\n * @returns {string}\n */\nexport function formatTimeRange(startUtc, endUtc, timezone) {\n const start = formatEventTime(startUtc, timezone);\n if (!endUtc) return start;\n \n const end = formatEventTime(endUtc, timezone);\n return start && end ? `${start} - ${end}` : start;\n}\n\n/**\n * Format clean time range (omits :00 minutes).\n * @param {string} startUtc - Start ISO date string\n * @param {string} endUtc - End ISO date string\n * @param {string} timezone - IANA timezone\n * @returns {string}\n */\nexport function formatCleanTimeRange(startUtc, endUtc, timezone) {\n const formatClean = (utcIso) => {\n const date = parseISO(utcIso);\n if (!date) return '';\n \n const tz = isValidTimezone(timezone) ? timezone : DEFAULT_TIMEZONE;\n const parts = new Intl.DateTimeFormat('en-US', {\n hour: 'numeric',\n minute: '2-digit',\n hour12: true,\n timeZone: tz,\n }).formatToParts(date);\n \n const hour = parts.find(p => p.type === 'hour')?.value || '';\n const minute = parts.find(p => p.type === 'minute')?.value || '00';\n const period = parts.find(p => p.type === 'dayPeriod')?.value || '';\n \n return minute === '00' ? `${hour} ${period}` : `${hour}:${minute} ${period}`;\n };\n \n const start = formatClean(startUtc);\n if (!endUtc) return start;\n \n const end = formatClean(endUtc);\n return start && end ? `${start} - ${end}` : start;\n}\n\n/**\n * Format day of week (e.g., \"Mon\" or \"Monday\").\n * @param {string} utcIso - ISO date string\n * @param {string} timezone - IANA timezone\n * @param {boolean} short - Use short format (default: true)\n * @returns {string}\n */\nexport function formatDayOfWeek(utcIso, timezone, short = true) {\n return formatInTz(utcIso, timezone, {\n weekday: short ? 'short' : 'long',\n });\n}\n\n/**\n * Format month (e.g., \"Dec\" or \"December\").\n * @param {string} utcIso - ISO date string\n * @param {string} timezone - IANA timezone\n * @param {boolean} short - Use short format (default: true)\n * @returns {string}\n */\nexport function formatMonth(utcIso, timezone, short = true) {\n return formatInTz(utcIso, timezone, {\n month: short ? 'short' : 'long',\n });\n}\n\n/**\n * Format hour (e.g., \"8 PM\").\n * @param {number} hour - Hour (0-23)\n * @returns {string}\n */\nexport function formatHour(hour) {\n const suffix = hour >= 12 ? 'PM' : 'AM';\n const displayHour = hour % 12 || 12;\n return `${displayHour} ${suffix}`;\n}\n\n/**\n * Get date parts for display.\n * @param {string} utcIso - ISO date string\n * @param {string} timezone - IANA timezone\n * @returns {{ day: string, month: string, date: number, year: number }}\n */\nexport function getDateParts(utcIso, timezone) {\n const date = parseISO(utcIso);\n if (!date) return { day: '', month: '', date: 0, year: 0 };\n \n const tz = isValidTimezone(timezone) ? timezone : DEFAULT_TIMEZONE;\n \n return {\n day: formatInTz(utcIso, tz, { weekday: 'short' }),\n month: formatInTz(utcIso, tz, { month: 'short' }),\n date: parseInt(formatInTz(utcIso, tz, { day: 'numeric' }), 10),\n year: parseInt(formatInTz(utcIso, tz, { year: 'numeric' }), 10),\n };\n}\n\n/**\n * Check if a date is today in the specified timezone.\n * @param {string} utcIso - ISO date string\n * @param {string} timezone - IANA timezone\n * @returns {boolean}\n */\nexport function isToday(utcIso, timezone) {\n const date = parseISO(utcIso);\n if (!date) return false;\n \n const tz = isValidTimezone(timezone) ? timezone : DEFAULT_TIMEZONE;\n const now = new Date();\n \n const dateStr = formatInTz(utcIso, tz, { year: 'numeric', month: '2-digit', day: '2-digit' });\n const nowStr = new Intl.DateTimeFormat('en-US', {\n year: 'numeric',\n month: '2-digit',\n day: '2-digit',\n timeZone: tz,\n }).format(now);\n \n return dateStr === nowStr;\n}\n\n/**\n * Format browse card date (e.g., \"Mon, Jan 15\").\n * Used for gallery cards and list views.\n * @param {string} utcIso - ISO date string\n * @param {string} timezone - IANA timezone\n * @returns {string}\n */\nexport function formatBrowseDate(utcIso, timezone) {\n return formatInTz(utcIso, timezone, {\n weekday: 'short',\n month: 'short',\n day: 'numeric',\n });\n}\n\n/**\n * Format full date with year (e.g., \"Monday, January 15, 2026\").\n * Used for event detail pages and aria-labels.\n * @param {string} utcIso - ISO date string\n * @param {string} timezone - IANA timezone\n * @returns {string}\n */\nexport function formatFullDate(utcIso, timezone) {\n return formatInTz(utcIso, timezone, {\n weekday: 'long',\n year: 'numeric',\n month: 'long',\n day: 'numeric',\n });\n}\n\n/**\n * Format full date without year (e.g., \"Monday, January 15\").\n * Used for sidebar/compact displays.\n * @param {string} utcIso - ISO date string\n * @param {string} timezone - IANA timezone\n * @returns {string}\n */\nexport function formatFullDateCompact(utcIso, timezone) {\n return formatInTz(utcIso, timezone, {\n weekday: 'long',\n month: 'long',\n day: 'numeric',\n });\n}\n\n/**\n * Format sales date for ticket windows (e.g., \"Jan 15, 7:00 PM\").\n * @param {string} utcIso - ISO date string\n * @param {string} [timezone] - IANA timezone (optional, uses browser default if omitted)\n * @returns {string}\n */\nexport function formatSalesDate(utcIso, timezone) {\n return formatInTz(utcIso, timezone, {\n month: 'short',\n day: 'numeric',\n hour: 'numeric',\n minute: '2-digit',\n hour12: true,\n });\n}\n\n/**\n * Format doors open time in venue timezone.\n * Handles pre-formatted strings (e.g., \"7:30 PM\") and ISO date strings.\n * @param {string} doorsOpenTime - Pre-formatted time string or ISO date string\n * @param {string} timezone - IANA timezone\n * @returns {string}\n */\nexport function formatDoorsTime(doorsOpenTime, timezone) {\n if (!doorsOpenTime) return '';\n\n // If it's already a nicely formatted time string like \"7:30 PM\", return as-is\n if (typeof doorsOpenTime === 'string' && /^\\d{1,2}:\\d{2}\\s*(AM|PM)$/i.test(doorsOpenTime)) {\n return doorsOpenTime;\n }\n\n // If it's an ISO date string or timestamp, parse and format in venue timezone\n const formatted = formatEventTime(doorsOpenTime, timezone);\n return formatted || doorsOpenTime;\n}\n\n/**\n * Format success/confirmation datetime (e.g., \"Sat, Jan 15, 2026, 7:00 PM\").\n * @param {string} utcIso - ISO date string\n * @param {string} timezone - IANA timezone\n * @returns {string}\n */\nexport function formatConfirmationDateTime(utcIso, timezone) {\n return formatInTz(utcIso, timezone, {\n weekday: 'short',\n month: 'short',\n day: 'numeric',\n year: 'numeric',\n hour: 'numeric',\n minute: '2-digit',\n hour12: true,\n });\n}\n\n/**\n * Format notification time (relative for recent, date for older).\n * @param {string} utcIso - ISO date string\n * @param {string} timezone - IANA timezone\n * @returns {string}\n */\nexport function formatNotificationTime(utcIso, timezone) {\n const date = parseISO(utcIso);\n if (!date) return '';\n \n const now = new Date();\n const diffMs = now.getTime() - date.getTime();\n const diffSec = Math.floor(diffMs / 1000);\n \n if (isToday(utcIso, timezone)) {\n if (diffSec < 60) return `${diffSec} seconds ago`;\n if (diffSec < 3600) return `${Math.floor(diffSec / 60)} minutes ago`;\n if (diffSec < 86400) return `${Math.floor(diffSec / 3600)} hours ago`;\n }\n \n return formatEventDateTime(utcIso, timezone);\n}\n","/**\n * Event Transformation Utilities\n * \n * Single source of truth for transforming API event data into display-ready formats.\n * Consolidates duplicate transformation logic from utils.js and api.js.\n */\n\nimport {\n getIANATimezone,\n formatEventTime,\n formatTimeRange,\n getDateParts as getDatePartsNew,\n} from './datetime.js';\n\n/** CDN base URL for image assets */\nconst CDN_BASE_URL = 'https://moxy.sfo3.digitaloceanspaces.com';\n\n/**\n * Default placeholder image\n * Using a data URI SVG to avoid third-party dependencies\n */\nconst PLACEHOLDER_IMAGE = 'data:image/svg+xml,' + encodeURIComponent(`<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 200 300\" fill=\"none\">\n <rect width=\"200\" height=\"300\" fill=\"#E5E7EB\"/>\n <rect x=\"60\" y=\"90\" width=\"80\" height=\"80\" rx=\"10\" fill=\"#D1D5DB\"/>\n <circle cx=\"85\" cy=\"115\" r=\"10\" fill=\"#9CA3AF\"/>\n <path d=\"M70 155 L100 125 L130 155 L130 155\" stroke=\"#9CA3AF\" stroke-width=\"4\" stroke-linecap=\"round\" stroke-linejoin=\"round\" fill=\"none\"/>\n <text x=\"100\" y=\"210\" text-anchor=\"middle\" font-family=\"system-ui, sans-serif\" font-size=\"14\" fill=\"#6B7280\">Event Image</text>\n</svg>`);\n\n// ============================================================================\n// Shared Helpers\n// ============================================================================\n\n/**\n * Prepend CDN URL to relative image paths.\n * \n * @param {string} imagePath - Image path (relative or absolute)\n * @returns {string} Full image URL\n */\nexport function getCDNImageUrl(imagePath) {\n if (!imagePath) return '';\n if (imagePath.startsWith('/')) {\n return `${CDN_BASE_URL}${imagePath}`;\n }\n return imagePath;\n}\n\n/**\n * Extract image URL from event data with fallbacks.\n * \n * @param {Object} event - Event object from API\n * @returns {string} Resolved image URL\n */\nexport function getEventImageUrl(event) {\n const rawImage = event.image || event.coverImage || event.imageUrl || event.image_url || '';\n return getCDNImageUrl(rawImage) || PLACEHOLDER_IMAGE;\n}\n\n/**\n * Calculate ticket status based on capacity and dates.\n * \n * @param {Object} ticket - Ticket object\n * @returns {string} Status: 'available', 'low', 'sold_out', 'not_started', 'ended'\n */\nexport function calculateTicketStatus(ticket) {\n const now = new Date();\n \n if (ticket.saleStartDate && new Date(ticket.saleStartDate) > now) {\n return 'not_started';\n }\n if (ticket.saleEndDate && new Date(ticket.saleEndDate) < now) {\n return 'ended';\n }\n \n const remaining = ticket.remainingCapacity ?? ticket.quantityRemaining ?? ticket.quantity ?? 0;\n const total = ticket.totalCapacity ?? ticket.quantity ?? remaining;\n \n if (remaining === 0) return 'sold_out';\n if (total > 0 && remaining / total < 0.1) return 'low';\n return 'available';\n}\n\n/**\n * Filter tickets to only public/online sales.\n * \n * @param {Array} tickets - Array of ticket objects\n * @param {Object} options - Filter options\n * @param {boolean} options.excludeDoorOnly - Exclude \"at the door only\" tickets (salesChannel === 2)\n * @param {boolean} options.publicOnly - Only include visibility === 0 tickets\n * @returns {Array} Filtered tickets\n */\nexport function filterPublicTickets(tickets, options = {}) {\n if (!Array.isArray(tickets)) return [];\n \n let filtered = tickets;\n \n if (options.excludeDoorOnly) {\n filtered = filtered.filter(t => t.salesChannel !== 2);\n }\n \n if (options.publicOnly) {\n filtered = filtered.filter(t => t.visibility === 0);\n }\n \n return filtered;\n}\n\n/**\n * Calculate scarcity data for an event's tickets.\n * \n * @param {Array} tickets - Array of ticket objects (should be pre-filtered)\n * @returns {Object} { totalRemaining, totalCapacity, isSoldOut }\n */\nexport function calculateScarcity(tickets) {\n if (!Array.isArray(tickets) || tickets.length === 0) {\n return { totalRemaining: 0, totalCapacity: 0, isSoldOut: false };\n }\n \n let totalRemaining = 0;\n let totalCapacity = 0;\n \n for (const ticket of tickets) {\n const remaining = ticket.remainingCapacity ?? ticket.quantityRemaining ?? ticket.quantity ?? 0;\n const capacity = ticket.totalCapacity ?? ticket.quantity ?? remaining;\n totalRemaining += remaining;\n totalCapacity += capacity;\n }\n \n return {\n totalRemaining,\n totalCapacity,\n isSoldOut: totalRemaining === 0,\n };\n}\n\n/**\n * Find the lowest price among tickets.\n * \n * @param {Array} tickets - Array of ticket objects\n * @returns {number} Lowest price or 0\n */\nexport function findLowestPrice(tickets) {\n if (!Array.isArray(tickets) || tickets.length === 0) return 0;\n \n const prices = tickets\n .map(t => t.price ?? t.ticketPrice ?? 0)\n .filter(p => p > 0);\n \n return prices.length > 0 ? Math.min(...prices) : 0;\n}\n\n// ============================================================================\n// Date/Time Formatting\n// Now uses consolidated datetime module from @getmicdrop/svelte-components\n// ============================================================================\n\n/**\n * Format a datetime for display in a specific timezone.\n * @deprecated Use formatEventTime or formatEventDateTime from datetime.js\n * \n * @param {string} isoString - ISO datetime string\n * @param {string} timeZone - IANA timezone\n * @param {Object} options - Intl.DateTimeFormat options\n * @returns {string} Formatted string\n */\nexport function formatInTimezone(isoString, timeZone, options) {\n if (!isoString) return '';\n \n const date = new Date(isoString);\n if (isNaN(date.getTime())) return '';\n \n return new Intl.DateTimeFormat('en-US', { ...options, timeZone }).format(date);\n}\n\n/**\n * Format event time range for display.\n * Uses formatTimeRange from datetime module.\n * \n * @param {Object} event - Event object with startDateTime/endDateTime\n * @param {string} timeZone - IANA timezone\n * @returns {string} Formatted time range (e.g., \"8:00 PM - 10:00 PM\")\n */\nexport function formatEventTimeRange(event, timeZone) {\n if (!event.startDateTime) return '';\n \n try {\n if (!event.endDateTime) {\n return formatEventTime(event.startDateTime, timeZone);\n }\n return formatTimeRange(event.startDateTime, event.endDateTime, timeZone);\n } catch {\n // Fallback to legacy implementation for invalid data\n const formatOptions = {\n hour: 'numeric',\n minute: '2-digit',\n hour12: true,\n };\n \n const startTime = formatInTimezone(event.startDateTime, timeZone, formatOptions);\n \n if (!event.endDateTime) return startTime;\n \n const endTime = formatInTimezone(event.endDateTime, timeZone, formatOptions);\n return startTime && endTime ? `${startTime} - ${endTime}` : startTime;\n }\n}\n\n/**\n * Get date parts for display (day, month, dateOfMonth).\n * Uses getDateParts from datetime module.\n * \n * @param {string} isoString - ISO datetime string\n * @param {string} timeZone - IANA timezone\n * @returns {Object} { day, month, dateOfMonth }\n */\nexport function getDateParts(isoString, timeZone) {\n if (!isoString) return { day: '', month: '', dateOfMonth: '' };\n \n try {\n const parts = getDatePartsNew(isoString, timeZone);\n return {\n day: parts.day,\n month: parts.month,\n dateOfMonth: String(parts.date),\n };\n } catch {\n // Fallback to legacy implementation for invalid data\n return {\n day: formatInTimezone(isoString, timeZone, { weekday: 'short' }),\n month: formatInTimezone(isoString, timeZone, { month: 'short' }),\n dateOfMonth: formatInTimezone(isoString, timeZone, { day: 'numeric' }),\n };\n }\n}\n\n// ============================================================================\n// Main Transform Functions\n// ============================================================================\n\n/**\n * Transform modes for different use cases.\n */\nexport const TransformMode = {\n /** Minimal data for list/card views */\n BROWSE: 'browse',\n /** Full data for detail pages */\n DETAIL: 'detail',\n};\n\n/**\n * Transform an API event into display-ready format.\n * \n * @param {Object} apiEvent - Raw event from API\n * @param {Object} options - Transform options\n * @param {string} options.mode - Transform mode: 'browse' or 'detail'\n * @returns {Object} Transformed event\n */\nexport function transformEvent(apiEvent, options = {}) {\n const { mode = TransformMode.DETAIL } = options;\n \n if (!apiEvent) {\n return mode === TransformMode.BROWSE\n ? getEmptyBrowseEvent()\n : getEmptyDetailEvent();\n }\n \n const timeZone = getIANATimezone(apiEvent.timeZone);\n const imageUrl = getEventImageUrl(apiEvent);\n \n // Base properties shared by both modes\n const base = {\n id: apiEvent.id || apiEvent.ID,\n name: apiEvent.title || apiEvent.name || '',\n image: imageUrl,\n timeZone,\n startDateTime: apiEvent.startDateTime || null,\n };\n \n if (mode === TransformMode.BROWSE) {\n return transformBrowseEvent(apiEvent, base, timeZone);\n }\n \n return transformDetailEvent(apiEvent, base, timeZone, imageUrl);\n}\n\n/**\n * Transform for browse/list views (minimal data).\n */\nfunction transformBrowseEvent(apiEvent, base, timeZone) {\n // Calculate date in venue timezone\n let startDate = '';\n if (apiEvent.startDateTime) {\n const dt = new Date(apiEvent.startDateTime);\n startDate = dt.toLocaleDateString('en-CA', {\n timeZone,\n year: 'numeric',\n month: '2-digit',\n day: '2-digit',\n });\n }\n \n // Filter and calculate scarcity\n const publicTickets = filterPublicTickets(apiEvent.availableTickets || [], { excludeDoorOnly: true });\n const scarcity = calculateScarcity(publicTickets);\n \n return {\n ...base,\n date: startDate || apiEvent.date || '',\n status: apiEvent.status || 'On Sale',\n timeline: formatEventTimeRange(apiEvent, timeZone),\n description: apiEvent.description || apiEvent.eventSummary || '',\n venueId: apiEvent.venueId || apiEvent.venue_id,\n eventSeriesId: apiEvent.eventSeriesId || null,\n // Scarcity data\n ticketsRemaining: scarcity.totalRemaining,\n ticketsTotal: scarcity.totalCapacity,\n isSoldOut: scarcity.isSoldOut,\n };\n}\n\n/**\n * Transform for detail views (full data).\n */\nfunction transformDetailEvent(apiEvent, base, timeZone, imageUrl) {\n const allTickets = (apiEvent.availableTickets || []).map(ticket => ({\n ...ticket,\n status: calculateTicketStatus(ticket),\n }));\n const publicTickets = filterPublicTickets(allTickets, { publicOnly: true });\n const dateParts = getDateParts(apiEvent.startDateTime, timeZone);\n \n return {\n ...base,\n date: apiEvent.startDateTime ? formatDateCustom(apiEvent.startDateTime) : null,\n endDateTime: apiEvent.endDateTime,\n description: apiEvent.description,\n timeline: formatInTimezone(apiEvent.startDateTime, timeZone, {\n hour: 'numeric',\n minute: '2-digit',\n hour12: true,\n }),\n location: apiEvent.venue?.googleLocationNameCache || apiEvent.venue?.address || '',\n ...dateParts,\n coverImage: imageUrl,\n price: findLowestPrice(apiEvent.availableTickets),\n status: apiEvent.status || 'On Sale',\n eventSummary: apiEvent.eventSummary,\n password: apiEvent.password,\n availableTickets: allTickets,\n publicTickets,\n doorsOpenTime: apiEvent.doorsOpenTime,\n venue: apiEvent.venue,\n venueID: apiEvent.venueId,\n eventID: apiEvent.ID,\n stage: apiEvent.stage,\n performers: apiEvent.performers,\n ticketType: apiEvent.ticketType,\n eventTicketingType: apiEvent.eventTicketingType,\n purchasedTickets: apiEvent.purchasedTickets,\n ShowImage: imageUrl,\n displayStartTime: apiEvent.displayStartTime,\n displayEndTime: apiEvent.displayEndTime,\n displayDoorsTime: apiEvent.displayDoorsTime,\n ageRestriction: apiEvent.ageRestriction || null,\n minimumAge: apiEvent.ageRestriction || null,\n ageRequirement: apiEvent.ageRestriction ? `${apiEvent.ageRestriction}` : null,\n hasAgeRestriction: !!apiEvent.ageRestriction,\n displayAgeRestriction: apiEvent.displayAgeRestriction ?? false,\n };\n}\n\n/**\n * Format date to custom format (for backwards compatibility).\n */\nfunction formatDateCustom(isoString) {\n if (!isoString) return null;\n const date = new Date(isoString);\n if (isNaN(date.getTime())) return null;\n \n const options = {\n weekday: 'short',\n month: 'short',\n day: 'numeric',\n year: 'numeric',\n };\n return new Intl.DateTimeFormat('en-US', options).format(date);\n}\n\n/**\n * Empty event for browse mode.\n */\nfunction getEmptyBrowseEvent() {\n return {\n id: null,\n name: '',\n date: '',\n image: '',\n status: 'unavailable',\n timeline: '',\n description: '',\n venueId: null,\n timeZone: 'UTC',\n eventSeriesId: null,\n startDateTime: null,\n ticketsRemaining: 0,\n ticketsTotal: 0,\n isSoldOut: false,\n };\n}\n\n/**\n * Empty event for detail mode.\n */\nfunction getEmptyDetailEvent() {\n return {\n id: null,\n name: '',\n date: null,\n startDateTime: null,\n endDateTime: null,\n description: '',\n timeline: '',\n location: '',\n day: '',\n month: '',\n dateOfMonth: null,\n image: '',\n coverImage: '',\n price: 0,\n status: 'unavailable',\n eventSummary: '',\n password: '',\n availableTickets: [],\n publicTickets: [],\n doorsOpenTime: null,\n venue: null,\n venueID: null,\n eventID: null,\n stage: null,\n performers: [],\n ticketType: 0,\n eventTicketingType: 0,\n purchasedTickets: [],\n ShowImage: '',\n displayStartTime: null,\n displayEndTime: null,\n ageRestriction: null,\n minimumAge: null,\n ageRequirement: null,\n hasAgeRestriction: false,\n timeZone: 'UTC',\n };\n}\n\n// ============================================================================\n// Backward Compatibility Exports\n// ============================================================================\n\n/**\n * @deprecated Use transformEvent(event, { mode: TransformMode.BROWSE }) instead.\n */\nexport function transformEventData(apiEvent) {\n return transformEvent(apiEvent, { mode: TransformMode.BROWSE });\n}\n","import Cookies from \"js-cookie\";\nimport {\n transformEvent as transformEventNew,\n calculateTicketStatus as calculateTicketStatusNew,\n findLowestPrice as findLowestPriceNew,\n} from './event-transform.js';\n\n// Re-export datetime functions from consolidated module\nexport {\n getIANATimezone,\n formatEventTime,\n formatTimeRange,\n formatCleanTimeRange,\n formatDayOfWeek,\n formatMonth,\n formatHour,\n getDateParts,\n formatEventDateTime,\n formatNotificationTime,\n isToday,\n DEFAULT_TIMEZONE,\n} from './datetime.js';\n\n// Re-export from consolidated module for backward compatibility\nexport { transformEventNew as transformEvent };\nexport { calculateTicketStatusNew as calculateTicketStatus };\nexport { findLowestPriceNew as findLowestPrice };\n\n/**\n * Get the number of days in a month for a given date\n * @param {Date} date - Any date in the target month\n * @returns {number} - Number of days in that month (28-31)\n */\nexport function getDaysInMonth(date) {\n return new Date(date.getFullYear(), date.getMonth() + 1, 0).getDate();\n}\n\n/**\n * Navigation utility that works in both SvelteKit and standalone environments\n * @param {string} url - The URL to navigate to\n * @param {Object} options - Navigation options\n * @param {boolean} options.replaceState - Whether to replace current history entry\n * @param {Function} options.navigateFn - Optional custom navigation function (for SvelteKit)\n */\nexport function navigate(url, options = {}) {\n const { replaceState = false, navigateFn } = options;\n\n // Use custom navigation function if provided (for SvelteKit)\n if (navigateFn && typeof navigateFn === 'function') {\n navigateFn(url, { replaceState });\n return;\n }\n\n // Standalone environment - use browser navigation\n if (typeof window !== 'undefined') {\n if (replaceState) {\n window.history.replaceState({}, '', url);\n } else {\n window.history.pushState({}, '', url);\n }\n\n // Dispatch a custom event for standalone environments to handle navigation\n window.dispatchEvent(new CustomEvent('micdrop-navigate', { detail: { url, replaceState } }));\n }\n}\n\nexport function classNames(...classes) {\n return classes.filter(Boolean).join(\" \");\n}\n\nexport function truncateTitle(title, maxLength) {\n if (title.length > maxLength) {\n return title.slice(0, maxLength) + \"...\";\n }\n return title;\n}\n\nexport function getDays(params) {\n if (params === \"weeks\") {\n return [\n { value: \"monday\", label: \"Monday\" },\n { value: \"tuesday\", label: \"Tuesday\" },\n { value: \"wednesday\", label: \"Wednesday\" },\n { value: \"thursday\", label: \"Thursday\" },\n { value: \"friday\", label: \"Friday\" },\n ];\n } else {\n return Array.from({ length: 31 }, (_, i) => {\n const day = i + 1;\n const suffix =\n day % 10 === 1 && day !== 11\n ? \"st\"\n : day % 10 === 2 && day !== 12\n ? \"nd\"\n : day % 10 === 3 && day !== 13\n ? \"rd\"\n : \"th\";\n return {\n value: day.toString(),\n label: day + suffix,\n };\n });\n }\n}\n\nexport function getDaysNumberOptions(timeUnit) {\n if (timeUnit === \"months\") {\n return Array.from({ length: 12 }, (_, i) => ({\n value: (i + 1).toString(),\n label: (i + 1).toString(),\n }));\n } else if (timeUnit === \"weeks\") {\n return Array.from({ length: 10 }, (_, i) => ({\n value: (i + 1).toString(),\n label: (i + 1).toString(),\n }));\n } else {\n return Array.from({ length: 31 }, (_, i) => ({\n value: (i + 1).toString(),\n label: (i + 1).toString(),\n }));\n }\n}\n\n// =============================================================================\n// DEPRECATED: Date formatting functions\n// These are now re-exported from datetime.js (see top of file).\n// The functions below are kept temporarily for any legacy code that imports them\n// directly. They will be removed in a future version.\n// =============================================================================\n\n/**\n * @deprecated Use formatEventDateTime from datetime.js instead\n */\nexport function convertToDate(value, timeZone = \"UTC\") {\n if (!value) return null;\n\n const date = new Date(value);\n return date.toLocaleString(\"en-US\", {\n weekday: \"short\",\n month: \"short\",\n day: \"numeric\",\n year: \"numeric\",\n hour: \"numeric\",\n minute: \"2-digit\",\n hour12: true,\n timeZone: timeZone,\n });\n}\n\n/**\n * @deprecated This is a legacy date conversion function\n */\nexport function convertToCustomDateTimeFormat(isoDateString) {\n const date = new Date(isoDateString);\n return new Date(\n Date.UTC(\n date.getUTCFullYear(),\n date.getUTCMonth(),\n date.getUTCDate(),\n date.getUTCHours(),\n date.getUTCMinutes()\n )\n );\n}\n\n/**\n * @deprecated Use formatEventTime from datetime.js instead\n */\nexport const formatTimeline = (startDateTime, timeZone = \"UTC\") => {\n if (!startDateTime) return \"\";\n\n const date = new Date(startDateTime);\n if (isNaN(date.getTime())) return \"\";\n\n return new Intl.DateTimeFormat(\"en-US\", {\n hour: \"numeric\",\n minute: \"2-digit\",\n hour12: true,\n timeZone: timeZone,\n }).format(date);\n};\n\n/**\n * @deprecated Use formatDayOfWeek from datetime.js instead\n */\nexport const getDay = (dateString, timeZone = \"UTC\") => {\n if (!dateString) return \"\";\n\n const date = new Date(dateString);\n if (isNaN(date.getTime())) return \"\";\n\n return new Intl.DateTimeFormat(\"en-US\", {\n weekday: \"short\",\n timeZone: timeZone,\n }).format(date);\n};\n\n/**\n * @deprecated Use getDateParts from datetime.js instead\n */\nexport const getMonth = (dateString, timeZone = \"UTC\") => {\n if (!dateString) return \"\";\n\n const date = new Date(dateString);\n if (isNaN(date.getTime())) return \"\";\n\n return new Intl.DateTimeFormat(\"en-US\", {\n month: \"short\",\n timeZone: timeZone,\n }).format(date);\n};\n\n/**\n * @deprecated Use getDateParts from datetime.js instead\n */\nexport const getDateOfMonth = (dateString, timeZone = \"UTC\") => {\n if (!dateString) return \"\";\n\n const date = new Date(dateString);\n if (isNaN(date.getTime())) return \"\";\n\n return new Intl.DateTimeFormat(\"en-US\", {\n day: \"numeric\",\n timeZone: timeZone,\n }).format(date);\n};\n\nexport function resize(node, callback) {\n const updateDimensions = () => {\n callback({\n width: window.innerWidth,\n height: window.innerHeight,\n });\n };\n\n updateDimensions();\n window.addEventListener(\"resize\", updateDimensions);\n\n return {\n destroy() {\n window.removeEventListener(\"resize\", updateDimensions);\n },\n };\n}\n\nexport function convertToCustomDateFormat(isoString) {\n const date = new Date(isoString);\n\n const year = date.getUTCFullYear();\n const month = date.getUTCMonth();\n const day = date.getUTCDate();\n\n const customDate = new Date(year, month, day);\n\n return customDate;\n}\n\nexport function validateNegativeNumber(value) {\n if (value === null || value === undefined || value === \"\") {\n return \"Must be greater than zero.\";\n }\n\n const stringValue = String(value).trim();\n\n if (\n stringValue.includes(\"--\") ||\n stringValue.includes(\"++\") ||\n stringValue.match(/^-+$/) ||\n stringValue.match(/^\\++$/)\n ) {\n return \"Please enter a valid number\";\n }\n\n if (stringValue.match(/^-?\\d+-$/)) {\n return \"Please enter a valid number\";\n }\n\n if ((stringValue.match(/\\./g) || []).length > 1) {\n return \"Please enter a valid number\";\n }\n\n const numValue = Number(value);\n if (isNaN(numValue)) {\n return \"Please enter a valid number\";\n }\n\n if (numValue < 0 || numValue === 0) {\n return \"Price must be greater than zero.\";\n }\n\n return \"\";\n}\n/**\n * @deprecated Use formatEventDateTime and formatEventTime from datetime.js instead\n */\nexport function formatDateTimeWithDoors(startDateTime, doorsOpenTime, timeZone = \"UTC\") {\n if (!startDateTime) return \"\";\n\n const date = new Date(startDateTime);\n const options = {\n weekday: \"short\",\n year: \"numeric\",\n month: \"short\",\n day: \"numeric\",\n hour: \"numeric\",\n minute: \"2-digit\",\n hour12: true,\n timeZone: timeZone,\n };\n\n const formattedDateTime = new Intl.DateTimeFormat(\"en-US\", options).format(\n date\n );\n if (doorsOpenTime) {\n const doorsDate = new Date(doorsOpenTime);\n const doorsFormatted = new Intl.DateTimeFormat(\"en-US\", {\n hour: \"numeric\",\n minute: \"2-digit\",\n hour12: true,\n timeZone: timeZone,\n }).format(doorsDate);\n\n return `${formattedDateTime} (Doors: ${doorsFormatted})`;\n }\n\n return formattedDateTime;\n}\n\nexport async function getClientIP() {\n try {\n const res = await fetch(\"https://api.ipify.org?format=json\");\n const { ip } = await res.json();\n return ip;\n } catch (err) {\n console.error(\"Failed to fetch IP:\", err);\n return null;\n }\n}\n\n/**\n * Generate a URL-friendly slug from a string\n * @param {string} text - The text to slugify\n * @returns {string} - A URL-safe slug\n */\nexport function generateSlug(text) {\n if (!text) return \"\";\n\n return text\n .toLowerCase()\n .trim()\n .replace(/[^\\w\\s-]/g, \"\")\n .replace(/\\s+/g, \"-\")\n .replace(/--+/g, \"-\")\n .replace(/^-+|-+$/g, \"\");\n}\n\n// calculateTicketStatus - now re-exported from event-transform.js at top of file\n\n// findLowestPrice - now re-exported from event-transform.js at top of file\n\nexport function getImageUrl(\n imagePath,\n baseUrl = \"https://moxy.sfo3.cdn.digitaloceanspaces.com\"\n) {\n if (!imagePath) return \"\";\n\n if (imagePath.startsWith(\"http://\") || imagePath.startsWith(\"https://\")) {\n return imagePath;\n }\n\n return `${baseUrl}${imagePath}`;\n}\n\n/**\n * Get the display avatar path for a performer based on their profileImageSource setting.\n * This mirrors the backend logic in auth/utils/avatar.go\n * @param {Object} profile - The performer profile object\n * @returns {string} - The avatar path (relative or absolute URL)\n */\nexport function getDisplayAvatarPath(profile) {\n if (!profile) return \"\";\n\n const source = profile.profileImageSource || \"1\";\n\n // Map source number to the corresponding avatar field\n switch (source) {\n case \"1\":\n return profile.avatarPosition1 || profile.profileImage || \"\";\n case \"2\":\n return profile.avatarPosition2 || \"\";\n case \"3\":\n return profile.avatarPosition3 || \"\";\n case \"4\":\n return profile.avatarPosition4 || \"\";\n case \"5\":\n return profile.avatarPosition5 || \"\";\n case \"6\":\n return profile.avatarPosition6 || \"\";\n default:\n // Fallback to position 1 or profileImage\n return profile.avatarPosition1 || profile.profileImage || \"\";\n }\n}\n\n/**\n * Get the full display avatar URL for a performer.\n * Combines getDisplayAvatarPath with CDN URL resolution.\n * @param {Object} profile - The performer profile object\n * @param {string} baseUrl - CDN base URL (default: DigitalOcean Spaces)\n * @returns {string} - The full avatar URL\n */\nexport function getDisplayAvatarUrl(profile, baseUrl = \"https://moxy.sfo3.cdn.digitaloceanspaces.com\") {\n const path = getDisplayAvatarPath(profile);\n if (!path) return \"\";\n return getImageUrl(path, baseUrl);\n}\n\n/**\n * Get the performer display name based on their profile settings.\n * This mirrors the backend logic in auth/utils/avatar.go\n * @param {Object} profile - The performer profile object\n * @returns {string} - The display name\n */\nexport function getPerformerDisplayName(profile) {\n if (!profile) return \"\";\n\n // If displayName is set, use it\n if (profile.displayName) {\n return profile.displayName;\n }\n\n // Otherwise use first + last name\n const firstName = profile.firstName || \"\";\n const lastName = profile.lastName || \"\";\n const fullName = `${firstName} ${lastName}`.trim();\n\n return fullName || \"\";\n}\n\n// transformEvent - now re-exported from event-transform.js at top of file\n\n\n\nexport async function getVenueDetails(venueID) {\n try {\n const response = await fetch(\n `https://get-micdrop.com/api/v2/public/venues/${venueID}`\n );\n\n if (!response.ok) {\n throw new Error(`API error: ${response.status}`);\n }\n\n const data = await response.json();\n return data;\n } catch (error) {\n console.error(\"getVenueDetails error:\", error);\n throw error;\n }\n}\n\nexport function setCookie(name, value, options = {}) {\n Cookies.set(name, value, options);\n}\n\nexport function getCookie(name) {\n return Cookies.get(name);\n}\n\nexport function removeCookie(name) {\n Cookies.remove(name);\n}\n\n/**\n * Load checkout state from localStorage (preferred) with cookie fallback for migration\n * @param {string} eventID - The event ID\n * @returns {Object} - Checkout state with quantities, promocode, promoDiscountAmount, tickets\n */\nexport function loadCheckoutStateFromCookies(eventID) {\n let quantities = {};\n let donationAmounts = {};\n let tickets = [];\n let promocode = \"\";\n let promoDiscountAmount = 0;\n\n if (typeof window === 'undefined') {\n return { quantities, donationAmounts, promocode, promoDiscountAmount, tickets };\n }\n\n // Try localStorage first (new approach)\n try {\n const stored = localStorage.getItem(`checkout-state-${eventID}`);\n if (stored) {\n const parsed = JSON.parse(stored);\n return {\n quantities: parsed.quantities || {},\n donationAmounts: parsed.donationAmounts || {},\n promocode: parsed.promocode || \"\",\n promoDiscountAmount: parseFloat(parsed.promoDiscountAmount) || 0,\n tickets: parsed.tickets || [],\n };\n }\n } catch (e) {\n console.warn(\"Failed to parse checkout state from localStorage:\", e);\n }\n\n // Fallback to cookies for migration (old approach)\n try {\n quantities = JSON.parse(getCookie(`checkout-quantities-${eventID}`) || \"{}\");\n } catch (e) {\n console.warn(\"Failed to parse checkout quantities cookie:\", e);\n quantities = {};\n }\n\n try {\n tickets = JSON.parse(getCookie(`checkout-tickets-${eventID}`) || \"[]\");\n } catch (e) {\n console.warn(\"Failed to parse checkout tickets cookie:\", e);\n tickets = [];\n }\n\n promocode = getCookie(`checkout-promocode-${eventID}`) || \"\";\n promoDiscountAmount = parseFloat(getCookie(\"checkout-promo-discount\") || 0);\n\n // If we found data in cookies, migrate it to localStorage and clear cookies\n if (Object.keys(quantities).length > 0 || tickets.length > 0 || promocode) {\n persistCheckoutState({ eventID, quantities, donationAmounts, promocode, promoDiscountAmount, tickets });\n clearCheckoutCookies(eventID);\n }\n\n return { quantities, donationAmounts, promocode, promoDiscountAmount, tickets };\n}\n\n/**\n * Clear checkout state from both localStorage and cookies\n * @param {string} eventID - The event ID\n */\nexport function clearCheckoutCookies(eventID) {\n // Clear localStorage (new approach)\n if (typeof window !== 'undefined') {\n localStorage.removeItem(`checkout-state-${eventID}`);\n }\n\n // Clear cookies (for migration cleanup)\n removeCookie(`checkout-quantities-${eventID}`);\n removeCookie(`checkout-promocode-${eventID}`);\n removeCookie(`checkout-promo-discount`);\n removeCookie(`checkout-tickets-${eventID}`);\n}\n\n/**\n * Persist checkout state to localStorage\n * Uses localStorage instead of cookies to avoid size limits and reduce request overhead\n * @param {Object} params - Checkout state parameters\n * @param {string} params.eventID - The event ID\n * @param {Object} params.quantities - Ticket quantities by ID\n * @param {Object} [params.donationAmounts] - Donation amounts by ticket ID\n * @param {string} params.promocode - Applied promo code\n * @param {number} params.promoDiscountAmount - Discount amount\n * @param {Array} params.tickets - Selected tickets (minimal data only)\n */\nexport function persistCheckoutState({\n eventID,\n quantities,\n donationAmounts,\n promocode,\n promoDiscountAmount,\n tickets,\n}) {\n if (typeof window === 'undefined') return;\n\n // Store minimal ticket data to avoid storage bloat\n const minimalTickets = (tickets || []).map(t => ({\n ID: t.ID,\n name: t.name,\n price: t.price,\n type: t.type, // Include type for donation ticket detection\n visibility: t.visibility,\n salesChannel: t.salesChannel,\n }));\n\n const state = {\n quantities: quantities || {},\n donationAmounts: donationAmounts || {},\n promocode: promocode || \"\",\n promoDiscountAmount: promoDiscountAmount || 0,\n tickets: minimalTickets,\n updatedAt: Date.now(),\n };\n\n try {\n localStorage.setItem(`checkout-state-${eventID}`, JSON.stringify(state));\n } catch (e) {\n console.warn(\"Failed to persist checkout state to localStorage:\", e);\n }\n}\n\n/**\n * Ensure order ID exists, create if not\n * @param {string} eventId - The event ID\n * @returns {Promise<string>} - Order ID\n */\nexport async function ensureOrderIdExists(eventId) {\n const existingOrderId = getCookie(`order-id-${eventId}`);\n\n if (existingOrderId) {\n return existingOrderId;\n }\n\n const newOrderId = `order-${eventId}-${Date.now()}`;\n setCookie(`order-id-${eventId}`, newOrderId);\n\n return newOrderId;\n}\n\n// Note: Parameter is named venueID for backwards compatibility but actually represents eventID\nexport async function trackUTMSource(venueID) {\n const urlParams = new URLSearchParams(window.location.search);\n const utmSource = urlParams.get(\"utm_source\") || \"Direct\";\n\n try {\n await fetch(\n `https://get-micdrop.com/api/v2/public/utm/${venueID}/${utmSource}`\n );\n } catch (err) {\n console.error(\"UTM tracking failed:\", err);\n }\n}\n\nexport async function initiateOrder(cartData = {}) {\n try {\n const ip = await getClientIP();\n\n // Note: donationAmounts is not yet supported by backend API\n // TODO: Remove this filter once Gus adds backend support for donationAmounts\n const { donationAmounts: _donationAmounts, eventID, quantities, ...restCartData } = cartData;\n\n // Convert quantities keys to numbers and eventID to number (API expects numeric types)\n const numericQuantities = quantities ? Object.fromEntries(\n Object.entries(quantities).map(([k, v]) => [parseInt(k, 10), v])\n ) : {};\n\n const orderPayload = {\n purchaserIP: ip,\n eventID: eventID ? parseInt(eventID, 10) : undefined,\n quantities: numericQuantities,\n ...restCartData,\n };\n\n const res = await fetch(`https://get-micdrop.com/api/v2/public/orders/create`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(orderPayload),\n });\n\n const data = await res.json();\n\n // Check for API errors\n if (!res.ok || data.error) {\n const errorMessage = data.error || data.message || 'Order creation failed';\n // Check for inventory-related errors\n const isInventoryError = errorMessage.toLowerCase().includes('inventory') ||\n errorMessage.toLowerCase().includes('sold out') ||\n errorMessage.toLowerCase().includes('not available') ||\n errorMessage.toLowerCase().includes('insufficient') ||\n res.status === 409; // Conflict status often used for inventory issues\n\n return {\n success: false,\n error: errorMessage,\n errorType: isInventoryError ? 'inventory' : 'server'\n };\n }\n\n setCookie(\"checkout-cartid\", data.uuid);\n return { success: true, uuid: data.uuid };\n } catch (err) {\n console.error(\"Order initiation failed:\", err);\n return {\n success: false,\n error: err.message || 'Network error',\n errorType: 'network'\n };\n }\n}\n\nexport async function getOrder(orderId) {\n try {\n const response = await fetch(\n `https://get-micdrop.com/api/v2/public/orders/${orderId}`,\n {\n method: \"GET\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n }\n );\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({}));\n const errorMessage =\n errorData.error || `Failed to fetch order (${response.status})`;\n console.error(\"getOrder error response:\", errorData);\n throw new Error(errorMessage);\n }\n\n const data = await response.json();\n return data;\n } catch (err) {\n console.error(\"getOrder error:\", err);\n throw err;\n }\n}\n\nexport async function createPaymentIntent(cartId, quantities) {\n let ip = '';\n try {\n const ipRes = await fetch('https://api.ipify.org?format=json', {\n signal: AbortSignal.timeout(5000) // 5 second timeout\n });\n if (ipRes.ok) {\n const ipData = await ipRes.json();\n ip = ipData.ip || '';\n }\n } catch (ipErr) {\n console.warn('Failed to fetch IP address, continuing without it:', ipErr);\n // Continue without IP if the service is unavailable\n }\n\n const token = getCookie('operator_token');\n\n // Create an AbortController for timeout\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), 30000); // 30 second timeout\n\n try {\n const res = await fetch(\n `https://get-micdrop.com/api/v2/public/orders/${cartId}/payment-intent`,\n {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: token ? `Bearer ${token}` : '',\n },\n credentials: 'include',\n signal: controller.signal,\n body: JSON.stringify({\n IP: ip,\n productQuantities: quantities,\n }),\n }\n );\n\n clearTimeout(timeoutId);\n\n if (!res.ok) {\n const errorData = await res.json().catch(() => ({}));\n console.error('Payment intent creation failed:', errorData);\n throw new Error(errorData.error || `Failed to create payment intent: ${res.status} ${res.statusText}`);\n }\n\n const data = await res.json();\n return data;\n } catch (err) {\n clearTimeout(timeoutId);\n \n // Provide more specific error messages\n if (err.name === 'AbortError') {\n console.error('createPaymentIntent error: Request timeout');\n throw new Error('Request timed out. Please check your connection and try again.');\n } else if (err.message && err.message.includes('Failed to fetch')) {\n console.error('createPaymentIntent error: Network/CORS issue', err);\n throw new Error('Unable to connect to payment server. Please check your internet connection or try again later.');\n } else {\n console.error('createPaymentIntent error:', err);\n // Re-throw the error so the caller can handle it\n throw err;\n }\n }\n}\n\nexport async function validatePaymentIntent(cartId, payload) {\n try {\n const token = getCookie('operator_token');\n\n const res = await fetch(`https://get-micdrop.com/api/v2/public/orders/${cartId}/validate-payment`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: token ? `Bearer ${token}` : '',\n },\n credentials: 'include',\n body: JSON.stringify(payload),\n });\n\n const data = await res.json();\n return data;\n } catch (err) {\n console.error('validatePaymentIntent error:', err);\n return null;\n }\n}\n","/**\r\n * Shared constants for the venue calendar components\r\n */\r\n\r\n// Placeholder image for events without images\r\n// Neutral gray background with a calendar icon\r\n// SVG file located at /static/placeholder-event.svg\r\nexport const PLACEHOLDER_IMAGE = \"/placeholder-event.svg\";\r\n","/**\n * Safe transition utilities that guard against NaN values\n *\n * The standard Svelte slide transition can produce \"Invalid keyframe value for property height: NaNpx\"\n * when the element hasn't been measured yet (e.g., during SSR hydration or when mounted in an unmeasured container).\n *\n * These utilities wrap Svelte's transitions with guards against invalid values.\n */\nimport { slide as svelteSlide } from 'svelte/transition';\nimport { cubicOut } from 'svelte/easing';\n/**\n * A safe version of Svelte's slide transition that guards against NaN height values.\n *\n * When an element is inside an {#if} block and the condition becomes true,\n * Svelte tries to animate from height 0. If the element hasn't been measured yet,\n * offsetHeight can be 0 or undefined, leading to NaN in the animation.\n *\n * This wrapper checks if the element is measurable and skips the animation if not.\n */\nexport function safeSlide(node, params = {}) {\n const height = node.offsetHeight;\n const width = node.offsetWidth;\n if ((!height && !width) || !isFinite(height) || !isFinite(width)) {\n return {\n delay: params.delay || 0,\n duration: 0,\n css: () => '',\n };\n }\n return svelteSlide(node, params);\n}\n/**\n * Bloom-style dropdown animation.\n * Scales up from origin point with fade for a polished \"bloom\" effect.\n */\nexport function bloom(_node, { duration = 200, delay = 0, origin = 'top right' } = {}) {\n return {\n delay,\n duration,\n easing: cubicOut,\n css: (t) => {\n const scale = 0.95 + 0.05 * t;\n return `\n transform: scale(${scale});\n transform-origin: ${origin};\n opacity: ${t};\n `;\n },\n };\n}\n","<script>\n let { size = \"24\", color = \"currentColor\", class: className = \"\" } = $props();\n</script>\n\n<svg\n class={className}\n aria-hidden=\"true\"\n width={size}\n height={size}\n fill=\"none\"\n stroke={color}\n stroke-width=\"2\"\n viewBox=\"0 0 24 24\"\n xmlns=\"http://www.w3.org/2000/svg\"\n>\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M15.75 19.5L8.25 12l7.5-7.5\" />\r\n</svg>\r\n","<script>\n let { size = \"24\", color = \"currentColor\", class: className = \"\" } = $props();\n</script>\n\n<svg\n class={className}\n aria-hidden=\"true\"\n width={size}\n height={size}\n fill=\"none\"\n stroke={color}\n stroke-width=\"2\"\n viewBox=\"0 0 24 24\"\n xmlns=\"http://www.w3.org/2000/svg\"\n>\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M8.25 4.5l7.5 7.5-7.5 7.5\" />\r\n</svg>\r\n","<script>\n let { size = \"24\", color = \"currentColor\", class: className = \"\" } = $props();\n</script>\n\n<svg\n class={className}\n aria-hidden=\"true\"\n width={size}\n height={size}\n fill=\"none\"\n stroke={color}\n stroke-width=\"2\"\n viewBox=\"0 0 24 24\"\n xmlns=\"http://www.w3.org/2000/svg\"\n>\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M19.5 8.25l-7.5 7.5-7.5-7.5\" />\r\n</svg>\r\n","<script>\n let { size = \"24\", color = \"currentColor\", class: className = \"\" } = $props();\n</script>\n\n<svg\n class={className}\n aria-hidden=\"true\"\n width={size}\n height={size}\n fill=\"none\"\n stroke={color}\n stroke-width=\"2\"\n viewBox=\"0 0 24 24\"\n xmlns=\"http://www.w3.org/2000/svg\"\n>\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M4.5 15.75l7.5-7.5 7.5 7.5\" />\r\n</svg>\r\n","<script>\n let { size = \"24\", color = \"currentColor\", class: className = \"\" } = $props();\n</script>\n\n<svg\n class={className}\n aria-hidden=\"true\"\n width={size}\n height={size}\n fill=\"none\"\n stroke={color}\n stroke-width=\"2\"\n viewBox=\"0 0 24 24\"\n xmlns=\"http://www.w3.org/2000/svg\"\n>\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M6 18L18 6M6 6l12 12\" />\r\n</svg>\r\n","<script>\n let { size = \"24\", color = \"currentColor\", class: className = \"\" } = $props();\n</script>\n\n<svg\n class={className}\n aria-hidden=\"true\"\n width={size}\n height={size}\n fill=\"none\"\n stroke={color}\n stroke-width=\"2\"\n viewBox=\"0 0 24 24\"\n xmlns=\"http://www.w3.org/2000/svg\"\n>\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M4.5 12.75l6 6 9-13.5\" />\r\n</svg>\r\n","<script>\n let { size = \"24\", color = \"currentColor\", class: className = \"\" } = $props();\n</script>\n\n<svg\n class={className}\n aria-hidden=\"true\"\n width={size}\n height={size}\n fill=\"none\"\n stroke={color}\n stroke-width=\"1.5\"\n viewBox=\"0 0 24 24\"\n xmlns=\"http://www.w3.org/2000/svg\"\n>\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M7.217 10.907a2.25 2.25 0 100 2.186m0-2.186c.18.324.283.696.283 1.093s-.103.77-.283 1.093m0-2.186l9.566-5.314m-9.566 7.5l9.566 5.314m0 0a2.25 2.25 0 103.935 2.186 2.25 2.25 0 00-3.935-2.186zm0-12.814a2.25 2.25 0 103.933-2.185 2.25 2.25 0 00-3.933 2.185z\" />\r\n</svg>\r\n","<script>\n let { size = \"24\", color = \"currentColor\", class: className = \"\" } = $props();\n</script>\n\n<svg\n class={className}\n aria-hidden=\"true\"\n width={size}\n height={size}\n fill=\"none\"\n stroke={color}\n stroke-width=\"1.5\"\n viewBox=\"0 0 24 24\"\n xmlns=\"http://www.w3.org/2000/svg\"\n>\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M2.036 12.322a1.012 1.012 0 010-.639C3.423 7.51 7.36 4.5 12 4.5c4.638 0 8.573 3.007 9.963 7.178.07.207.07.431 0 .639C20.577 16.49 16.64 19.5 12 19.5c-4.638 0-8.573-3.007-9.963-7.178z\" />\r\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M15 12a3 3 0 11-6 0 3 3 0 016 0z\" />\r\n</svg>\r\n","<script>\n let { size = \"24\", color = \"currentColor\", class: className = \"\" } = $props();\n</script>\n\n<svg\n class={className}\n aria-hidden=\"true\"\n width={size}\n height={size}\n fill=\"none\"\n stroke={color}\n stroke-width=\"1.5\"\n viewBox=\"0 0 24 24\"\n xmlns=\"http://www.w3.org/2000/svg\"\n>\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M3.98 8.223A10.477 10.477 0 001.934 12C3.226 16.338 7.244 19.5 12 19.5c.993 0 1.953-.138 2.863-.395M6.228 6.228A10.45 10.45 0 0112 4.5c4.756 0 8.773 3.162 10.065 7.498a10.523 10.523 0 01-4.293 5.774M6.228 6.228L3 3m3.228 3.228l3.65 3.65m7.894 7.894L21 21m-3.228-3.228l-3.65-3.65m0 0a3 3 0 10-4.243-4.243m4.242 4.242L9.88 9.88\" />\r\n</svg>\r\n","<script>\n let { size = \"24\", color = \"currentColor\", class: className = \"\" } = $props();\n</script>\n\n<svg\n class={className}\n aria-hidden=\"true\"\n width={size}\n height={size}\n fill=\"none\"\n stroke={color}\n stroke-width=\"1.5\"\n viewBox=\"0 0 24 24\"\n xmlns=\"http://www.w3.org/2000/svg\"\n>\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9.75 9.75l4.5 4.5m0-4.5l-4.5 4.5M21 12a9 9 0 11-18 0 9 9 0 0118 0z\" />\r\n</svg>\r\n","<script>\n let { size = \"24\", color = \"currentColor\", class: className = \"\" } = $props();\n</script>\n\n<svg\n class={className}\n aria-hidden=\"true\"\n width={size}\n height={size}\n fill=\"none\"\n stroke={color}\n stroke-width=\"1.5\"\n viewBox=\"0 0 24 24\"\n xmlns=\"http://www.w3.org/2000/svg\"\n>\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M12 9v3.75m9-.75a9 9 0 11-18 0 9 9 0 0118 0zm-9 3.75h.008v.008H12v-.008z\" />\r\n</svg>\r\n","<script>\n let { size = \"24\", color = \"currentColor\", class: className = \"\" } = $props();\n</script>\n\n<svg\n class={className}\n aria-hidden=\"true\"\n width={size}\n height={size}\n fill=\"none\"\n stroke={color}\n stroke-width=\"1.5\"\n viewBox=\"0 0 24 24\"\n xmlns=\"http://www.w3.org/2000/svg\"\n>\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M12 9v3.75m-9.303 3.376c-.866 1.5.217 3.374 1.948 3.374h14.71c1.73 0 2.813-1.874 1.948-3.374L13.949 3.378c-.866-1.5-3.032-1.5-3.898 0L2.697 16.126zM12 15.75h.007v.008H12v-.008z\" />\r\n</svg>\r\n","<script>\n let { size = \"24\", color = \"currentColor\", class: className = \"\" } = $props();\n</script>\n\n<svg\n class={className}\n aria-hidden=\"true\"\n width={size}\n height={size}\n fill={color}\n viewBox=\"0 0 24 24\"\n xmlns=\"http://www.w3.org/2000/svg\"\n>\n <path d=\"M12 2.163c3.204 0 3.584.012 4.85.07 3.252.148 4.771 1.691 4.919 4.919.058 1.265.069 1.645.069 4.849 0 3.205-.012 3.584-.069 4.849-.149 3.225-1.664 4.771-4.919 4.919-1.266.058-1.644.07-4.85.07-3.204 0-3.584-.012-4.849-.07-3.26-.149-4.771-1.699-4.919-4.92-.058-1.265-.07-1.644-.07-4.849 0-3.204.013-3.583.07-4.849.149-3.227 1.664-4.771 4.919-4.919 1.266-.057 1.645-.069 4.849-.069zm0-2.163c-3.259 0-3.667.014-4.947.072-4.358.2-6.78 2.618-6.98 6.98-.059 1.281-.073 1.689-.073 4.948 0 3.259.014 3.668.072 4.948.2 4.358 2.618 6.78 6.98 6.98 1.281.058 1.689.072 4.948.072 3.259 0 3.668-.014 4.948-.072 4.354-.2 6.782-2.618 6.979-6.98.059-1.28.073-1.689.073-4.948 0-3.259-.014-3.667-.072-4.947-.196-4.354-2.617-6.78-6.979-6.98-1.281-.059-1.69-.073-4.949-.073zm0 5.838c-3.403 0-6.162 2.759-6.162 6.162s2.759 6.163 6.162 6.163 6.162-2.759 6.162-6.163c0-3.403-2.759-6.162-6.162-6.162zm0 10.162c-2.209 0-4-1.79-4-4 0-2.209 1.791-4 4-4s4 1.791 4 4c0 2.21-1.791 4-4 4zm6.406-11.845c-.796 0-1.441.645-1.441 1.44s.645 1.44 1.441 1.44c.795 0 1.439-.645 1.439-1.44s-.644-1.44-1.439-1.44z\" />\n</svg>\n","/**\n * Typography Design Tokens\n *\n * Centralized text styling classes to ensure consistency across all Micdrop apps.\n * Import and use these instead of writing raw Tailwind classes for text.\n *\n * @example\n * ```svelte\n * <script>\n * import { typography } from '@getmicdrop/svelte-components';\n * </script>\n *\n * <h1 class={typography.h1}>Page Title</h1>\n * <p class={typography.body}>Content here</p>\n * <span class={typography.muted}>Helper text</span>\n * ```\n */\nexport const typography = {\n // ==========================================================================\n // HEADINGS\n // ==========================================================================\n /** Page title - 2xl semibold */\n h1: \"text-2xl font-semibold text-gray-900 dark:text-white\",\n /** Section title - xl semibold */\n h2: \"text-xl font-semibold text-gray-900 dark:text-white\",\n /** Subsection title - lg semibold */\n h3: \"text-lg font-semibold text-gray-900 dark:text-white\",\n /** Card/group title - base semibold */\n h4: \"text-base font-semibold text-gray-900 dark:text-white\",\n /** Small title - sm semibold */\n h5: \"text-sm font-semibold text-gray-900 dark:text-white\",\n /** Micro title - xs semibold */\n h6: \"text-xs font-semibold text-gray-900 dark:text-white\",\n // ==========================================================================\n // BODY TEXT\n // ==========================================================================\n /** Standard body text */\n body: \"text-base text-gray-900 dark:text-white leading-relaxed\",\n /** Body text - muted/secondary */\n bodyMuted: \"text-base text-gray-500 dark:text-gray-400 leading-relaxed\",\n /** Small body text */\n sm: \"text-sm text-gray-900 dark:text-white\",\n /** Small text - muted/secondary */\n smMuted: \"text-sm text-gray-500 dark:text-gray-400\",\n /** Extra small text */\n xs: \"text-xs text-gray-900 dark:text-white\",\n /** Extra small text - muted */\n xsMuted: \"text-xs text-gray-500 dark:text-gray-400\",\n /** Muted text color only (no size) - for applying to elements with other size classes */\n textMuted: \"text-gray-500 dark:text-gray-400\",\n /** Muted icon color - same as textMuted, for semantic clarity */\n iconMuted: \"text-gray-500 dark:text-gray-400\",\n // ==========================================================================\n // LABELS & FORM TEXT\n // ==========================================================================\n /** Form field label */\n label: \"text-sm font-medium text-gray-900 dark:text-white\",\n /** Form field label - with standard spacing */\n labelSpaced: \"text-sm font-medium text-gray-900 dark:text-white mb-2\",\n /** Helper/description text below inputs */\n helper: \"text-sm text-gray-500 dark:text-gray-400\",\n /** Placeholder-style text */\n placeholder: \"text-sm text-gray-400 dark:text-gray-500\",\n // ==========================================================================\n // STATUS & FEEDBACK\n // ==========================================================================\n /** Error message text */\n error: \"text-sm text-red-500 dark:text-red-400\",\n /** Success message text */\n success: \"text-sm text-green-600 dark:text-green-400\",\n /** Warning message text */\n warning: \"text-sm text-yellow-600 dark:text-yellow-400\",\n /** Info message text */\n info: \"text-sm text-blue-600 dark:text-blue-400\",\n // ==========================================================================\n // LINKS\n // ==========================================================================\n /** Standard link */\n link: \"text-sm text-blue-700 dark:text-blue-500 hover:underline\",\n /** Muted/subtle link */\n linkMuted: \"text-sm text-gray-500 dark:text-gray-400 hover:text-gray-700 dark:hover:text-gray-300\",\n // ==========================================================================\n // SPECIAL CASES\n // ==========================================================================\n /** Price/currency display */\n price: \"text-lg font-semibold text-gray-900 dark:text-white\",\n /** Large price display */\n priceLg: \"text-2xl font-bold text-gray-900 dark:text-white\",\n /** Badge/tag text */\n badge: \"text-xs font-medium\",\n /** Table header */\n tableHeader: \"text-xs font-semibold text-gray-500 dark:text-gray-400 uppercase tracking-wider\",\n /** Code/monospace */\n code: \"text-sm font-mono text-gray-900 dark:text-white\",\n /** Muted code */\n codeMuted: \"text-xs font-mono text-gray-500 dark:text-gray-400\",\n};\n","/**\n * Shared Color Variant Classes\n *\n * Centralized Tailwind class definitions for semantic color variants.\n * Used across Badge, Alert, Spinner, and other status-indicating components.\n *\n * This eliminates duplication of color variant switch statements across components.\n */\n/**\n * Semantic color variants for badges/status indicators.\n * Pattern: text color + background color with dark mode support.\n */\nexport const badgeColorVariants = {\n // Semantic variants\n success: 'text-green-800 bg-green-100 dark:bg-green-900 dark:text-green-300',\n warning: 'text-yellow-800 bg-yellow-100 dark:bg-yellow-900 dark:text-yellow-300',\n error: 'text-red-800 bg-red-100 dark:bg-red-900 dark:text-red-300',\n danger: 'text-red-800 bg-red-100 dark:bg-red-900 dark:text-red-300',\n info: 'text-blue-800 bg-blue-100 dark:bg-blue-900 dark:text-blue-300',\n neutral: 'text-gray-800 bg-gray-100 dark:bg-gray-700 dark:text-gray-300',\n // Color variants\n red: 'text-red-800 bg-red-100 dark:bg-red-900 dark:text-red-300',\n blue: 'text-blue-800 bg-blue-100 dark:bg-blue-900 dark:text-blue-300',\n purple: 'text-purple-800 bg-purple-100 dark:bg-purple-900 dark:text-purple-300',\n green: 'text-green-800 bg-green-100 dark:bg-green-900 dark:text-green-300',\n orange: 'text-orange-800 bg-orange-100 dark:bg-orange-900 dark:text-orange-300',\n yellow: 'text-yellow-800 bg-yellow-100 dark:bg-yellow-900 dark:text-yellow-300',\n gray: 'text-gray-800 bg-gray-100 dark:bg-gray-700 dark:text-gray-300',\n pink: 'text-pink-800 bg-pink-100 dark:bg-pink-900 dark:text-pink-300',\n indigo: 'text-indigo-800 bg-indigo-100 dark:bg-indigo-900 dark:text-indigo-300',\n cyan: 'text-cyan-800 bg-cyan-100 dark:bg-cyan-900 dark:text-cyan-300',\n // Special variants\n notification: 'text-white bg-red-500 dark:bg-red-600',\n};\n/**\n * Alert color variants - slightly different pattern (uses bg-*-50).\n */\nexport const alertColorVariants = {\n info: 'text-blue-800 bg-blue-50 dark:bg-gray-800 dark:text-blue-400',\n success: 'text-green-800 bg-green-50 dark:bg-gray-800 dark:text-green-400',\n warning: 'text-yellow-800 bg-yellow-50 dark:bg-gray-800 dark:text-yellow-300',\n danger: 'text-red-800 bg-red-50 dark:bg-gray-800 dark:text-red-400',\n};\n/**\n * Alert close button color variants - specific hover states per type.\n */\nexport const alertCloseButtonVariants = {\n info: 'bg-blue-50 text-blue-500 hover:bg-blue-200 dark:bg-gray-800 dark:text-blue-400 dark:hover:bg-gray-700',\n success: 'bg-green-50 text-green-500 hover:bg-green-200 dark:bg-gray-800 dark:text-green-400 dark:hover:bg-gray-700',\n warning: 'bg-yellow-50 text-yellow-500 hover:bg-yellow-200 dark:bg-gray-800 dark:text-yellow-300 dark:hover:bg-gray-700',\n danger: 'bg-red-50 text-red-500 hover:bg-red-200 dark:bg-gray-800 dark:text-red-400 dark:hover:bg-gray-700',\n};\n/**\n * Spinner fill color variants.\n */\nexport const spinnerColorVariants = {\n blue: 'fill-blue-600',\n gray: 'fill-gray-600 dark:fill-gray-300',\n green: 'fill-green-500',\n red: 'fill-red-600',\n yellow: 'fill-yellow-400',\n pink: 'fill-pink-600',\n purple: 'fill-purple-600',\n white: 'fill-white',\n};\n/**\n * Helper to get badge variant classes with fallback.\n */\nexport function getBadgeVariantClasses(variant) {\n const normalized = String(variant || 'neutral').toLowerCase();\n return (badgeColorVariants[normalized] ||\n badgeColorVariants.neutral);\n}\n/**\n * Helper to get alert variant classes with fallback.\n */\nexport function getAlertVariantClasses(variant) {\n const normalized = String(variant || 'info').toLowerCase();\n return (alertColorVariants[normalized] ||\n alertColorVariants.info);\n}\n/**\n * Helper to get spinner color classes with fallback.\n */\nexport function getSpinnerColorClasses(color) {\n const normalized = String(color || 'blue').toLowerCase();\n return (spinnerColorVariants[normalized] ||\n spinnerColorVariants.blue);\n}\n","/**\n * Concatenates two arrays faster than the array spread operator.\n */\nconst concatArrays = (array1, array2) => {\n // Pre-allocate for better V8 optimization\n const combinedArray = new Array(array1.length + array2.length);\n for (let i = 0; i < array1.length; i++) {\n combinedArray[i] = array1[i];\n }\n for (let i = 0; i < array2.length; i++) {\n combinedArray[array1.length + i] = array2[i];\n }\n return combinedArray;\n};\n\n// Factory function ensures consistent object shapes\nconst createClassValidatorObject = (classGroupId, validator) => ({\n classGroupId,\n validator\n});\n// Factory ensures consistent ClassPartObject shape\nconst createClassPartObject = (nextPart = new Map(), validators = null, classGroupId) => ({\n nextPart,\n validators,\n classGroupId\n});\nconst CLASS_PART_SEPARATOR = '-';\nconst EMPTY_CONFLICTS = [];\n// I use two dots here because one dot is used as prefix for class groups in plugins\nconst ARBITRARY_PROPERTY_PREFIX = 'arbitrary..';\nconst createClassGroupUtils = config => {\n const classMap = createClassMap(config);\n const {\n conflictingClassGroups,\n conflictingClassGroupModifiers\n } = config;\n const getClassGroupId = className => {\n if (className.startsWith('[') && className.endsWith(']')) {\n return getGroupIdForArbitraryProperty(className);\n }\n const classParts = className.split(CLASS_PART_SEPARATOR);\n // Classes like `-inset-1` produce an empty string as first classPart. We assume that classes for negative values are used correctly and skip it.\n const startIndex = classParts[0] === '' && classParts.length > 1 ? 1 : 0;\n return getGroupRecursive(classParts, startIndex, classMap);\n };\n const getConflictingClassGroupIds = (classGroupId, hasPostfixModifier) => {\n if (hasPostfixModifier) {\n const modifierConflicts = conflictingClassGroupModifiers[classGroupId];\n const baseConflicts = conflictingClassGroups[classGroupId];\n if (modifierConflicts) {\n if (baseConflicts) {\n // Merge base conflicts with modifier conflicts\n return concatArrays(baseConflicts, modifierConflicts);\n }\n // Only modifier conflicts\n return modifierConflicts;\n }\n // Fall back to without postfix if no modifier conflicts\n return baseConflicts || EMPTY_CONFLICTS;\n }\n return conflictingClassGroups[classGroupId] || EMPTY_CONFLICTS;\n };\n return {\n getClassGroupId,\n getConflictingClassGroupIds\n };\n};\nconst getGroupRecursive = (classParts, startIndex, classPartObject) => {\n const classPathsLength = classParts.length - startIndex;\n if (classPathsLength === 0) {\n return classPartObject.classGroupId;\n }\n const currentClassPart = classParts[startIndex];\n const nextClassPartObject = classPartObject.nextPart.get(currentClassPart);\n if (nextClassPartObject) {\n const result = getGroupRecursive(classParts, startIndex + 1, nextClassPartObject);\n if (result) return result;\n }\n const validators = classPartObject.validators;\n if (validators === null) {\n return undefined;\n }\n // Build classRest string efficiently by joining from startIndex onwards\n const classRest = startIndex === 0 ? classParts.join(CLASS_PART_SEPARATOR) : classParts.slice(startIndex).join(CLASS_PART_SEPARATOR);\n const validatorsLength = validators.length;\n for (let i = 0; i < validatorsLength; i++) {\n const validatorObj = validators[i];\n if (validatorObj.validator(classRest)) {\n return validatorObj.classGroupId;\n }\n }\n return undefined;\n};\n/**\n * Get the class group ID for an arbitrary property.\n *\n * @param className - The class name to get the group ID for. Is expected to be string starting with `[` and ending with `]`.\n */\nconst getGroupIdForArbitraryProperty = className => className.slice(1, -1).indexOf(':') === -1 ? undefined : (() => {\n const content = className.slice(1, -1);\n const colonIndex = content.indexOf(':');\n const property = content.slice(0, colonIndex);\n return property ? ARBITRARY_PROPERTY_PREFIX + property : undefined;\n})();\n/**\n * Exported for testing only\n */\nconst createClassMap = config => {\n const {\n theme,\n classGroups\n } = config;\n return processClassGroups(classGroups, theme);\n};\n// Split into separate functions to maintain monomorphic call sites\nconst processClassGroups = (classGroups, theme) => {\n const classMap = createClassPartObject();\n for (const classGroupId in classGroups) {\n const group = classGroups[classGroupId];\n processClassesRecursively(group, classMap, classGroupId, theme);\n }\n return classMap;\n};\nconst processClassesRecursively = (classGroup, classPartObject, classGroupId, theme) => {\n const len = classGroup.length;\n for (let i = 0; i < len; i++) {\n const classDefinition = classGroup[i];\n processClassDefinition(classDefinition, classPartObject, classGroupId, theme);\n }\n};\n// Split into separate functions for each type to maintain monomorphic call sites\nconst processClassDefinition = (classDefinition, classPartObject, classGroupId, theme) => {\n if (typeof classDefinition === 'string') {\n processStringDefinition(classDefinition, classPartObject, classGroupId);\n return;\n }\n if (typeof classDefinition === 'function') {\n processFunctionDefinition(classDefinition, classPartObject, classGroupId, theme);\n return;\n }\n processObjectDefinition(classDefinition, classPartObject, classGroupId, theme);\n};\nconst processStringDefinition = (classDefinition, classPartObject, classGroupId) => {\n const classPartObjectToEdit = classDefinition === '' ? classPartObject : getPart(classPartObject, classDefinition);\n classPartObjectToEdit.classGroupId = classGroupId;\n};\nconst processFunctionDefinition = (classDefinition, classPartObject, classGroupId, theme) => {\n if (isThemeGetter(classDefinition)) {\n processClassesRecursively(classDefinition(theme), classPartObject, classGroupId, theme);\n return;\n }\n if (classPartObject.validators === null) {\n classPartObject.validators = [];\n }\n classPartObject.validators.push(createClassValidatorObject(classGroupId, classDefinition));\n};\nconst processObjectDefinition = (classDefinition, classPartObject, classGroupId, theme) => {\n const entries = Object.entries(classDefinition);\n const len = entries.length;\n for (let i = 0; i < len; i++) {\n const [key, value] = entries[i];\n processClassesRecursively(value, getPart(classPartObject, key), classGroupId, theme);\n }\n};\nconst getPart = (classPartObject, path) => {\n let current = classPartObject;\n const parts = path.split(CLASS_PART_SEPARATOR);\n const len = parts.length;\n for (let i = 0; i < len; i++) {\n const part = parts[i];\n let next = current.nextPart.get(part);\n if (!next) {\n next = createClassPartObject();\n current.nextPart.set(part, next);\n }\n current = next;\n }\n return current;\n};\n// Type guard maintains monomorphic check\nconst isThemeGetter = func => 'isThemeGetter' in func && func.isThemeGetter === true;\n\n// LRU cache implementation using plain objects for simplicity\nconst createLruCache = maxCacheSize => {\n if (maxCacheSize < 1) {\n return {\n get: () => undefined,\n set: () => {}\n };\n }\n let cacheSize = 0;\n let cache = Object.create(null);\n let previousCache = Object.create(null);\n const update = (key, value) => {\n cache[key] = value;\n cacheSize++;\n if (cacheSize > maxCacheSize) {\n cacheSize = 0;\n previousCache = cache;\n cache = Object.create(null);\n }\n };\n return {\n get(key) {\n let value = cache[key];\n if (value !== undefined) {\n return value;\n }\n if ((value = previousCache[key]) !== undefined) {\n update(key, value);\n return value;\n }\n },\n set(key, value) {\n if (key in cache) {\n cache[key] = value;\n } else {\n update(key, value);\n }\n }\n };\n};\nconst IMPORTANT_MODIFIER = '!';\nconst MODIFIER_SEPARATOR = ':';\nconst EMPTY_MODIFIERS = [];\n// Pre-allocated result object shape for consistency\nconst createResultObject = (modifiers, hasImportantModifier, baseClassName, maybePostfixModifierPosition, isExternal) => ({\n modifiers,\n hasImportantModifier,\n baseClassName,\n maybePostfixModifierPosition,\n isExternal\n});\nconst createParseClassName = config => {\n const {\n prefix,\n experimentalParseClassName\n } = config;\n /**\n * Parse class name into parts.\n *\n * Inspired by `splitAtTopLevelOnly` used in Tailwind CSS\n * @see https://github.com/tailwindlabs/tailwindcss/blob/v3.2.2/src/util/splitAtTopLevelOnly.js\n */\n let parseClassName = className => {\n // Use simple array with push for better performance\n const modifiers = [];\n let bracketDepth = 0;\n let parenDepth = 0;\n let modifierStart = 0;\n let postfixModifierPosition;\n const len = className.length;\n for (let index = 0; index < len; index++) {\n const currentCharacter = className[index];\n if (bracketDepth === 0 && parenDepth === 0) {\n if (currentCharacter === MODIFIER_SEPARATOR) {\n modifiers.push(className.slice(modifierStart, index));\n modifierStart = index + 1;\n continue;\n }\n if (currentCharacter === '/') {\n postfixModifierPosition = index;\n continue;\n }\n }\n if (currentCharacter === '[') bracketDepth++;else if (currentCharacter === ']') bracketDepth--;else if (currentCharacter === '(') parenDepth++;else if (currentCharacter === ')') parenDepth--;\n }\n const baseClassNameWithImportantModifier = modifiers.length === 0 ? className : className.slice(modifierStart);\n // Inline important modifier check\n let baseClassName = baseClassNameWithImportantModifier;\n let hasImportantModifier = false;\n if (baseClassNameWithImportantModifier.endsWith(IMPORTANT_MODIFIER)) {\n baseClassName = baseClassNameWithImportantModifier.slice(0, -1);\n hasImportantModifier = true;\n } else if (\n /**\n * In Tailwind CSS v3 the important modifier was at the start of the base class name. This is still supported for legacy reasons.\n * @see https://github.com/dcastil/tailwind-merge/issues/513#issuecomment-2614029864\n */\n baseClassNameWithImportantModifier.startsWith(IMPORTANT_MODIFIER)) {\n baseClassName = baseClassNameWithImportantModifier.slice(1);\n hasImportantModifier = true;\n }\n const maybePostfixModifierPosition = postfixModifierPosition && postfixModifierPosition > modifierStart ? postfixModifierPosition - modifierStart : undefined;\n return createResultObject(modifiers, hasImportantModifier, baseClassName, maybePostfixModifierPosition);\n };\n if (prefix) {\n const fullPrefix = prefix + MODIFIER_SEPARATOR;\n const parseClassNameOriginal = parseClassName;\n parseClassName = className => className.startsWith(fullPrefix) ? parseClassNameOriginal(className.slice(fullPrefix.length)) : createResultObject(EMPTY_MODIFIERS, false, className, undefined, true);\n }\n if (experimentalParseClassName) {\n const parseClassNameOriginal = parseClassName;\n parseClassName = className => experimentalParseClassName({\n className,\n parseClassName: parseClassNameOriginal\n });\n }\n return parseClassName;\n};\n\n/**\n * Sorts modifiers according to following schema:\n * - Predefined modifiers are sorted alphabetically\n * - When an arbitrary variant appears, it must be preserved which modifiers are before and after it\n */\nconst createSortModifiers = config => {\n // Pre-compute weights for all known modifiers for O(1) comparison\n const modifierWeights = new Map();\n // Assign weights to sensitive modifiers (highest priority, but preserve order)\n config.orderSensitiveModifiers.forEach((mod, index) => {\n modifierWeights.set(mod, 1000000 + index); // High weights for sensitive mods\n });\n return modifiers => {\n const result = [];\n let currentSegment = [];\n // Process modifiers in one pass\n for (let i = 0; i < modifiers.length; i++) {\n const modifier = modifiers[i];\n // Check if modifier is sensitive (starts with '[' or in orderSensitiveModifiers)\n const isArbitrary = modifier[0] === '[';\n const isOrderSensitive = modifierWeights.has(modifier);\n if (isArbitrary || isOrderSensitive) {\n // Sort and flush current segment alphabetically\n if (currentSegment.length > 0) {\n currentSegment.sort();\n result.push(...currentSegment);\n currentSegment = [];\n }\n result.push(modifier);\n } else {\n // Regular modifier - add to current segment for batch sorting\n currentSegment.push(modifier);\n }\n }\n // Sort and add any remaining segment items\n if (currentSegment.length > 0) {\n currentSegment.sort();\n result.push(...currentSegment);\n }\n return result;\n };\n};\nconst createConfigUtils = config => ({\n cache: createLruCache(config.cacheSize),\n parseClassName: createParseClassName(config),\n sortModifiers: createSortModifiers(config),\n ...createClassGroupUtils(config)\n});\nconst SPLIT_CLASSES_REGEX = /\\s+/;\nconst mergeClassList = (classList, configUtils) => {\n const {\n parseClassName,\n getClassGroupId,\n getConflictingClassGroupIds,\n sortModifiers\n } = configUtils;\n /**\n * Set of classGroupIds in following format:\n * `{importantModifier}{variantModifiers}{classGroupId}`\n * @example 'float'\n * @example 'hover:focus:bg-color'\n * @example 'md:!pr'\n */\n const classGroupsInConflict = [];\n const classNames = classList.trim().split(SPLIT_CLASSES_REGEX);\n let result = '';\n for (let index = classNames.length - 1; index >= 0; index -= 1) {\n const originalClassName = classNames[index];\n const {\n isExternal,\n modifiers,\n hasImportantModifier,\n baseClassName,\n maybePostfixModifierPosition\n } = parseClassName(originalClassName);\n if (isExternal) {\n result = originalClassName + (result.length > 0 ? ' ' + result : result);\n continue;\n }\n let hasPostfixModifier = !!maybePostfixModifierPosition;\n let classGroupId = getClassGroupId(hasPostfixModifier ? baseClassName.substring(0, maybePostfixModifierPosition) : baseClassName);\n if (!classGroupId) {\n if (!hasPostfixModifier) {\n // Not a Tailwind class\n result = originalClassName + (result.length > 0 ? ' ' + result : result);\n continue;\n }\n classGroupId = getClassGroupId(baseClassName);\n if (!classGroupId) {\n // Not a Tailwind class\n result = originalClassName + (result.length > 0 ? ' ' + result : result);\n continue;\n }\n hasPostfixModifier = false;\n }\n // Fast path: skip sorting for empty or single modifier\n const variantModifier = modifiers.length === 0 ? '' : modifiers.length === 1 ? modifiers[0] : sortModifiers(modifiers).join(':');\n const modifierId = hasImportantModifier ? variantModifier + IMPORTANT_MODIFIER : variantModifier;\n const classId = modifierId + classGroupId;\n if (classGroupsInConflict.indexOf(classId) > -1) {\n // Tailwind class omitted due to conflict\n continue;\n }\n classGroupsInConflict.push(classId);\n const conflictGroups = getConflictingClassGroupIds(classGroupId, hasPostfixModifier);\n for (let i = 0; i < conflictGroups.length; ++i) {\n const group = conflictGroups[i];\n classGroupsInConflict.push(modifierId + group);\n }\n // Tailwind class not in conflict\n result = originalClassName + (result.length > 0 ? ' ' + result : result);\n }\n return result;\n};\n\n/**\n * The code in this file is copied from https://github.com/lukeed/clsx and modified to suit the needs of tailwind-merge better.\n *\n * Specifically:\n * - Runtime code from https://github.com/lukeed/clsx/blob/v1.2.1/src/index.js\n * - TypeScript types from https://github.com/lukeed/clsx/blob/v1.2.1/clsx.d.ts\n *\n * Original code has MIT license: Copyright (c) Luke Edwards <luke.edwards05@gmail.com> (lukeed.com)\n */\nconst twJoin = (...classLists) => {\n let index = 0;\n let argument;\n let resolvedValue;\n let string = '';\n while (index < classLists.length) {\n if (argument = classLists[index++]) {\n if (resolvedValue = toValue(argument)) {\n string && (string += ' ');\n string += resolvedValue;\n }\n }\n }\n return string;\n};\nconst toValue = mix => {\n // Fast path for strings\n if (typeof mix === 'string') {\n return mix;\n }\n let resolvedValue;\n let string = '';\n for (let k = 0; k < mix.length; k++) {\n if (mix[k]) {\n if (resolvedValue = toValue(mix[k])) {\n string && (string += ' ');\n string += resolvedValue;\n }\n }\n }\n return string;\n};\nconst createTailwindMerge = (createConfigFirst, ...createConfigRest) => {\n let configUtils;\n let cacheGet;\n let cacheSet;\n let functionToCall;\n const initTailwindMerge = classList => {\n const config = createConfigRest.reduce((previousConfig, createConfigCurrent) => createConfigCurrent(previousConfig), createConfigFirst());\n configUtils = createConfigUtils(config);\n cacheGet = configUtils.cache.get;\n cacheSet = configUtils.cache.set;\n functionToCall = tailwindMerge;\n return tailwindMerge(classList);\n };\n const tailwindMerge = classList => {\n const cachedResult = cacheGet(classList);\n if (cachedResult) {\n return cachedResult;\n }\n const result = mergeClassList(classList, configUtils);\n cacheSet(classList, result);\n return result;\n };\n functionToCall = initTailwindMerge;\n return (...args) => functionToCall(twJoin(...args));\n};\nconst fallbackThemeArr = [];\nconst fromTheme = key => {\n const themeGetter = theme => theme[key] || fallbackThemeArr;\n themeGetter.isThemeGetter = true;\n return themeGetter;\n};\nconst arbitraryValueRegex = /^\\[(?:(\\w[\\w-]*):)?(.+)\\]$/i;\nconst arbitraryVariableRegex = /^\\((?:(\\w[\\w-]*):)?(.+)\\)$/i;\nconst fractionRegex = /^\\d+(?:\\.\\d+)?\\/\\d+(?:\\.\\d+)?$/;\nconst tshirtUnitRegex = /^(\\d+(\\.\\d+)?)?(xs|sm|md|lg|xl)$/;\nconst lengthUnitRegex = /\\d+(%|px|r?em|[sdl]?v([hwib]|min|max)|pt|pc|in|cm|mm|cap|ch|ex|r?lh|cq(w|h|i|b|min|max))|\\b(calc|min|max|clamp)\\(.+\\)|^0$/;\nconst colorFunctionRegex = /^(rgba?|hsla?|hwb|(ok)?(lab|lch)|color-mix)\\(.+\\)$/;\n// Shadow always begins with x and y offset separated by underscore optionally prepended by inset\nconst shadowRegex = /^(inset_)?-?((\\d+)?\\.?(\\d+)[a-z]+|0)_-?((\\d+)?\\.?(\\d+)[a-z]+|0)/;\nconst imageRegex = /^(url|image|image-set|cross-fade|element|(repeating-)?(linear|radial|conic)-gradient)\\(.+\\)$/;\nconst isFraction = value => fractionRegex.test(value);\nconst isNumber = value => !!value && !Number.isNaN(Number(value));\nconst isInteger = value => !!value && Number.isInteger(Number(value));\nconst isPercent = value => value.endsWith('%') && isNumber(value.slice(0, -1));\nconst isTshirtSize = value => tshirtUnitRegex.test(value);\nconst isAny = () => true;\nconst isLengthOnly = value =>\n// `colorFunctionRegex` check is necessary because color functions can have percentages in them which which would be incorrectly classified as lengths.\n// For example, `hsl(0 0% 0%)` would be classified as a length without this check.\n// I could also use lookbehind assertion in `lengthUnitRegex` but that isn't supported widely enough.\nlengthUnitRegex.test(value) && !colorFunctionRegex.test(value);\nconst isNever = () => false;\nconst isShadow = value => shadowRegex.test(value);\nconst isImage = value => imageRegex.test(value);\nconst isAnyNonArbitrary = value => !isArbitraryValue(value) && !isArbitraryVariable(value);\nconst isArbitrarySize = value => getIsArbitraryValue(value, isLabelSize, isNever);\nconst isArbitraryValue = value => arbitraryValueRegex.test(value);\nconst isArbitraryLength = value => getIsArbitraryValue(value, isLabelLength, isLengthOnly);\nconst isArbitraryNumber = value => getIsArbitraryValue(value, isLabelNumber, isNumber);\nconst isArbitraryWeight = value => getIsArbitraryValue(value, isLabelWeight, isAny);\nconst isArbitraryFamilyName = value => getIsArbitraryValue(value, isLabelFamilyName, isNever);\nconst isArbitraryPosition = value => getIsArbitraryValue(value, isLabelPosition, isNever);\nconst isArbitraryImage = value => getIsArbitraryValue(value, isLabelImage, isImage);\nconst isArbitraryShadow = value => getIsArbitraryValue(value, isLabelShadow, isShadow);\nconst isArbitraryVariable = value => arbitraryVariableRegex.test(value);\nconst isArbitraryVariableLength = value => getIsArbitraryVariable(value, isLabelLength);\nconst isArbitraryVariableFamilyName = value => getIsArbitraryVariable(value, isLabelFamilyName);\nconst isArbitraryVariablePosition = value => getIsArbitraryVariable(value, isLabelPosition);\nconst isArbitraryVariableSize = value => getIsArbitraryVariable(value, isLabelSize);\nconst isArbitraryVariableImage = value => getIsArbitraryVariable(value, isLabelImage);\nconst isArbitraryVariableShadow = value => getIsArbitraryVariable(value, isLabelShadow, true);\nconst isArbitraryVariableWeight = value => getIsArbitraryVariable(value, isLabelWeight, true);\n// Helpers\nconst getIsArbitraryValue = (value, testLabel, testValue) => {\n const result = arbitraryValueRegex.exec(value);\n if (result) {\n if (result[1]) {\n return testLabel(result[1]);\n }\n return testValue(result[2]);\n }\n return false;\n};\nconst getIsArbitraryVariable = (value, testLabel, shouldMatchNoLabel = false) => {\n const result = arbitraryVariableRegex.exec(value);\n if (result) {\n if (result[1]) {\n return testLabel(result[1]);\n }\n return shouldMatchNoLabel;\n }\n return false;\n};\n// Labels\nconst isLabelPosition = label => label === 'position' || label === 'percentage';\nconst isLabelImage = label => label === 'image' || label === 'url';\nconst isLabelSize = label => label === 'length' || label === 'size' || label === 'bg-size';\nconst isLabelLength = label => label === 'length';\nconst isLabelNumber = label => label === 'number';\nconst isLabelFamilyName = label => label === 'family-name';\nconst isLabelWeight = label => label === 'number' || label === 'weight';\nconst isLabelShadow = label => label === 'shadow';\nconst validators = /*#__PURE__*/Object.defineProperty({\n __proto__: null,\n isAny,\n isAnyNonArbitrary,\n isArbitraryFamilyName,\n isArbitraryImage,\n isArbitraryLength,\n isArbitraryNumber,\n isArbitraryPosition,\n isArbitraryShadow,\n isArbitrarySize,\n isArbitraryValue,\n isArbitraryVariable,\n isArbitraryVariableFamilyName,\n isArbitraryVariableImage,\n isArbitraryVariableLength,\n isArbitraryVariablePosition,\n isArbitraryVariableShadow,\n isArbitraryVariableSize,\n isArbitraryVariableWeight,\n isArbitraryWeight,\n isFraction,\n isInteger,\n isNumber,\n isPercent,\n isTshirtSize\n}, Symbol.toStringTag, {\n value: 'Module'\n});\nconst getDefaultConfig = () => {\n /**\n * Theme getters for theme variable namespaces\n * @see https://tailwindcss.com/docs/theme#theme-variable-namespaces\n */\n /***/\n const themeColor = fromTheme('color');\n const themeFont = fromTheme('font');\n const themeText = fromTheme('text');\n const themeFontWeight = fromTheme('font-weight');\n const themeTracking = fromTheme('tracking');\n const themeLeading = fromTheme('leading');\n const themeBreakpoint = fromTheme('breakpoint');\n const themeContainer = fromTheme('container');\n const themeSpacing = fromTheme('spacing');\n const themeRadius = fromTheme('radius');\n const themeShadow = fromTheme('shadow');\n const themeInsetShadow = fromTheme('inset-shadow');\n const themeTextShadow = fromTheme('text-shadow');\n const themeDropShadow = fromTheme('drop-shadow');\n const themeBlur = fromTheme('blur');\n const themePerspective = fromTheme('perspective');\n const themeAspect = fromTheme('aspect');\n const themeEase = fromTheme('ease');\n const themeAnimate = fromTheme('animate');\n /**\n * Helpers to avoid repeating the same scales\n *\n * We use functions that create a new array every time they're called instead of static arrays.\n * This ensures that users who modify any scale by mutating the array (e.g. with `array.push(element)`) don't accidentally mutate arrays in other parts of the config.\n */\n /***/\n const scaleBreak = () => ['auto', 'avoid', 'all', 'avoid-page', 'page', 'left', 'right', 'column'];\n const scalePosition = () => ['center', 'top', 'bottom', 'left', 'right', 'top-left',\n // Deprecated since Tailwind CSS v4.1.0, see https://github.com/tailwindlabs/tailwindcss/pull/17378\n 'left-top', 'top-right',\n // Deprecated since Tailwind CSS v4.1.0, see https://github.com/tailwindlabs/tailwindcss/pull/17378\n 'right-top', 'bottom-right',\n // Deprecated since Tailwind CSS v4.1.0, see https://github.com/tailwindlabs/tailwindcss/pull/17378\n 'right-bottom', 'bottom-left',\n // Deprecated since Tailwind CSS v4.1.0, see https://github.com/tailwindlabs/tailwindcss/pull/17378\n 'left-bottom'];\n const scalePositionWithArbitrary = () => [...scalePosition(), isArbitraryVariable, isArbitraryValue];\n const scaleOverflow = () => ['auto', 'hidden', 'clip', 'visible', 'scroll'];\n const scaleOverscroll = () => ['auto', 'contain', 'none'];\n const scaleUnambiguousSpacing = () => [isArbitraryVariable, isArbitraryValue, themeSpacing];\n const scaleInset = () => [isFraction, 'full', 'auto', ...scaleUnambiguousSpacing()];\n const scaleGridTemplateColsRows = () => [isInteger, 'none', 'subgrid', isArbitraryVariable, isArbitraryValue];\n const scaleGridColRowStartAndEnd = () => ['auto', {\n span: ['full', isInteger, isArbitraryVariable, isArbitraryValue]\n }, isInteger, isArbitraryVariable, isArbitraryValue];\n const scaleGridColRowStartOrEnd = () => [isInteger, 'auto', isArbitraryVariable, isArbitraryValue];\n const scaleGridAutoColsRows = () => ['auto', 'min', 'max', 'fr', isArbitraryVariable, isArbitraryValue];\n const scaleAlignPrimaryAxis = () => ['start', 'end', 'center', 'between', 'around', 'evenly', 'stretch', 'baseline', 'center-safe', 'end-safe'];\n const scaleAlignSecondaryAxis = () => ['start', 'end', 'center', 'stretch', 'center-safe', 'end-safe'];\n const scaleMargin = () => ['auto', ...scaleUnambiguousSpacing()];\n const scaleSizing = () => [isFraction, 'auto', 'full', 'dvw', 'dvh', 'lvw', 'lvh', 'svw', 'svh', 'min', 'max', 'fit', ...scaleUnambiguousSpacing()];\n const scaleSizingInline = () => [isFraction, 'screen', 'full', 'dvw', 'lvw', 'svw', 'min', 'max', 'fit', ...scaleUnambiguousSpacing()];\n const scaleSizingBlock = () => [isFraction, 'screen', 'full', 'lh', 'dvh', 'lvh', 'svh', 'min', 'max', 'fit', ...scaleUnambiguousSpacing()];\n const scaleColor = () => [themeColor, isArbitraryVariable, isArbitraryValue];\n const scaleBgPosition = () => [...scalePosition(), isArbitraryVariablePosition, isArbitraryPosition, {\n position: [isArbitraryVariable, isArbitraryValue]\n }];\n const scaleBgRepeat = () => ['no-repeat', {\n repeat: ['', 'x', 'y', 'space', 'round']\n }];\n const scaleBgSize = () => ['auto', 'cover', 'contain', isArbitraryVariableSize, isArbitrarySize, {\n size: [isArbitraryVariable, isArbitraryValue]\n }];\n const scaleGradientStopPosition = () => [isPercent, isArbitraryVariableLength, isArbitraryLength];\n const scaleRadius = () => [\n // Deprecated since Tailwind CSS v4.0.0\n '', 'none', 'full', themeRadius, isArbitraryVariable, isArbitraryValue];\n const scaleBorderWidth = () => ['', isNumber, isArbitraryVariableLength, isArbitraryLength];\n const scaleLineStyle = () => ['solid', 'dashed', 'dotted', 'double'];\n const scaleBlendMode = () => ['normal', 'multiply', 'screen', 'overlay', 'darken', 'lighten', 'color-dodge', 'color-burn', 'hard-light', 'soft-light', 'difference', 'exclusion', 'hue', 'saturation', 'color', 'luminosity'];\n const scaleMaskImagePosition = () => [isNumber, isPercent, isArbitraryVariablePosition, isArbitraryPosition];\n const scaleBlur = () => [\n // Deprecated since Tailwind CSS v4.0.0\n '', 'none', themeBlur, isArbitraryVariable, isArbitraryValue];\n const scaleRotate = () => ['none', isNumber, isArbitraryVariable, isArbitraryValue];\n const scaleScale = () => ['none', isNumber, isArbitraryVariable, isArbitraryValue];\n const scaleSkew = () => [isNumber, isArbitraryVariable, isArbitraryValue];\n const scaleTranslate = () => [isFraction, 'full', ...scaleUnambiguousSpacing()];\n return {\n cacheSize: 500,\n theme: {\n animate: ['spin', 'ping', 'pulse', 'bounce'],\n aspect: ['video'],\n blur: [isTshirtSize],\n breakpoint: [isTshirtSize],\n color: [isAny],\n container: [isTshirtSize],\n 'drop-shadow': [isTshirtSize],\n ease: ['in', 'out', 'in-out'],\n font: [isAnyNonArbitrary],\n 'font-weight': ['thin', 'extralight', 'light', 'normal', 'medium', 'semibold', 'bold', 'extrabold', 'black'],\n 'inset-shadow': [isTshirtSize],\n leading: ['none', 'tight', 'snug', 'normal', 'relaxed', 'loose'],\n perspective: ['dramatic', 'near', 'normal', 'midrange', 'distant', 'none'],\n radius: [isTshirtSize],\n shadow: [isTshirtSize],\n spacing: ['px', isNumber],\n text: [isTshirtSize],\n 'text-shadow': [isTshirtSize],\n tracking: ['tighter', 'tight', 'normal', 'wide', 'wider', 'widest']\n },\n classGroups: {\n // --------------\n // --- Layout ---\n // --------------\n /**\n * Aspect Ratio\n * @see https://tailwindcss.com/docs/aspect-ratio\n */\n aspect: [{\n aspect: ['auto', 'square', isFraction, isArbitraryValue, isArbitraryVariable, themeAspect]\n }],\n /**\n * Container\n * @see https://tailwindcss.com/docs/container\n * @deprecated since Tailwind CSS v4.0.0\n */\n container: ['container'],\n /**\n * Columns\n * @see https://tailwindcss.com/docs/columns\n */\n columns: [{\n columns: [isNumber, isArbitraryValue, isArbitraryVariable, themeContainer]\n }],\n /**\n * Break After\n * @see https://tailwindcss.com/docs/break-after\n */\n 'break-after': [{\n 'break-after': scaleBreak()\n }],\n /**\n * Break Before\n * @see https://tailwindcss.com/docs/break-before\n */\n 'break-before': [{\n 'break-before': scaleBreak()\n }],\n /**\n * Break Inside\n * @see https://tailwindcss.com/docs/break-inside\n */\n 'break-inside': [{\n 'break-inside': ['auto', 'avoid', 'avoid-page', 'avoid-column']\n }],\n /**\n * Box Decoration Break\n * @see https://tailwindcss.com/docs/box-decoration-break\n */\n 'box-decoration': [{\n 'box-decoration': ['slice', 'clone']\n }],\n /**\n * Box Sizing\n * @see https://tailwindcss.com/docs/box-sizing\n */\n box: [{\n box: ['border', 'content']\n }],\n /**\n * Display\n * @see https://tailwindcss.com/docs/display\n */\n display: ['block', 'inline-block', 'inline', 'flex', 'inline-flex', 'table', 'inline-table', 'table-caption', 'table-cell', 'table-column', 'table-column-group', 'table-footer-group', 'table-header-group', 'table-row-group', 'table-row', 'flow-root', 'grid', 'inline-grid', 'contents', 'list-item', 'hidden'],\n /**\n * Screen Reader Only\n * @see https://tailwindcss.com/docs/display#screen-reader-only\n */\n sr: ['sr-only', 'not-sr-only'],\n /**\n * Floats\n * @see https://tailwindcss.com/docs/float\n */\n float: [{\n float: ['right', 'left', 'none', 'start', 'end']\n }],\n /**\n * Clear\n * @see https://tailwindcss.com/docs/clear\n */\n clear: [{\n clear: ['left', 'right', 'both', 'none', 'start', 'end']\n }],\n /**\n * Isolation\n * @see https://tailwindcss.com/docs/isolation\n */\n isolation: ['isolate', 'isolation-auto'],\n /**\n * Object Fit\n * @see https://tailwindcss.com/docs/object-fit\n */\n 'object-fit': [{\n object: ['contain', 'cover', 'fill', 'none', 'scale-down']\n }],\n /**\n * Object Position\n * @see https://tailwindcss.com/docs/object-position\n */\n 'object-position': [{\n object: scalePositionWithArbitrary()\n }],\n /**\n * Overflow\n * @see https://tailwindcss.com/docs/overflow\n */\n overflow: [{\n overflow: scaleOverflow()\n }],\n /**\n * Overflow X\n * @see https://tailwindcss.com/docs/overflow\n */\n 'overflow-x': [{\n 'overflow-x': scaleOverflow()\n }],\n /**\n * Overflow Y\n * @see https://tailwindcss.com/docs/overflow\n */\n 'overflow-y': [{\n 'overflow-y': scaleOverflow()\n }],\n /**\n * Overscroll Behavior\n * @see https://tailwindcss.com/docs/overscroll-behavior\n */\n overscroll: [{\n overscroll: scaleOverscroll()\n }],\n /**\n * Overscroll Behavior X\n * @see https://tailwindcss.com/docs/overscroll-behavior\n */\n 'overscroll-x': [{\n 'overscroll-x': scaleOverscroll()\n }],\n /**\n * Overscroll Behavior Y\n * @see https://tailwindcss.com/docs/overscroll-behavior\n */\n 'overscroll-y': [{\n 'overscroll-y': scaleOverscroll()\n }],\n /**\n * Position\n * @see https://tailwindcss.com/docs/position\n */\n position: ['static', 'fixed', 'absolute', 'relative', 'sticky'],\n /**\n * Inset\n * @see https://tailwindcss.com/docs/top-right-bottom-left\n */\n inset: [{\n inset: scaleInset()\n }],\n /**\n * Inset Inline\n * @see https://tailwindcss.com/docs/top-right-bottom-left\n */\n 'inset-x': [{\n 'inset-x': scaleInset()\n }],\n /**\n * Inset Block\n * @see https://tailwindcss.com/docs/top-right-bottom-left\n */\n 'inset-y': [{\n 'inset-y': scaleInset()\n }],\n /**\n * Inset Inline Start\n * @see https://tailwindcss.com/docs/top-right-bottom-left\n * @todo class group will be renamed to `inset-s` in next major release\n */\n start: [{\n 'inset-s': scaleInset(),\n /**\n * @deprecated since Tailwind CSS v4.2.0 in favor of `inset-s-*` utilities.\n * @see https://github.com/tailwindlabs/tailwindcss/pull/19613\n */\n start: scaleInset()\n }],\n /**\n * Inset Inline End\n * @see https://tailwindcss.com/docs/top-right-bottom-left\n * @todo class group will be renamed to `inset-e` in next major release\n */\n end: [{\n 'inset-e': scaleInset(),\n /**\n * @deprecated since Tailwind CSS v4.2.0 in favor of `inset-e-*` utilities.\n * @see https://github.com/tailwindlabs/tailwindcss/pull/19613\n */\n end: scaleInset()\n }],\n /**\n * Inset Block Start\n * @see https://tailwindcss.com/docs/top-right-bottom-left\n */\n 'inset-bs': [{\n 'inset-bs': scaleInset()\n }],\n /**\n * Inset Block End\n * @see https://tailwindcss.com/docs/top-right-bottom-left\n */\n 'inset-be': [{\n 'inset-be': scaleInset()\n }],\n /**\n * Top\n * @see https://tailwindcss.com/docs/top-right-bottom-left\n */\n top: [{\n top: scaleInset()\n }],\n /**\n * Right\n * @see https://tailwindcss.com/docs/top-right-bottom-left\n */\n right: [{\n right: scaleInset()\n }],\n /**\n * Bottom\n * @see https://tailwindcss.com/docs/top-right-bottom-left\n */\n bottom: [{\n bottom: scaleInset()\n }],\n /**\n * Left\n * @see https://tailwindcss.com/docs/top-right-bottom-left\n */\n left: [{\n left: scaleInset()\n }],\n /**\n * Visibility\n * @see https://tailwindcss.com/docs/visibility\n */\n visibility: ['visible', 'invisible', 'collapse'],\n /**\n * Z-Index\n * @see https://tailwindcss.com/docs/z-index\n */\n z: [{\n z: [isInteger, 'auto', isArbitraryVariable, isArbitraryValue]\n }],\n // ------------------------\n // --- Flexbox and Grid ---\n // ------------------------\n /**\n * Flex Basis\n * @see https://tailwindcss.com/docs/flex-basis\n */\n basis: [{\n basis: [isFraction, 'full', 'auto', themeContainer, ...scaleUnambiguousSpacing()]\n }],\n /**\n * Flex Direction\n * @see https://tailwindcss.com/docs/flex-direction\n */\n 'flex-direction': [{\n flex: ['row', 'row-reverse', 'col', 'col-reverse']\n }],\n /**\n * Flex Wrap\n * @see https://tailwindcss.com/docs/flex-wrap\n */\n 'flex-wrap': [{\n flex: ['nowrap', 'wrap', 'wrap-reverse']\n }],\n /**\n * Flex\n * @see https://tailwindcss.com/docs/flex\n */\n flex: [{\n flex: [isNumber, isFraction, 'auto', 'initial', 'none', isArbitraryValue]\n }],\n /**\n * Flex Grow\n * @see https://tailwindcss.com/docs/flex-grow\n */\n grow: [{\n grow: ['', isNumber, isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Flex Shrink\n * @see https://tailwindcss.com/docs/flex-shrink\n */\n shrink: [{\n shrink: ['', isNumber, isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Order\n * @see https://tailwindcss.com/docs/order\n */\n order: [{\n order: [isInteger, 'first', 'last', 'none', isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Grid Template Columns\n * @see https://tailwindcss.com/docs/grid-template-columns\n */\n 'grid-cols': [{\n 'grid-cols': scaleGridTemplateColsRows()\n }],\n /**\n * Grid Column Start / End\n * @see https://tailwindcss.com/docs/grid-column\n */\n 'col-start-end': [{\n col: scaleGridColRowStartAndEnd()\n }],\n /**\n * Grid Column Start\n * @see https://tailwindcss.com/docs/grid-column\n */\n 'col-start': [{\n 'col-start': scaleGridColRowStartOrEnd()\n }],\n /**\n * Grid Column End\n * @see https://tailwindcss.com/docs/grid-column\n */\n 'col-end': [{\n 'col-end': scaleGridColRowStartOrEnd()\n }],\n /**\n * Grid Template Rows\n * @see https://tailwindcss.com/docs/grid-template-rows\n */\n 'grid-rows': [{\n 'grid-rows': scaleGridTemplateColsRows()\n }],\n /**\n * Grid Row Start / End\n * @see https://tailwindcss.com/docs/grid-row\n */\n 'row-start-end': [{\n row: scaleGridColRowStartAndEnd()\n }],\n /**\n * Grid Row Start\n * @see https://tailwindcss.com/docs/grid-row\n */\n 'row-start': [{\n 'row-start': scaleGridColRowStartOrEnd()\n }],\n /**\n * Grid Row End\n * @see https://tailwindcss.com/docs/grid-row\n */\n 'row-end': [{\n 'row-end': scaleGridColRowStartOrEnd()\n }],\n /**\n * Grid Auto Flow\n * @see https://tailwindcss.com/docs/grid-auto-flow\n */\n 'grid-flow': [{\n 'grid-flow': ['row', 'col', 'dense', 'row-dense', 'col-dense']\n }],\n /**\n * Grid Auto Columns\n * @see https://tailwindcss.com/docs/grid-auto-columns\n */\n 'auto-cols': [{\n 'auto-cols': scaleGridAutoColsRows()\n }],\n /**\n * Grid Auto Rows\n * @see https://tailwindcss.com/docs/grid-auto-rows\n */\n 'auto-rows': [{\n 'auto-rows': scaleGridAutoColsRows()\n }],\n /**\n * Gap\n * @see https://tailwindcss.com/docs/gap\n */\n gap: [{\n gap: scaleUnambiguousSpacing()\n }],\n /**\n * Gap X\n * @see https://tailwindcss.com/docs/gap\n */\n 'gap-x': [{\n 'gap-x': scaleUnambiguousSpacing()\n }],\n /**\n * Gap Y\n * @see https://tailwindcss.com/docs/gap\n */\n 'gap-y': [{\n 'gap-y': scaleUnambiguousSpacing()\n }],\n /**\n * Justify Content\n * @see https://tailwindcss.com/docs/justify-content\n */\n 'justify-content': [{\n justify: [...scaleAlignPrimaryAxis(), 'normal']\n }],\n /**\n * Justify Items\n * @see https://tailwindcss.com/docs/justify-items\n */\n 'justify-items': [{\n 'justify-items': [...scaleAlignSecondaryAxis(), 'normal']\n }],\n /**\n * Justify Self\n * @see https://tailwindcss.com/docs/justify-self\n */\n 'justify-self': [{\n 'justify-self': ['auto', ...scaleAlignSecondaryAxis()]\n }],\n /**\n * Align Content\n * @see https://tailwindcss.com/docs/align-content\n */\n 'align-content': [{\n content: ['normal', ...scaleAlignPrimaryAxis()]\n }],\n /**\n * Align Items\n * @see https://tailwindcss.com/docs/align-items\n */\n 'align-items': [{\n items: [...scaleAlignSecondaryAxis(), {\n baseline: ['', 'last']\n }]\n }],\n /**\n * Align Self\n * @see https://tailwindcss.com/docs/align-self\n */\n 'align-self': [{\n self: ['auto', ...scaleAlignSecondaryAxis(), {\n baseline: ['', 'last']\n }]\n }],\n /**\n * Place Content\n * @see https://tailwindcss.com/docs/place-content\n */\n 'place-content': [{\n 'place-content': scaleAlignPrimaryAxis()\n }],\n /**\n * Place Items\n * @see https://tailwindcss.com/docs/place-items\n */\n 'place-items': [{\n 'place-items': [...scaleAlignSecondaryAxis(), 'baseline']\n }],\n /**\n * Place Self\n * @see https://tailwindcss.com/docs/place-self\n */\n 'place-self': [{\n 'place-self': ['auto', ...scaleAlignSecondaryAxis()]\n }],\n // Spacing\n /**\n * Padding\n * @see https://tailwindcss.com/docs/padding\n */\n p: [{\n p: scaleUnambiguousSpacing()\n }],\n /**\n * Padding Inline\n * @see https://tailwindcss.com/docs/padding\n */\n px: [{\n px: scaleUnambiguousSpacing()\n }],\n /**\n * Padding Block\n * @see https://tailwindcss.com/docs/padding\n */\n py: [{\n py: scaleUnambiguousSpacing()\n }],\n /**\n * Padding Inline Start\n * @see https://tailwindcss.com/docs/padding\n */\n ps: [{\n ps: scaleUnambiguousSpacing()\n }],\n /**\n * Padding Inline End\n * @see https://tailwindcss.com/docs/padding\n */\n pe: [{\n pe: scaleUnambiguousSpacing()\n }],\n /**\n * Padding Block Start\n * @see https://tailwindcss.com/docs/padding\n */\n pbs: [{\n pbs: scaleUnambiguousSpacing()\n }],\n /**\n * Padding Block End\n * @see https://tailwindcss.com/docs/padding\n */\n pbe: [{\n pbe: scaleUnambiguousSpacing()\n }],\n /**\n * Padding Top\n * @see https://tailwindcss.com/docs/padding\n */\n pt: [{\n pt: scaleUnambiguousSpacing()\n }],\n /**\n * Padding Right\n * @see https://tailwindcss.com/docs/padding\n */\n pr: [{\n pr: scaleUnambiguousSpacing()\n }],\n /**\n * Padding Bottom\n * @see https://tailwindcss.com/docs/padding\n */\n pb: [{\n pb: scaleUnambiguousSpacing()\n }],\n /**\n * Padding Left\n * @see https://tailwindcss.com/docs/padding\n */\n pl: [{\n pl: scaleUnambiguousSpacing()\n }],\n /**\n * Margin\n * @see https://tailwindcss.com/docs/margin\n */\n m: [{\n m: scaleMargin()\n }],\n /**\n * Margin Inline\n * @see https://tailwindcss.com/docs/margin\n */\n mx: [{\n mx: scaleMargin()\n }],\n /**\n * Margin Block\n * @see https://tailwindcss.com/docs/margin\n */\n my: [{\n my: scaleMargin()\n }],\n /**\n * Margin Inline Start\n * @see https://tailwindcss.com/docs/margin\n */\n ms: [{\n ms: scaleMargin()\n }],\n /**\n * Margin Inline End\n * @see https://tailwindcss.com/docs/margin\n */\n me: [{\n me: scaleMargin()\n }],\n /**\n * Margin Block Start\n * @see https://tailwindcss.com/docs/margin\n */\n mbs: [{\n mbs: scaleMargin()\n }],\n /**\n * Margin Block End\n * @see https://tailwindcss.com/docs/margin\n */\n mbe: [{\n mbe: scaleMargin()\n }],\n /**\n * Margin Top\n * @see https://tailwindcss.com/docs/margin\n */\n mt: [{\n mt: scaleMargin()\n }],\n /**\n * Margin Right\n * @see https://tailwindcss.com/docs/margin\n */\n mr: [{\n mr: scaleMargin()\n }],\n /**\n * Margin Bottom\n * @see https://tailwindcss.com/docs/margin\n */\n mb: [{\n mb: scaleMargin()\n }],\n /**\n * Margin Left\n * @see https://tailwindcss.com/docs/margin\n */\n ml: [{\n ml: scaleMargin()\n }],\n /**\n * Space Between X\n * @see https://tailwindcss.com/docs/margin#adding-space-between-children\n */\n 'space-x': [{\n 'space-x': scaleUnambiguousSpacing()\n }],\n /**\n * Space Between X Reverse\n * @see https://tailwindcss.com/docs/margin#adding-space-between-children\n */\n 'space-x-reverse': ['space-x-reverse'],\n /**\n * Space Between Y\n * @see https://tailwindcss.com/docs/margin#adding-space-between-children\n */\n 'space-y': [{\n 'space-y': scaleUnambiguousSpacing()\n }],\n /**\n * Space Between Y Reverse\n * @see https://tailwindcss.com/docs/margin#adding-space-between-children\n */\n 'space-y-reverse': ['space-y-reverse'],\n // --------------\n // --- Sizing ---\n // --------------\n /**\n * Size\n * @see https://tailwindcss.com/docs/width#setting-both-width-and-height\n */\n size: [{\n size: scaleSizing()\n }],\n /**\n * Inline Size\n * @see https://tailwindcss.com/docs/width\n */\n 'inline-size': [{\n inline: ['auto', ...scaleSizingInline()]\n }],\n /**\n * Min-Inline Size\n * @see https://tailwindcss.com/docs/min-width\n */\n 'min-inline-size': [{\n 'min-inline': ['auto', ...scaleSizingInline()]\n }],\n /**\n * Max-Inline Size\n * @see https://tailwindcss.com/docs/max-width\n */\n 'max-inline-size': [{\n 'max-inline': ['none', ...scaleSizingInline()]\n }],\n /**\n * Block Size\n * @see https://tailwindcss.com/docs/height\n */\n 'block-size': [{\n block: ['auto', ...scaleSizingBlock()]\n }],\n /**\n * Min-Block Size\n * @see https://tailwindcss.com/docs/min-height\n */\n 'min-block-size': [{\n 'min-block': ['auto', ...scaleSizingBlock()]\n }],\n /**\n * Max-Block Size\n * @see https://tailwindcss.com/docs/max-height\n */\n 'max-block-size': [{\n 'max-block': ['none', ...scaleSizingBlock()]\n }],\n /**\n * Width\n * @see https://tailwindcss.com/docs/width\n */\n w: [{\n w: [themeContainer, 'screen', ...scaleSizing()]\n }],\n /**\n * Min-Width\n * @see https://tailwindcss.com/docs/min-width\n */\n 'min-w': [{\n 'min-w': [themeContainer, 'screen', /** Deprecated. @see https://github.com/tailwindlabs/tailwindcss.com/issues/2027#issuecomment-2620152757 */\n 'none', ...scaleSizing()]\n }],\n /**\n * Max-Width\n * @see https://tailwindcss.com/docs/max-width\n */\n 'max-w': [{\n 'max-w': [themeContainer, 'screen', 'none', /** Deprecated since Tailwind CSS v4.0.0. @see https://github.com/tailwindlabs/tailwindcss.com/issues/2027#issuecomment-2620152757 */\n 'prose', /** Deprecated since Tailwind CSS v4.0.0. @see https://github.com/tailwindlabs/tailwindcss.com/issues/2027#issuecomment-2620152757 */\n {\n screen: [themeBreakpoint]\n }, ...scaleSizing()]\n }],\n /**\n * Height\n * @see https://tailwindcss.com/docs/height\n */\n h: [{\n h: ['screen', 'lh', ...scaleSizing()]\n }],\n /**\n * Min-Height\n * @see https://tailwindcss.com/docs/min-height\n */\n 'min-h': [{\n 'min-h': ['screen', 'lh', 'none', ...scaleSizing()]\n }],\n /**\n * Max-Height\n * @see https://tailwindcss.com/docs/max-height\n */\n 'max-h': [{\n 'max-h': ['screen', 'lh', ...scaleSizing()]\n }],\n // ------------------\n // --- Typography ---\n // ------------------\n /**\n * Font Size\n * @see https://tailwindcss.com/docs/font-size\n */\n 'font-size': [{\n text: ['base', themeText, isArbitraryVariableLength, isArbitraryLength]\n }],\n /**\n * Font Smoothing\n * @see https://tailwindcss.com/docs/font-smoothing\n */\n 'font-smoothing': ['antialiased', 'subpixel-antialiased'],\n /**\n * Font Style\n * @see https://tailwindcss.com/docs/font-style\n */\n 'font-style': ['italic', 'not-italic'],\n /**\n * Font Weight\n * @see https://tailwindcss.com/docs/font-weight\n */\n 'font-weight': [{\n font: [themeFontWeight, isArbitraryVariableWeight, isArbitraryWeight]\n }],\n /**\n * Font Stretch\n * @see https://tailwindcss.com/docs/font-stretch\n */\n 'font-stretch': [{\n 'font-stretch': ['ultra-condensed', 'extra-condensed', 'condensed', 'semi-condensed', 'normal', 'semi-expanded', 'expanded', 'extra-expanded', 'ultra-expanded', isPercent, isArbitraryValue]\n }],\n /**\n * Font Family\n * @see https://tailwindcss.com/docs/font-family\n */\n 'font-family': [{\n font: [isArbitraryVariableFamilyName, isArbitraryFamilyName, themeFont]\n }],\n /**\n * Font Feature Settings\n * @see https://tailwindcss.com/docs/font-feature-settings\n */\n 'font-features': [{\n 'font-features': [isArbitraryValue]\n }],\n /**\n * Font Variant Numeric\n * @see https://tailwindcss.com/docs/font-variant-numeric\n */\n 'fvn-normal': ['normal-nums'],\n /**\n * Font Variant Numeric\n * @see https://tailwindcss.com/docs/font-variant-numeric\n */\n 'fvn-ordinal': ['ordinal'],\n /**\n * Font Variant Numeric\n * @see https://tailwindcss.com/docs/font-variant-numeric\n */\n 'fvn-slashed-zero': ['slashed-zero'],\n /**\n * Font Variant Numeric\n * @see https://tailwindcss.com/docs/font-variant-numeric\n */\n 'fvn-figure': ['lining-nums', 'oldstyle-nums'],\n /**\n * Font Variant Numeric\n * @see https://tailwindcss.com/docs/font-variant-numeric\n */\n 'fvn-spacing': ['proportional-nums', 'tabular-nums'],\n /**\n * Font Variant Numeric\n * @see https://tailwindcss.com/docs/font-variant-numeric\n */\n 'fvn-fraction': ['diagonal-fractions', 'stacked-fractions'],\n /**\n * Letter Spacing\n * @see https://tailwindcss.com/docs/letter-spacing\n */\n tracking: [{\n tracking: [themeTracking, isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Line Clamp\n * @see https://tailwindcss.com/docs/line-clamp\n */\n 'line-clamp': [{\n 'line-clamp': [isNumber, 'none', isArbitraryVariable, isArbitraryNumber]\n }],\n /**\n * Line Height\n * @see https://tailwindcss.com/docs/line-height\n */\n leading: [{\n leading: [/** Deprecated since Tailwind CSS v4.0.0. @see https://github.com/tailwindlabs/tailwindcss.com/issues/2027#issuecomment-2620152757 */\n themeLeading, ...scaleUnambiguousSpacing()]\n }],\n /**\n * List Style Image\n * @see https://tailwindcss.com/docs/list-style-image\n */\n 'list-image': [{\n 'list-image': ['none', isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * List Style Position\n * @see https://tailwindcss.com/docs/list-style-position\n */\n 'list-style-position': [{\n list: ['inside', 'outside']\n }],\n /**\n * List Style Type\n * @see https://tailwindcss.com/docs/list-style-type\n */\n 'list-style-type': [{\n list: ['disc', 'decimal', 'none', isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Text Alignment\n * @see https://tailwindcss.com/docs/text-align\n */\n 'text-alignment': [{\n text: ['left', 'center', 'right', 'justify', 'start', 'end']\n }],\n /**\n * Placeholder Color\n * @deprecated since Tailwind CSS v3.0.0\n * @see https://v3.tailwindcss.com/docs/placeholder-color\n */\n 'placeholder-color': [{\n placeholder: scaleColor()\n }],\n /**\n * Text Color\n * @see https://tailwindcss.com/docs/text-color\n */\n 'text-color': [{\n text: scaleColor()\n }],\n /**\n * Text Decoration\n * @see https://tailwindcss.com/docs/text-decoration\n */\n 'text-decoration': ['underline', 'overline', 'line-through', 'no-underline'],\n /**\n * Text Decoration Style\n * @see https://tailwindcss.com/docs/text-decoration-style\n */\n 'text-decoration-style': [{\n decoration: [...scaleLineStyle(), 'wavy']\n }],\n /**\n * Text Decoration Thickness\n * @see https://tailwindcss.com/docs/text-decoration-thickness\n */\n 'text-decoration-thickness': [{\n decoration: [isNumber, 'from-font', 'auto', isArbitraryVariable, isArbitraryLength]\n }],\n /**\n * Text Decoration Color\n * @see https://tailwindcss.com/docs/text-decoration-color\n */\n 'text-decoration-color': [{\n decoration: scaleColor()\n }],\n /**\n * Text Underline Offset\n * @see https://tailwindcss.com/docs/text-underline-offset\n */\n 'underline-offset': [{\n 'underline-offset': [isNumber, 'auto', isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Text Transform\n * @see https://tailwindcss.com/docs/text-transform\n */\n 'text-transform': ['uppercase', 'lowercase', 'capitalize', 'normal-case'],\n /**\n * Text Overflow\n * @see https://tailwindcss.com/docs/text-overflow\n */\n 'text-overflow': ['truncate', 'text-ellipsis', 'text-clip'],\n /**\n * Text Wrap\n * @see https://tailwindcss.com/docs/text-wrap\n */\n 'text-wrap': [{\n text: ['wrap', 'nowrap', 'balance', 'pretty']\n }],\n /**\n * Text Indent\n * @see https://tailwindcss.com/docs/text-indent\n */\n indent: [{\n indent: scaleUnambiguousSpacing()\n }],\n /**\n * Vertical Alignment\n * @see https://tailwindcss.com/docs/vertical-align\n */\n 'vertical-align': [{\n align: ['baseline', 'top', 'middle', 'bottom', 'text-top', 'text-bottom', 'sub', 'super', isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Whitespace\n * @see https://tailwindcss.com/docs/whitespace\n */\n whitespace: [{\n whitespace: ['normal', 'nowrap', 'pre', 'pre-line', 'pre-wrap', 'break-spaces']\n }],\n /**\n * Word Break\n * @see https://tailwindcss.com/docs/word-break\n */\n break: [{\n break: ['normal', 'words', 'all', 'keep']\n }],\n /**\n * Overflow Wrap\n * @see https://tailwindcss.com/docs/overflow-wrap\n */\n wrap: [{\n wrap: ['break-word', 'anywhere', 'normal']\n }],\n /**\n * Hyphens\n * @see https://tailwindcss.com/docs/hyphens\n */\n hyphens: [{\n hyphens: ['none', 'manual', 'auto']\n }],\n /**\n * Content\n * @see https://tailwindcss.com/docs/content\n */\n content: [{\n content: ['none', isArbitraryVariable, isArbitraryValue]\n }],\n // -------------------\n // --- Backgrounds ---\n // -------------------\n /**\n * Background Attachment\n * @see https://tailwindcss.com/docs/background-attachment\n */\n 'bg-attachment': [{\n bg: ['fixed', 'local', 'scroll']\n }],\n /**\n * Background Clip\n * @see https://tailwindcss.com/docs/background-clip\n */\n 'bg-clip': [{\n 'bg-clip': ['border', 'padding', 'content', 'text']\n }],\n /**\n * Background Origin\n * @see https://tailwindcss.com/docs/background-origin\n */\n 'bg-origin': [{\n 'bg-origin': ['border', 'padding', 'content']\n }],\n /**\n * Background Position\n * @see https://tailwindcss.com/docs/background-position\n */\n 'bg-position': [{\n bg: scaleBgPosition()\n }],\n /**\n * Background Repeat\n * @see https://tailwindcss.com/docs/background-repeat\n */\n 'bg-repeat': [{\n bg: scaleBgRepeat()\n }],\n /**\n * Background Size\n * @see https://tailwindcss.com/docs/background-size\n */\n 'bg-size': [{\n bg: scaleBgSize()\n }],\n /**\n * Background Image\n * @see https://tailwindcss.com/docs/background-image\n */\n 'bg-image': [{\n bg: ['none', {\n linear: [{\n to: ['t', 'tr', 'r', 'br', 'b', 'bl', 'l', 'tl']\n }, isInteger, isArbitraryVariable, isArbitraryValue],\n radial: ['', isArbitraryVariable, isArbitraryValue],\n conic: [isInteger, isArbitraryVariable, isArbitraryValue]\n }, isArbitraryVariableImage, isArbitraryImage]\n }],\n /**\n * Background Color\n * @see https://tailwindcss.com/docs/background-color\n */\n 'bg-color': [{\n bg: scaleColor()\n }],\n /**\n * Gradient Color Stops From Position\n * @see https://tailwindcss.com/docs/gradient-color-stops\n */\n 'gradient-from-pos': [{\n from: scaleGradientStopPosition()\n }],\n /**\n * Gradient Color Stops Via Position\n * @see https://tailwindcss.com/docs/gradient-color-stops\n */\n 'gradient-via-pos': [{\n via: scaleGradientStopPosition()\n }],\n /**\n * Gradient Color Stops To Position\n * @see https://tailwindcss.com/docs/gradient-color-stops\n */\n 'gradient-to-pos': [{\n to: scaleGradientStopPosition()\n }],\n /**\n * Gradient Color Stops From\n * @see https://tailwindcss.com/docs/gradient-color-stops\n */\n 'gradient-from': [{\n from: scaleColor()\n }],\n /**\n * Gradient Color Stops Via\n * @see https://tailwindcss.com/docs/gradient-color-stops\n */\n 'gradient-via': [{\n via: scaleColor()\n }],\n /**\n * Gradient Color Stops To\n * @see https://tailwindcss.com/docs/gradient-color-stops\n */\n 'gradient-to': [{\n to: scaleColor()\n }],\n // ---------------\n // --- Borders ---\n // ---------------\n /**\n * Border Radius\n * @see https://tailwindcss.com/docs/border-radius\n */\n rounded: [{\n rounded: scaleRadius()\n }],\n /**\n * Border Radius Start\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-s': [{\n 'rounded-s': scaleRadius()\n }],\n /**\n * Border Radius End\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-e': [{\n 'rounded-e': scaleRadius()\n }],\n /**\n * Border Radius Top\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-t': [{\n 'rounded-t': scaleRadius()\n }],\n /**\n * Border Radius Right\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-r': [{\n 'rounded-r': scaleRadius()\n }],\n /**\n * Border Radius Bottom\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-b': [{\n 'rounded-b': scaleRadius()\n }],\n /**\n * Border Radius Left\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-l': [{\n 'rounded-l': scaleRadius()\n }],\n /**\n * Border Radius Start Start\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-ss': [{\n 'rounded-ss': scaleRadius()\n }],\n /**\n * Border Radius Start End\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-se': [{\n 'rounded-se': scaleRadius()\n }],\n /**\n * Border Radius End End\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-ee': [{\n 'rounded-ee': scaleRadius()\n }],\n /**\n * Border Radius End Start\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-es': [{\n 'rounded-es': scaleRadius()\n }],\n /**\n * Border Radius Top Left\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-tl': [{\n 'rounded-tl': scaleRadius()\n }],\n /**\n * Border Radius Top Right\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-tr': [{\n 'rounded-tr': scaleRadius()\n }],\n /**\n * Border Radius Bottom Right\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-br': [{\n 'rounded-br': scaleRadius()\n }],\n /**\n * Border Radius Bottom Left\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-bl': [{\n 'rounded-bl': scaleRadius()\n }],\n /**\n * Border Width\n * @see https://tailwindcss.com/docs/border-width\n */\n 'border-w': [{\n border: scaleBorderWidth()\n }],\n /**\n * Border Width Inline\n * @see https://tailwindcss.com/docs/border-width\n */\n 'border-w-x': [{\n 'border-x': scaleBorderWidth()\n }],\n /**\n * Border Width Block\n * @see https://tailwindcss.com/docs/border-width\n */\n 'border-w-y': [{\n 'border-y': scaleBorderWidth()\n }],\n /**\n * Border Width Inline Start\n * @see https://tailwindcss.com/docs/border-width\n */\n 'border-w-s': [{\n 'border-s': scaleBorderWidth()\n }],\n /**\n * Border Width Inline End\n * @see https://tailwindcss.com/docs/border-width\n */\n 'border-w-e': [{\n 'border-e': scaleBorderWidth()\n }],\n /**\n * Border Width Block Start\n * @see https://tailwindcss.com/docs/border-width\n */\n 'border-w-bs': [{\n 'border-bs': scaleBorderWidth()\n }],\n /**\n * Border Width Block End\n * @see https://tailwindcss.com/docs/border-width\n */\n 'border-w-be': [{\n 'border-be': scaleBorderWidth()\n }],\n /**\n * Border Width Top\n * @see https://tailwindcss.com/docs/border-width\n */\n 'border-w-t': [{\n 'border-t': scaleBorderWidth()\n }],\n /**\n * Border Width Right\n * @see https://tailwindcss.com/docs/border-width\n */\n 'border-w-r': [{\n 'border-r': scaleBorderWidth()\n }],\n /**\n * Border Width Bottom\n * @see https://tailwindcss.com/docs/border-width\n */\n 'border-w-b': [{\n 'border-b': scaleBorderWidth()\n }],\n /**\n * Border Width Left\n * @see https://tailwindcss.com/docs/border-width\n */\n 'border-w-l': [{\n 'border-l': scaleBorderWidth()\n }],\n /**\n * Divide Width X\n * @see https://tailwindcss.com/docs/border-width#between-children\n */\n 'divide-x': [{\n 'divide-x': scaleBorderWidth()\n }],\n /**\n * Divide Width X Reverse\n * @see https://tailwindcss.com/docs/border-width#between-children\n */\n 'divide-x-reverse': ['divide-x-reverse'],\n /**\n * Divide Width Y\n * @see https://tailwindcss.com/docs/border-width#between-children\n */\n 'divide-y': [{\n 'divide-y': scaleBorderWidth()\n }],\n /**\n * Divide Width Y Reverse\n * @see https://tailwindcss.com/docs/border-width#between-children\n */\n 'divide-y-reverse': ['divide-y-reverse'],\n /**\n * Border Style\n * @see https://tailwindcss.com/docs/border-style\n */\n 'border-style': [{\n border: [...scaleLineStyle(), 'hidden', 'none']\n }],\n /**\n * Divide Style\n * @see https://tailwindcss.com/docs/border-style#setting-the-divider-style\n */\n 'divide-style': [{\n divide: [...scaleLineStyle(), 'hidden', 'none']\n }],\n /**\n * Border Color\n * @see https://tailwindcss.com/docs/border-color\n */\n 'border-color': [{\n border: scaleColor()\n }],\n /**\n * Border Color Inline\n * @see https://tailwindcss.com/docs/border-color\n */\n 'border-color-x': [{\n 'border-x': scaleColor()\n }],\n /**\n * Border Color Block\n * @see https://tailwindcss.com/docs/border-color\n */\n 'border-color-y': [{\n 'border-y': scaleColor()\n }],\n /**\n * Border Color Inline Start\n * @see https://tailwindcss.com/docs/border-color\n */\n 'border-color-s': [{\n 'border-s': scaleColor()\n }],\n /**\n * Border Color Inline End\n * @see https://tailwindcss.com/docs/border-color\n */\n 'border-color-e': [{\n 'border-e': scaleColor()\n }],\n /**\n * Border Color Block Start\n * @see https://tailwindcss.com/docs/border-color\n */\n 'border-color-bs': [{\n 'border-bs': scaleColor()\n }],\n /**\n * Border Color Block End\n * @see https://tailwindcss.com/docs/border-color\n */\n 'border-color-be': [{\n 'border-be': scaleColor()\n }],\n /**\n * Border Color Top\n * @see https://tailwindcss.com/docs/border-color\n */\n 'border-color-t': [{\n 'border-t': scaleColor()\n }],\n /**\n * Border Color Right\n * @see https://tailwindcss.com/docs/border-color\n */\n 'border-color-r': [{\n 'border-r': scaleColor()\n }],\n /**\n * Border Color Bottom\n * @see https://tailwindcss.com/docs/border-color\n */\n 'border-color-b': [{\n 'border-b': scaleColor()\n }],\n /**\n * Border Color Left\n * @see https://tailwindcss.com/docs/border-color\n */\n 'border-color-l': [{\n 'border-l': scaleColor()\n }],\n /**\n * Divide Color\n * @see https://tailwindcss.com/docs/divide-color\n */\n 'divide-color': [{\n divide: scaleColor()\n }],\n /**\n * Outline Style\n * @see https://tailwindcss.com/docs/outline-style\n */\n 'outline-style': [{\n outline: [...scaleLineStyle(), 'none', 'hidden']\n }],\n /**\n * Outline Offset\n * @see https://tailwindcss.com/docs/outline-offset\n */\n 'outline-offset': [{\n 'outline-offset': [isNumber, isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Outline Width\n * @see https://tailwindcss.com/docs/outline-width\n */\n 'outline-w': [{\n outline: ['', isNumber, isArbitraryVariableLength, isArbitraryLength]\n }],\n /**\n * Outline Color\n * @see https://tailwindcss.com/docs/outline-color\n */\n 'outline-color': [{\n outline: scaleColor()\n }],\n // ---------------\n // --- Effects ---\n // ---------------\n /**\n * Box Shadow\n * @see https://tailwindcss.com/docs/box-shadow\n */\n shadow: [{\n shadow: [\n // Deprecated since Tailwind CSS v4.0.0\n '', 'none', themeShadow, isArbitraryVariableShadow, isArbitraryShadow]\n }],\n /**\n * Box Shadow Color\n * @see https://tailwindcss.com/docs/box-shadow#setting-the-shadow-color\n */\n 'shadow-color': [{\n shadow: scaleColor()\n }],\n /**\n * Inset Box Shadow\n * @see https://tailwindcss.com/docs/box-shadow#adding-an-inset-shadow\n */\n 'inset-shadow': [{\n 'inset-shadow': ['none', themeInsetShadow, isArbitraryVariableShadow, isArbitraryShadow]\n }],\n /**\n * Inset Box Shadow Color\n * @see https://tailwindcss.com/docs/box-shadow#setting-the-inset-shadow-color\n */\n 'inset-shadow-color': [{\n 'inset-shadow': scaleColor()\n }],\n /**\n * Ring Width\n * @see https://tailwindcss.com/docs/box-shadow#adding-a-ring\n */\n 'ring-w': [{\n ring: scaleBorderWidth()\n }],\n /**\n * Ring Width Inset\n * @see https://v3.tailwindcss.com/docs/ring-width#inset-rings\n * @deprecated since Tailwind CSS v4.0.0\n * @see https://github.com/tailwindlabs/tailwindcss/blob/v4.0.0/packages/tailwindcss/src/utilities.ts#L4158\n */\n 'ring-w-inset': ['ring-inset'],\n /**\n * Ring Color\n * @see https://tailwindcss.com/docs/box-shadow#setting-the-ring-color\n */\n 'ring-color': [{\n ring: scaleColor()\n }],\n /**\n * Ring Offset Width\n * @see https://v3.tailwindcss.com/docs/ring-offset-width\n * @deprecated since Tailwind CSS v4.0.0\n * @see https://github.com/tailwindlabs/tailwindcss/blob/v4.0.0/packages/tailwindcss/src/utilities.ts#L4158\n */\n 'ring-offset-w': [{\n 'ring-offset': [isNumber, isArbitraryLength]\n }],\n /**\n * Ring Offset Color\n * @see https://v3.tailwindcss.com/docs/ring-offset-color\n * @deprecated since Tailwind CSS v4.0.0\n * @see https://github.com/tailwindlabs/tailwindcss/blob/v4.0.0/packages/tailwindcss/src/utilities.ts#L4158\n */\n 'ring-offset-color': [{\n 'ring-offset': scaleColor()\n }],\n /**\n * Inset Ring Width\n * @see https://tailwindcss.com/docs/box-shadow#adding-an-inset-ring\n */\n 'inset-ring-w': [{\n 'inset-ring': scaleBorderWidth()\n }],\n /**\n * Inset Ring Color\n * @see https://tailwindcss.com/docs/box-shadow#setting-the-inset-ring-color\n */\n 'inset-ring-color': [{\n 'inset-ring': scaleColor()\n }],\n /**\n * Text Shadow\n * @see https://tailwindcss.com/docs/text-shadow\n */\n 'text-shadow': [{\n 'text-shadow': ['none', themeTextShadow, isArbitraryVariableShadow, isArbitraryShadow]\n }],\n /**\n * Text Shadow Color\n * @see https://tailwindcss.com/docs/text-shadow#setting-the-shadow-color\n */\n 'text-shadow-color': [{\n 'text-shadow': scaleColor()\n }],\n /**\n * Opacity\n * @see https://tailwindcss.com/docs/opacity\n */\n opacity: [{\n opacity: [isNumber, isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Mix Blend Mode\n * @see https://tailwindcss.com/docs/mix-blend-mode\n */\n 'mix-blend': [{\n 'mix-blend': [...scaleBlendMode(), 'plus-darker', 'plus-lighter']\n }],\n /**\n * Background Blend Mode\n * @see https://tailwindcss.com/docs/background-blend-mode\n */\n 'bg-blend': [{\n 'bg-blend': scaleBlendMode()\n }],\n /**\n * Mask Clip\n * @see https://tailwindcss.com/docs/mask-clip\n */\n 'mask-clip': [{\n 'mask-clip': ['border', 'padding', 'content', 'fill', 'stroke', 'view']\n }, 'mask-no-clip'],\n /**\n * Mask Composite\n * @see https://tailwindcss.com/docs/mask-composite\n */\n 'mask-composite': [{\n mask: ['add', 'subtract', 'intersect', 'exclude']\n }],\n /**\n * Mask Image\n * @see https://tailwindcss.com/docs/mask-image\n */\n 'mask-image-linear-pos': [{\n 'mask-linear': [isNumber]\n }],\n 'mask-image-linear-from-pos': [{\n 'mask-linear-from': scaleMaskImagePosition()\n }],\n 'mask-image-linear-to-pos': [{\n 'mask-linear-to': scaleMaskImagePosition()\n }],\n 'mask-image-linear-from-color': [{\n 'mask-linear-from': scaleColor()\n }],\n 'mask-image-linear-to-color': [{\n 'mask-linear-to': scaleColor()\n }],\n 'mask-image-t-from-pos': [{\n 'mask-t-from': scaleMaskImagePosition()\n }],\n 'mask-image-t-to-pos': [{\n 'mask-t-to': scaleMaskImagePosition()\n }],\n 'mask-image-t-from-color': [{\n 'mask-t-from': scaleColor()\n }],\n 'mask-image-t-to-color': [{\n 'mask-t-to': scaleColor()\n }],\n 'mask-image-r-from-pos': [{\n 'mask-r-from': scaleMaskImagePosition()\n }],\n 'mask-image-r-to-pos': [{\n 'mask-r-to': scaleMaskImagePosition()\n }],\n 'mask-image-r-from-color': [{\n 'mask-r-from': scaleColor()\n }],\n 'mask-image-r-to-color': [{\n 'mask-r-to': scaleColor()\n }],\n 'mask-image-b-from-pos': [{\n 'mask-b-from': scaleMaskImagePosition()\n }],\n 'mask-image-b-to-pos': [{\n 'mask-b-to': scaleMaskImagePosition()\n }],\n 'mask-image-b-from-color': [{\n 'mask-b-from': scaleColor()\n }],\n 'mask-image-b-to-color': [{\n 'mask-b-to': scaleColor()\n }],\n 'mask-image-l-from-pos': [{\n 'mask-l-from': scaleMaskImagePosition()\n }],\n 'mask-image-l-to-pos': [{\n 'mask-l-to': scaleMaskImagePosition()\n }],\n 'mask-image-l-from-color': [{\n 'mask-l-from': scaleColor()\n }],\n 'mask-image-l-to-color': [{\n 'mask-l-to': scaleColor()\n }],\n 'mask-image-x-from-pos': [{\n 'mask-x-from': scaleMaskImagePosition()\n }],\n 'mask-image-x-to-pos': [{\n 'mask-x-to': scaleMaskImagePosition()\n }],\n 'mask-image-x-from-color': [{\n 'mask-x-from': scaleColor()\n }],\n 'mask-image-x-to-color': [{\n 'mask-x-to': scaleColor()\n }],\n 'mask-image-y-from-pos': [{\n 'mask-y-from': scaleMaskImagePosition()\n }],\n 'mask-image-y-to-pos': [{\n 'mask-y-to': scaleMaskImagePosition()\n }],\n 'mask-image-y-from-color': [{\n 'mask-y-from': scaleColor()\n }],\n 'mask-image-y-to-color': [{\n 'mask-y-to': scaleColor()\n }],\n 'mask-image-radial': [{\n 'mask-radial': [isArbitraryVariable, isArbitraryValue]\n }],\n 'mask-image-radial-from-pos': [{\n 'mask-radial-from': scaleMaskImagePosition()\n }],\n 'mask-image-radial-to-pos': [{\n 'mask-radial-to': scaleMaskImagePosition()\n }],\n 'mask-image-radial-from-color': [{\n 'mask-radial-from': scaleColor()\n }],\n 'mask-image-radial-to-color': [{\n 'mask-radial-to': scaleColor()\n }],\n 'mask-image-radial-shape': [{\n 'mask-radial': ['circle', 'ellipse']\n }],\n 'mask-image-radial-size': [{\n 'mask-radial': [{\n closest: ['side', 'corner'],\n farthest: ['side', 'corner']\n }]\n }],\n 'mask-image-radial-pos': [{\n 'mask-radial-at': scalePosition()\n }],\n 'mask-image-conic-pos': [{\n 'mask-conic': [isNumber]\n }],\n 'mask-image-conic-from-pos': [{\n 'mask-conic-from': scaleMaskImagePosition()\n }],\n 'mask-image-conic-to-pos': [{\n 'mask-conic-to': scaleMaskImagePosition()\n }],\n 'mask-image-conic-from-color': [{\n 'mask-conic-from': scaleColor()\n }],\n 'mask-image-conic-to-color': [{\n 'mask-conic-to': scaleColor()\n }],\n /**\n * Mask Mode\n * @see https://tailwindcss.com/docs/mask-mode\n */\n 'mask-mode': [{\n mask: ['alpha', 'luminance', 'match']\n }],\n /**\n * Mask Origin\n * @see https://tailwindcss.com/docs/mask-origin\n */\n 'mask-origin': [{\n 'mask-origin': ['border', 'padding', 'content', 'fill', 'stroke', 'view']\n }],\n /**\n * Mask Position\n * @see https://tailwindcss.com/docs/mask-position\n */\n 'mask-position': [{\n mask: scaleBgPosition()\n }],\n /**\n * Mask Repeat\n * @see https://tailwindcss.com/docs/mask-repeat\n */\n 'mask-repeat': [{\n mask: scaleBgRepeat()\n }],\n /**\n * Mask Size\n * @see https://tailwindcss.com/docs/mask-size\n */\n 'mask-size': [{\n mask: scaleBgSize()\n }],\n /**\n * Mask Type\n * @see https://tailwindcss.com/docs/mask-type\n */\n 'mask-type': [{\n 'mask-type': ['alpha', 'luminance']\n }],\n /**\n * Mask Image\n * @see https://tailwindcss.com/docs/mask-image\n */\n 'mask-image': [{\n mask: ['none', isArbitraryVariable, isArbitraryValue]\n }],\n // ---------------\n // --- Filters ---\n // ---------------\n /**\n * Filter\n * @see https://tailwindcss.com/docs/filter\n */\n filter: [{\n filter: [\n // Deprecated since Tailwind CSS v3.0.0\n '', 'none', isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Blur\n * @see https://tailwindcss.com/docs/blur\n */\n blur: [{\n blur: scaleBlur()\n }],\n /**\n * Brightness\n * @see https://tailwindcss.com/docs/brightness\n */\n brightness: [{\n brightness: [isNumber, isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Contrast\n * @see https://tailwindcss.com/docs/contrast\n */\n contrast: [{\n contrast: [isNumber, isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Drop Shadow\n * @see https://tailwindcss.com/docs/drop-shadow\n */\n 'drop-shadow': [{\n 'drop-shadow': [\n // Deprecated since Tailwind CSS v4.0.0\n '', 'none', themeDropShadow, isArbitraryVariableShadow, isArbitraryShadow]\n }],\n /**\n * Drop Shadow Color\n * @see https://tailwindcss.com/docs/filter-drop-shadow#setting-the-shadow-color\n */\n 'drop-shadow-color': [{\n 'drop-shadow': scaleColor()\n }],\n /**\n * Grayscale\n * @see https://tailwindcss.com/docs/grayscale\n */\n grayscale: [{\n grayscale: ['', isNumber, isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Hue Rotate\n * @see https://tailwindcss.com/docs/hue-rotate\n */\n 'hue-rotate': [{\n 'hue-rotate': [isNumber, isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Invert\n * @see https://tailwindcss.com/docs/invert\n */\n invert: [{\n invert: ['', isNumber, isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Saturate\n * @see https://tailwindcss.com/docs/saturate\n */\n saturate: [{\n saturate: [isNumber, isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Sepia\n * @see https://tailwindcss.com/docs/sepia\n */\n sepia: [{\n sepia: ['', isNumber, isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Backdrop Filter\n * @see https://tailwindcss.com/docs/backdrop-filter\n */\n 'backdrop-filter': [{\n 'backdrop-filter': [\n // Deprecated since Tailwind CSS v3.0.0\n '', 'none', isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Backdrop Blur\n * @see https://tailwindcss.com/docs/backdrop-blur\n */\n 'backdrop-blur': [{\n 'backdrop-blur': scaleBlur()\n }],\n /**\n * Backdrop Brightness\n * @see https://tailwindcss.com/docs/backdrop-brightness\n */\n 'backdrop-brightness': [{\n 'backdrop-brightness': [isNumber, isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Backdrop Contrast\n * @see https://tailwindcss.com/docs/backdrop-contrast\n */\n 'backdrop-contrast': [{\n 'backdrop-contrast': [isNumber, isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Backdrop Grayscale\n * @see https://tailwindcss.com/docs/backdrop-grayscale\n */\n 'backdrop-grayscale': [{\n 'backdrop-grayscale': ['', isNumber, isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Backdrop Hue Rotate\n * @see https://tailwindcss.com/docs/backdrop-hue-rotate\n */\n 'backdrop-hue-rotate': [{\n 'backdrop-hue-rotate': [isNumber, isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Backdrop Invert\n * @see https://tailwindcss.com/docs/backdrop-invert\n */\n 'backdrop-invert': [{\n 'backdrop-invert': ['', isNumber, isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Backdrop Opacity\n * @see https://tailwindcss.com/docs/backdrop-opacity\n */\n 'backdrop-opacity': [{\n 'backdrop-opacity': [isNumber, isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Backdrop Saturate\n * @see https://tailwindcss.com/docs/backdrop-saturate\n */\n 'backdrop-saturate': [{\n 'backdrop-saturate': [isNumber, isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Backdrop Sepia\n * @see https://tailwindcss.com/docs/backdrop-sepia\n */\n 'backdrop-sepia': [{\n 'backdrop-sepia': ['', isNumber, isArbitraryVariable, isArbitraryValue]\n }],\n // --------------\n // --- Tables ---\n // --------------\n /**\n * Border Collapse\n * @see https://tailwindcss.com/docs/border-collapse\n */\n 'border-collapse': [{\n border: ['collapse', 'separate']\n }],\n /**\n * Border Spacing\n * @see https://tailwindcss.com/docs/border-spacing\n */\n 'border-spacing': [{\n 'border-spacing': scaleUnambiguousSpacing()\n }],\n /**\n * Border Spacing X\n * @see https://tailwindcss.com/docs/border-spacing\n */\n 'border-spacing-x': [{\n 'border-spacing-x': scaleUnambiguousSpacing()\n }],\n /**\n * Border Spacing Y\n * @see https://tailwindcss.com/docs/border-spacing\n */\n 'border-spacing-y': [{\n 'border-spacing-y': scaleUnambiguousSpacing()\n }],\n /**\n * Table Layout\n * @see https://tailwindcss.com/docs/table-layout\n */\n 'table-layout': [{\n table: ['auto', 'fixed']\n }],\n /**\n * Caption Side\n * @see https://tailwindcss.com/docs/caption-side\n */\n caption: [{\n caption: ['top', 'bottom']\n }],\n // ---------------------------------\n // --- Transitions and Animation ---\n // ---------------------------------\n /**\n * Transition Property\n * @see https://tailwindcss.com/docs/transition-property\n */\n transition: [{\n transition: ['', 'all', 'colors', 'opacity', 'shadow', 'transform', 'none', isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Transition Behavior\n * @see https://tailwindcss.com/docs/transition-behavior\n */\n 'transition-behavior': [{\n transition: ['normal', 'discrete']\n }],\n /**\n * Transition Duration\n * @see https://tailwindcss.com/docs/transition-duration\n */\n duration: [{\n duration: [isNumber, 'initial', isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Transition Timing Function\n * @see https://tailwindcss.com/docs/transition-timing-function\n */\n ease: [{\n ease: ['linear', 'initial', themeEase, isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Transition Delay\n * @see https://tailwindcss.com/docs/transition-delay\n */\n delay: [{\n delay: [isNumber, isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Animation\n * @see https://tailwindcss.com/docs/animation\n */\n animate: [{\n animate: ['none', themeAnimate, isArbitraryVariable, isArbitraryValue]\n }],\n // ------------------\n // --- Transforms ---\n // ------------------\n /**\n * Backface Visibility\n * @see https://tailwindcss.com/docs/backface-visibility\n */\n backface: [{\n backface: ['hidden', 'visible']\n }],\n /**\n * Perspective\n * @see https://tailwindcss.com/docs/perspective\n */\n perspective: [{\n perspective: [themePerspective, isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Perspective Origin\n * @see https://tailwindcss.com/docs/perspective-origin\n */\n 'perspective-origin': [{\n 'perspective-origin': scalePositionWithArbitrary()\n }],\n /**\n * Rotate\n * @see https://tailwindcss.com/docs/rotate\n */\n rotate: [{\n rotate: scaleRotate()\n }],\n /**\n * Rotate X\n * @see https://tailwindcss.com/docs/rotate\n */\n 'rotate-x': [{\n 'rotate-x': scaleRotate()\n }],\n /**\n * Rotate Y\n * @see https://tailwindcss.com/docs/rotate\n */\n 'rotate-y': [{\n 'rotate-y': scaleRotate()\n }],\n /**\n * Rotate Z\n * @see https://tailwindcss.com/docs/rotate\n */\n 'rotate-z': [{\n 'rotate-z': scaleRotate()\n }],\n /**\n * Scale\n * @see https://tailwindcss.com/docs/scale\n */\n scale: [{\n scale: scaleScale()\n }],\n /**\n * Scale X\n * @see https://tailwindcss.com/docs/scale\n */\n 'scale-x': [{\n 'scale-x': scaleScale()\n }],\n /**\n * Scale Y\n * @see https://tailwindcss.com/docs/scale\n */\n 'scale-y': [{\n 'scale-y': scaleScale()\n }],\n /**\n * Scale Z\n * @see https://tailwindcss.com/docs/scale\n */\n 'scale-z': [{\n 'scale-z': scaleScale()\n }],\n /**\n * Scale 3D\n * @see https://tailwindcss.com/docs/scale\n */\n 'scale-3d': ['scale-3d'],\n /**\n * Skew\n * @see https://tailwindcss.com/docs/skew\n */\n skew: [{\n skew: scaleSkew()\n }],\n /**\n * Skew X\n * @see https://tailwindcss.com/docs/skew\n */\n 'skew-x': [{\n 'skew-x': scaleSkew()\n }],\n /**\n * Skew Y\n * @see https://tailwindcss.com/docs/skew\n */\n 'skew-y': [{\n 'skew-y': scaleSkew()\n }],\n /**\n * Transform\n * @see https://tailwindcss.com/docs/transform\n */\n transform: [{\n transform: [isArbitraryVariable, isArbitraryValue, '', 'none', 'gpu', 'cpu']\n }],\n /**\n * Transform Origin\n * @see https://tailwindcss.com/docs/transform-origin\n */\n 'transform-origin': [{\n origin: scalePositionWithArbitrary()\n }],\n /**\n * Transform Style\n * @see https://tailwindcss.com/docs/transform-style\n */\n 'transform-style': [{\n transform: ['3d', 'flat']\n }],\n /**\n * Translate\n * @see https://tailwindcss.com/docs/translate\n */\n translate: [{\n translate: scaleTranslate()\n }],\n /**\n * Translate X\n * @see https://tailwindcss.com/docs/translate\n */\n 'translate-x': [{\n 'translate-x': scaleTranslate()\n }],\n /**\n * Translate Y\n * @see https://tailwindcss.com/docs/translate\n */\n 'translate-y': [{\n 'translate-y': scaleTranslate()\n }],\n /**\n * Translate Z\n * @see https://tailwindcss.com/docs/translate\n */\n 'translate-z': [{\n 'translate-z': scaleTranslate()\n }],\n /**\n * Translate None\n * @see https://tailwindcss.com/docs/translate\n */\n 'translate-none': ['translate-none'],\n // ---------------------\n // --- Interactivity ---\n // ---------------------\n /**\n * Accent Color\n * @see https://tailwindcss.com/docs/accent-color\n */\n accent: [{\n accent: scaleColor()\n }],\n /**\n * Appearance\n * @see https://tailwindcss.com/docs/appearance\n */\n appearance: [{\n appearance: ['none', 'auto']\n }],\n /**\n * Caret Color\n * @see https://tailwindcss.com/docs/just-in-time-mode#caret-color-utilities\n */\n 'caret-color': [{\n caret: scaleColor()\n }],\n /**\n * Color Scheme\n * @see https://tailwindcss.com/docs/color-scheme\n */\n 'color-scheme': [{\n scheme: ['normal', 'dark', 'light', 'light-dark', 'only-dark', 'only-light']\n }],\n /**\n * Cursor\n * @see https://tailwindcss.com/docs/cursor\n */\n cursor: [{\n cursor: ['auto', 'default', 'pointer', 'wait', 'text', 'move', 'help', 'not-allowed', 'none', 'context-menu', 'progress', 'cell', 'crosshair', 'vertical-text', 'alias', 'copy', 'no-drop', 'grab', 'grabbing', 'all-scroll', 'col-resize', 'row-resize', 'n-resize', 'e-resize', 's-resize', 'w-resize', 'ne-resize', 'nw-resize', 'se-resize', 'sw-resize', 'ew-resize', 'ns-resize', 'nesw-resize', 'nwse-resize', 'zoom-in', 'zoom-out', isArbitraryVariable, isArbitraryValue]\n }],\n /**\n * Field Sizing\n * @see https://tailwindcss.com/docs/field-sizing\n */\n 'field-sizing': [{\n 'field-sizing': ['fixed', 'content']\n }],\n /**\n * Pointer Events\n * @see https://tailwindcss.com/docs/pointer-events\n */\n 'pointer-events': [{\n 'pointer-events': ['auto', 'none']\n }],\n /**\n * Resize\n * @see https://tailwindcss.com/docs/resize\n */\n resize: [{\n resize: ['none', '', 'y', 'x']\n }],\n /**\n * Scroll Behavior\n * @see https://tailwindcss.com/docs/scroll-behavior\n */\n 'scroll-behavior': [{\n scroll: ['auto', 'smooth']\n }],\n /**\n * Scroll Margin\n * @see https://tailwindcss.com/docs/scroll-margin\n */\n 'scroll-m': [{\n 'scroll-m': scaleUnambiguousSpacing()\n }],\n /**\n * Scroll Margin Inline\n * @see https://tailwindcss.com/docs/scroll-margin\n */\n 'scroll-mx': [{\n 'scroll-mx': scaleUnambiguousSpacing()\n }],\n /**\n * Scroll Margin Block\n * @see https://tailwindcss.com/docs/scroll-margin\n */\n 'scroll-my': [{\n 'scroll-my': scaleUnambiguousSpacing()\n }],\n /**\n * Scroll Margin Inline Start\n * @see https://tailwindcss.com/docs/scroll-margin\n */\n 'scroll-ms': [{\n 'scroll-ms': scaleUnambiguousSpacing()\n }],\n /**\n * Scroll Margin Inline End\n * @see https://tailwindcss.com/docs/scroll-margin\n */\n 'scroll-me': [{\n 'scroll-me': scaleUnambiguousSpacing()\n }],\n /**\n * Scroll Margin Block Start\n * @see https://tailwindcss.com/docs/scroll-margin\n */\n 'scroll-mbs': [{\n 'scroll-mbs': scaleUnambiguousSpacing()\n }],\n /**\n * Scroll Margin Block End\n * @see https://tailwindcss.com/docs/scroll-margin\n */\n 'scroll-mbe': [{\n 'scroll-mbe': scaleUnambiguousSpacing()\n }],\n /**\n * Scroll Margin Top\n * @see https://tailwindcss.com/docs/scroll-margin\n */\n 'scroll-mt': [{\n 'scroll-mt': scaleUnambiguousSpacing()\n }],\n /**\n * Scroll Margin Right\n * @see https://tailwindcss.com/docs/scroll-margin\n */\n 'scroll-mr': [{\n 'scroll-mr': scaleUnambiguousSpacing()\n }],\n /**\n * Scroll Margin Bottom\n * @see https://tailwindcss.com/docs/scroll-margin\n */\n 'scroll-mb': [{\n 'scroll-mb': scaleUnambiguousSpacing()\n }],\n /**\n * Scroll Margin Left\n * @see https://tailwindcss.com/docs/scroll-margin\n */\n 'scroll-ml': [{\n 'scroll-ml': scaleUnambiguousSpacing()\n }],\n /**\n * Scroll Padding\n * @see https://tailwindcss.com/docs/scroll-padding\n */\n 'scroll-p': [{\n 'scroll-p': scaleUnambiguousSpacing()\n }],\n /**\n * Scroll Padding Inline\n * @see https://tailwindcss.com/docs/scroll-padding\n */\n 'scroll-px': [{\n 'scroll-px': scaleUnambiguousSpacing()\n }],\n /**\n * Scroll Padding Block\n * @see https://tailwindcss.com/docs/scroll-padding\n */\n 'scroll-py': [{\n 'scroll-py': scaleUnambiguousSpacing()\n }],\n /**\n * Scroll Padding Inline Start\n * @see https://tailwindcss.com/docs/scroll-padding\n */\n 'scroll-ps': [{\n 'scroll-ps': scaleUnambiguousSpacing()\n }],\n /**\n * Scroll Padding Inline End\n * @see https://tailwindcss.com/docs/scroll-padding\n */\n 'scroll-pe': [{\n 'scroll-pe': scaleUnambiguousSpacing()\n }],\n /**\n * Scroll Padding Block Start\n * @see https://tailwindcss.com/docs/scroll-padding\n */\n 'scroll-pbs': [{\n 'scroll-pbs': scaleUnambiguousSpacing()\n }],\n /**\n * Scroll Padding Block End\n * @see https://tailwindcss.com/docs/scroll-padding\n */\n 'scroll-pbe': [{\n 'scroll-pbe': scaleUnambiguousSpacing()\n }],\n /**\n * Scroll Padding Top\n * @see https://tailwindcss.com/docs/scroll-padding\n */\n 'scroll-pt': [{\n 'scroll-pt': scaleUnambiguousSpacing()\n }],\n /**\n * Scroll Padding Right\n * @see https://tailwindcss.com/docs/scroll-padding\n */\n 'scroll-pr': [{\n 'scroll-pr': scaleUnambiguousSpacing()\n }],\n /**\n * Scroll Padding Bottom\n * @see https://tailwindcss.com/docs/scroll-padding\n */\n 'scroll-pb': [{\n 'scroll-pb': scaleUnambiguousSpacing()\n }],\n /**\n * Scroll Padding Left\n * @see https://tailwindcss.com/docs/scroll-padding\n */\n 'scroll-pl': [{\n 'scroll-pl': scaleUnambiguousSpacing()\n }],\n /**\n * Scroll Snap Align\n * @see https://tailwindcss.com/docs/scroll-snap-align\n */\n 'snap-align': [{\n snap: ['start', 'end', 'center', 'align-none']\n }],\n /**\n * Scroll Snap Stop\n * @see https://tailwindcss.com/docs/scroll-snap-stop\n */\n 'snap-stop': [{\n snap: ['normal', 'always']\n }],\n /**\n * Scroll Snap Type\n * @see https://tailwindcss.com/docs/scroll-snap-type\n */\n 'snap-type': [{\n snap: ['none', 'x', 'y', 'both']\n }],\n /**\n * Scroll Snap Type Strictness\n * @see https://tailwindcss.com/docs/scroll-snap-type\n */\n 'snap-strictness': [{\n snap: ['mandatory', 'proximity']\n }],\n /**\n * Touch Action\n * @see https://tailwindcss.com/docs/touch-action\n */\n touch: [{\n touch: ['auto', 'none', 'manipulation']\n }],\n /**\n * Touch Action X\n * @see https://tailwindcss.com/docs/touch-action\n */\n 'touch-x': [{\n 'touch-pan': ['x', 'left', 'right']\n }],\n /**\n * Touch Action Y\n * @see https://tailwindcss.com/docs/touch-action\n */\n 'touch-y': [{\n 'touch-pan': ['y', 'up', 'down']\n }],\n /**\n * Touch Action Pinch Zoom\n * @see https://tailwindcss.com/docs/touch-action\n */\n 'touch-pz': ['touch-pinch-zoom'],\n /**\n * User Select\n * @see https://tailwindcss.com/docs/user-select\n */\n select: [{\n select: ['none', 'text', 'all', 'auto']\n }],\n /**\n * Will Change\n * @see https://tailwindcss.com/docs/will-change\n */\n 'will-change': [{\n 'will-change': ['auto', 'scroll', 'contents', 'transform', isArbitraryVariable, isArbitraryValue]\n }],\n // -----------\n // --- SVG ---\n // -----------\n /**\n * Fill\n * @see https://tailwindcss.com/docs/fill\n */\n fill: [{\n fill: ['none', ...scaleColor()]\n }],\n /**\n * Stroke Width\n * @see https://tailwindcss.com/docs/stroke-width\n */\n 'stroke-w': [{\n stroke: [isNumber, isArbitraryVariableLength, isArbitraryLength, isArbitraryNumber]\n }],\n /**\n * Stroke\n * @see https://tailwindcss.com/docs/stroke\n */\n stroke: [{\n stroke: ['none', ...scaleColor()]\n }],\n // ---------------------\n // --- Accessibility ---\n // ---------------------\n /**\n * Forced Color Adjust\n * @see https://tailwindcss.com/docs/forced-color-adjust\n */\n 'forced-color-adjust': [{\n 'forced-color-adjust': ['auto', 'none']\n }]\n },\n conflictingClassGroups: {\n overflow: ['overflow-x', 'overflow-y'],\n overscroll: ['overscroll-x', 'overscroll-y'],\n inset: ['inset-x', 'inset-y', 'inset-bs', 'inset-be', 'start', 'end', 'top', 'right', 'bottom', 'left'],\n 'inset-x': ['right', 'left'],\n 'inset-y': ['top', 'bottom'],\n flex: ['basis', 'grow', 'shrink'],\n gap: ['gap-x', 'gap-y'],\n p: ['px', 'py', 'ps', 'pe', 'pbs', 'pbe', 'pt', 'pr', 'pb', 'pl'],\n px: ['pr', 'pl'],\n py: ['pt', 'pb'],\n m: ['mx', 'my', 'ms', 'me', 'mbs', 'mbe', 'mt', 'mr', 'mb', 'ml'],\n mx: ['mr', 'ml'],\n my: ['mt', 'mb'],\n size: ['w', 'h'],\n 'font-size': ['leading'],\n 'fvn-normal': ['fvn-ordinal', 'fvn-slashed-zero', 'fvn-figure', 'fvn-spacing', 'fvn-fraction'],\n 'fvn-ordinal': ['fvn-normal'],\n 'fvn-slashed-zero': ['fvn-normal'],\n 'fvn-figure': ['fvn-normal'],\n 'fvn-spacing': ['fvn-normal'],\n 'fvn-fraction': ['fvn-normal'],\n 'line-clamp': ['display', 'overflow'],\n rounded: ['rounded-s', 'rounded-e', 'rounded-t', 'rounded-r', 'rounded-b', 'rounded-l', 'rounded-ss', 'rounded-se', 'rounded-ee', 'rounded-es', 'rounded-tl', 'rounded-tr', 'rounded-br', 'rounded-bl'],\n 'rounded-s': ['rounded-ss', 'rounded-es'],\n 'rounded-e': ['rounded-se', 'rounded-ee'],\n 'rounded-t': ['rounded-tl', 'rounded-tr'],\n 'rounded-r': ['rounded-tr', 'rounded-br'],\n 'rounded-b': ['rounded-br', 'rounded-bl'],\n 'rounded-l': ['rounded-tl', 'rounded-bl'],\n 'border-spacing': ['border-spacing-x', 'border-spacing-y'],\n 'border-w': ['border-w-x', 'border-w-y', 'border-w-s', 'border-w-e', 'border-w-bs', 'border-w-be', 'border-w-t', 'border-w-r', 'border-w-b', 'border-w-l'],\n 'border-w-x': ['border-w-r', 'border-w-l'],\n 'border-w-y': ['border-w-t', 'border-w-b'],\n 'border-color': ['border-color-x', 'border-color-y', 'border-color-s', 'border-color-e', 'border-color-bs', 'border-color-be', 'border-color-t', 'border-color-r', 'border-color-b', 'border-color-l'],\n 'border-color-x': ['border-color-r', 'border-color-l'],\n 'border-color-y': ['border-color-t', 'border-color-b'],\n translate: ['translate-x', 'translate-y', 'translate-none'],\n 'translate-none': ['translate', 'translate-x', 'translate-y', 'translate-z'],\n 'scroll-m': ['scroll-mx', 'scroll-my', 'scroll-ms', 'scroll-me', 'scroll-mbs', 'scroll-mbe', 'scroll-mt', 'scroll-mr', 'scroll-mb', 'scroll-ml'],\n 'scroll-mx': ['scroll-mr', 'scroll-ml'],\n 'scroll-my': ['scroll-mt', 'scroll-mb'],\n 'scroll-p': ['scroll-px', 'scroll-py', 'scroll-ps', 'scroll-pe', 'scroll-pbs', 'scroll-pbe', 'scroll-pt', 'scroll-pr', 'scroll-pb', 'scroll-pl'],\n 'scroll-px': ['scroll-pr', 'scroll-pl'],\n 'scroll-py': ['scroll-pt', 'scroll-pb'],\n touch: ['touch-x', 'touch-y', 'touch-pz'],\n 'touch-x': ['touch'],\n 'touch-y': ['touch'],\n 'touch-pz': ['touch']\n },\n conflictingClassGroupModifiers: {\n 'font-size': ['leading']\n },\n orderSensitiveModifiers: ['*', '**', 'after', 'backdrop', 'before', 'details-content', 'file', 'first-letter', 'first-line', 'marker', 'placeholder', 'selection']\n };\n};\n\n/**\n * @param baseConfig Config where other config will be merged into. This object will be mutated.\n * @param configExtension Partial config to merge into the `baseConfig`.\n */\nconst mergeConfigs = (baseConfig, {\n cacheSize,\n prefix,\n experimentalParseClassName,\n extend = {},\n override = {}\n}) => {\n overrideProperty(baseConfig, 'cacheSize', cacheSize);\n overrideProperty(baseConfig, 'prefix', prefix);\n overrideProperty(baseConfig, 'experimentalParseClassName', experimentalParseClassName);\n overrideConfigProperties(baseConfig.theme, override.theme);\n overrideConfigProperties(baseConfig.classGroups, override.classGroups);\n overrideConfigProperties(baseConfig.conflictingClassGroups, override.conflictingClassGroups);\n overrideConfigProperties(baseConfig.conflictingClassGroupModifiers, override.conflictingClassGroupModifiers);\n overrideProperty(baseConfig, 'orderSensitiveModifiers', override.orderSensitiveModifiers);\n mergeConfigProperties(baseConfig.theme, extend.theme);\n mergeConfigProperties(baseConfig.classGroups, extend.classGroups);\n mergeConfigProperties(baseConfig.conflictingClassGroups, extend.conflictingClassGroups);\n mergeConfigProperties(baseConfig.conflictingClassGroupModifiers, extend.conflictingClassGroupModifiers);\n mergeArrayProperties(baseConfig, extend, 'orderSensitiveModifiers');\n return baseConfig;\n};\nconst overrideProperty = (baseObject, overrideKey, overrideValue) => {\n if (overrideValue !== undefined) {\n baseObject[overrideKey] = overrideValue;\n }\n};\nconst overrideConfigProperties = (baseObject, overrideObject) => {\n if (overrideObject) {\n for (const key in overrideObject) {\n overrideProperty(baseObject, key, overrideObject[key]);\n }\n }\n};\nconst mergeConfigProperties = (baseObject, mergeObject) => {\n if (mergeObject) {\n for (const key in mergeObject) {\n mergeArrayProperties(baseObject, mergeObject, key);\n }\n }\n};\nconst mergeArrayProperties = (baseObject, mergeObject, key) => {\n const mergeValue = mergeObject[key];\n if (mergeValue !== undefined) {\n baseObject[key] = baseObject[key] ? baseObject[key].concat(mergeValue) : mergeValue;\n }\n};\nconst extendTailwindMerge = (configExtension, ...createConfig) => typeof configExtension === 'function' ? createTailwindMerge(getDefaultConfig, configExtension, ...createConfig) : createTailwindMerge(() => mergeConfigs(getDefaultConfig(), configExtension), ...createConfig);\nconst twMerge = /*#__PURE__*/createTailwindMerge(getDefaultConfig);\nexport { createTailwindMerge, extendTailwindMerge, fromTheme, getDefaultConfig, mergeConfigs, twJoin, twMerge, validators };\n//# sourceMappingURL=bundle-mjs.mjs.map\n","/**\n * Sizing Tokens\n *\n * Shared size class mappings for consistent component sizing across the design system.\n * Single source of truth for all component size variants.\n */\n// =============================================================================\n// FORM CONTROLS\n// =============================================================================\n/**\n * Form input sizes - for Input component with fixed heights\n * Uses explicit heights for consistent toolbar alignment.\n */\nexport const formInputSizes = {\n sm: 'h-9 px-3 text-sm',\n md: 'h-10 px-4 text-sm',\n lg: 'h-12 px-4 text-base',\n};\n/**\n * Form control sizes - for Select and other form controls\n * Uses explicit heights to match buttons and inputs for toolbar alignment.\n */\nexport const formControlSizes = {\n sm: 'h-9 px-3 text-sm',\n md: 'h-10 px-4 text-sm',\n lg: 'h-12 px-4 text-base',\n};\n// =============================================================================\n// ICON/SPINNER SIZES\n// =============================================================================\n/**\n * Icon dimension sizes - width and height classes for icons and spinners.\n * Used by Spinner and icon-only components.\n */\nexport const iconSizes = {\n xs: 'w-3 h-3',\n sm: 'w-4 h-4',\n md: 'w-8 h-8',\n lg: 'w-12 h-12',\n xl: 'w-16 h-16',\n};\n// =============================================================================\n// BADGE SIZES\n// =============================================================================\n/**\n * Badge sizes - text, padding, and font weight for badges.\n */\nexport const badgeSizes = {\n xs: 'text-xs px-1.5 py-0.5 font-medium',\n sm: 'text-xs px-2 py-0.5 font-medium',\n md: 'text-xs px-2.5 py-0.5 font-medium',\n lg: 'text-sm px-3 py-0.5 font-medium',\n};\n/**\n * Legacy badge size name mapping for backwards compatibility.\n */\nexport const badgeSizeLegacyMap = {\n small: 'sm',\n medium: 'md',\n large: 'lg',\n};\n// =============================================================================\n// SKELETON SIZES\n// =============================================================================\n/**\n * Skeleton line height sizes - for loading placeholder lines.\n */\nexport const skeletonSizes = {\n sm: 'h-2',\n md: 'h-2.5',\n lg: 'h-3',\n xl: 'h-3.5',\n '2xl': 'h-4',\n};\n// =============================================================================\n// BUTTON SIZES\n// =============================================================================\n/**\n * Standard button sizes - padding, text sizing, and explicit heights for consistency.\n * All toolbar elements (buttons, inputs, selects) should align at the same height.\n */\nexport const buttonSizes = {\n xs: 'h-8 px-3 text-xs',\n sm: 'h-9 px-3 text-sm',\n md: 'h-10 px-4 text-sm',\n lg: 'h-11 px-5 text-sm',\n xl: 'h-12 px-6 text-sm',\n 'xl-medium': 'w-full h-12 px-6 text-sm',\n full: 'w-full h-11 px-5 text-sm',\n 'full-md-auto': 'w-full h-11 px-5 text-sm md:w-auto',\n half: 'w-1/2 h-10 px-4 text-sm',\n // Landing page hero buttons - taller with larger text\n landing: 'h-12 sm:h-14 px-6 sm:px-8 text-base sm:text-lg',\n};\n/**\n * Icon-only button sizes - padding only, no text.\n */\nexport const buttonIconSizes = {\n xs: 'p-1.5',\n sm: 'p-2',\n md: 'p-2.5',\n lg: 'p-3',\n};\n/**\n * Avatar button sizes - minimal padding, just dimensions.\n */\nexport const buttonAvatarSizes = {\n sm: 'min-w-8 min-h-8',\n md: 'min-w-10 min-h-10',\n lg: 'min-w-12 min-h-12',\n};\n/**\n * Menu item button sizes - for dropdown and sheet items.\n */\nexport const buttonMenuItemSizes = {\n sm: 'py-2 px-4 text-sm',\n md: 'py-3 px-4 text-sm',\n lg: 'py-4 px-6 text-base',\n nav: 'py-2 px-3 text-base font-normal',\n};\n/**\n * Card button sizes - larger padding for card-like buttons.\n */\nexport const buttonCardSizes = {\n sm: 'p-3 text-sm',\n md: 'p-4 text-sm',\n lg: 'p-5 text-base',\n};\n","/**\n * Haptic Feedback Utility\n *\n * Provides tactile feedback for user actions across iOS, Android, and web.\n * Part of QOL Bible - \"Instant Response to Every Touch\"\n *\n * Supports:\n * - iOS WebKit (native app wrapper)\n * - iOS TapticEngine (older API)\n * - Android/Web Vibration API (fallback)\n *\n * Usage:\n * import { triggerHaptic } from './haptic';\n * triggerHaptic('success'); // On form submission success\n * triggerHaptic('light'); // On toggle/selection\n * triggerHaptic('heavy'); // On destructive action confirmation\n */\n// Vibration durations in ms for each style\nconst VIBRATION_PATTERNS = {\n light: 10,\n medium: 20,\n heavy: 30,\n success: [10, 50, 20], // double tap feel\n warning: [20, 40, 20],\n error: [30, 50, 30, 50, 30], // triple pulse\n selection: 8, // very light for toggles/checkboxes\n};\n/**\n * Trigger haptic feedback\n *\n * @param style - The haptic intensity/pattern\n * - light: Subtle confirmation (toggles, selections)\n * - medium: Standard confirmation (form saves, status changes)\n * - heavy: Strong confirmation (destructive actions, transfers)\n * - success: Double-tap pattern for achievements\n * - warning: Alert pattern\n * - error: Triple-pulse for errors\n * - selection: Very light for toggle/checkbox state changes\n */\nexport function triggerHaptic(style = 'light') {\n if (typeof window === 'undefined')\n return;\n // iOS WebKit bridge (native app wrapper)\n // @ts-expect-error - iOS WebKit\n if (window.webkit?.messageHandlers?.haptic) {\n // @ts-expect-error - iOS WebKit\n window.webkit.messageHandlers.haptic.postMessage(style);\n return;\n }\n // iOS TapticEngine (older native API)\n // @ts-expect-error - Taptic Engine\n if (window.TapticEngine) {\n // Map our styles to TapticEngine styles\n const tapticStyle = style === 'success' ||\n style === 'warning' ||\n style === 'error' ||\n style === 'selection'\n ? 'medium'\n : style;\n // @ts-expect-error - Taptic Engine\n window.TapticEngine.impact({ style: tapticStyle });\n return;\n }\n // Android/Web Vibration API fallback\n if (navigator.vibrate) {\n const pattern = VIBRATION_PATTERNS[style];\n navigator.vibrate(pattern);\n }\n}\n/**\n * Check if haptic feedback is available on this device\n */\nexport function isHapticAvailable() {\n if (typeof window === 'undefined')\n return false;\n return !!(\n // @ts-expect-error - iOS WebKit\n window.webkit?.messageHandlers?.haptic ||\n // @ts-expect-error - Taptic Engine\n window.TapticEngine ||\n navigator.vibrate);\n}\n/**\n * Map button variants to appropriate haptic styles\n * Used by Button component to provide context-aware feedback\n */\nexport function getHapticForButtonVariant(variant, isSuccess) {\n if (isSuccess)\n return 'success';\n switch (variant) {\n case 'red':\n case 'red-outline':\n case 'ghost-red':\n case 'menu-item-danger':\n return 'heavy'; // Destructive actions get strong feedback\n case 'default':\n case 'outline':\n case 'landing':\n return 'medium'; // Primary actions get standard feedback\n case 'alternative':\n case 'ghost':\n case 'landing-secondary':\n return 'light'; // Secondary actions get subtle feedback\n case 'toggle':\n case 'nav':\n return 'selection'; // Selection changes get very light feedback\n case 'icon':\n case 'menu-item':\n case 'search-result':\n case 'link':\n return null; // These don't need haptic (too frequent or navigation)\n default:\n return 'light';\n }\n}\n","<script lang=\"ts\">\n /**\n * Button Component - Flowbite Native (Pure Tailwind)\n * Migrated to Svelte 5 runes\n *\n * Variants (Flowbite naming):\n * - default: Primary blue button\n * - alternative: Gray outline button\n * - outline: Blue outline button\n * - red: Destructive solid button\n * - red-outline: Destructive outline button\n * - ghost: Text-only button\n * - ghost-red: Destructive text button\n * - icon: Icon-only button\n * - toggle: Toggle/pill button\n * - avatar: Avatar/image trigger button (no padding, opacity hover)\n * - menu-item: Dropdown/sheet menu item (full width, left-aligned)\n * - menu-item-danger: Destructive menu item (red text)\n * - card: Selectable card button (bordered, for list selections)\n * - sidebar-toggle: Compact pill for sidebar expand/collapse\n * - chart-row: Leaderboard/chart list row with progress bar\n * - landing: Primary hero CTA (blue, shadow, rounded-xl)\n * - landing-secondary: Secondary hero CTA (outline, shadow, rounded-xl)\n *\n * Sizes (Flowbite native): xs, sm, md, lg, xl, landing\n *\n * Haptic Feedback:\n * - Automatic haptic on success state transition\n * - Optional haptic on click via `haptic` prop\n * - Variant-aware feedback intensity\n */\n import { CheckOutline } from '../Icons';\n import { twMerge } from 'tailwind-merge';\n import type { Snippet } from 'svelte';\n import {\n buttonSizes,\n buttonIconSizes,\n } from '../../tokens/sizing.js';\n import { triggerHaptic, getHapticForButtonVariant } from '../../utils/haptic.js';\n\n interface Props {\n variant?: string;\n size?: string;\n disabled?: boolean;\n loading?: boolean;\n success?: boolean;\n successText?: string;\n active?: boolean;\n href?: string | null;\n type?: 'button' | 'submit' | 'reset';\n /** Enable haptic feedback on click. When true, uses variant-aware haptic style. */\n haptic?: boolean;\n children?: Snippet;\n trailing?: Snippet;\n class?: string;\n onclick?: (e: MouseEvent) => void;\n [key: string]: unknown;\n }\n\n let {\n variant = \"default\",\n size = \"md\",\n disabled = false,\n loading = false,\n success = false,\n successText = \"\",\n active = false,\n href = null,\n type = \"button\",\n haptic = false,\n children,\n trailing,\n class: className = \"\",\n onclick,\n ...restProps\n }: Props = $props();\n\n // Track previous success state to detect transitions\n let prevSuccess = $state(false);\n\n // Trigger haptic on success state transition (QOL Bible)\n $effect(() => {\n if (success && !prevSuccess) {\n triggerHaptic('success');\n }\n prevSuccess = success;\n });\n\n // Legacy variant name mapping\n const variantMap: Record<string, string> = {\n \"blue-solid\": \"default\",\n \"gray-outline\": \"alternative\",\n \"blue-outline\": \"outline\",\n \"red-solid\": \"red\",\n \"red-text\": \"ghost-red\",\n \"gray-text\": \"ghost\",\n };\n\n // Resolve legacy names\n let resolvedVariant = $derived(variantMap[variant] || variant);\n let effectiveDisabled = $derived(disabled || loading || success);\n\n // Size classes imported from centralized tokens\n\n // Variant classes with all states in Tailwind (no focus rings - design decision)\n // NOTE: menu-item, avatar, nav, card, search-result, landing, sidebar-toggle, calendar-day, chart-row\n // have been extracted to dedicated components: MenuItem, AvatarButton, NavItem, CardAction,\n // SearchResultItem, LandingButton, SidebarToggle. Use those components instead.\n const variantClasses: Record<string, string> = {\n default: \"text-white bg-blue-700 border border-blue-700 hover:bg-blue-800 dark:bg-blue-600 dark:hover:bg-blue-700\",\n alternative: \"text-gray-900 bg-white border border-gray-200 hover:bg-gray-100 hover:text-blue-700 dark:bg-gray-800 dark:text-white dark:border-gray-600 dark:hover:text-white dark:hover:bg-gray-700\",\n outline: \"text-blue-700 bg-transparent border border-blue-700 hover:text-white hover:bg-blue-800 dark:border-blue-500 dark:text-blue-500 dark:hover:text-white dark:hover:bg-blue-500\",\n red: \"text-white bg-red-700 border border-red-700 hover:bg-red-800 dark:bg-red-600 dark:hover:bg-red-700\",\n \"red-outline\": \"text-red-700 bg-transparent border border-red-700 hover:text-white hover:bg-red-800 dark:border-red-500 dark:text-red-500 dark:hover:text-white dark:hover:bg-red-600\",\n \"green-outline\": \"text-green-700 bg-transparent border border-green-700 hover:text-white hover:bg-green-800 dark:border-green-500 dark:text-green-500 dark:hover:text-white dark:hover:bg-green-600\",\n ghost: \"text-gray-500 bg-transparent border-transparent hover:bg-gray-100 hover:text-gray-900 dark:text-gray-400 dark:hover:bg-gray-700 dark:hover:text-white\",\n \"ghost-red\": \"text-red-700 bg-transparent border-transparent hover:bg-red-100 hover:text-red-900 dark:text-red-500 dark:hover:bg-red-900/50 dark:hover:text-red-400\",\n link: \"text-blue-700 bg-transparent border-transparent hover:underline dark:text-blue-500\",\n icon: \"text-gray-500 bg-transparent border-transparent hover:bg-gray-100 dark:text-gray-400 dark:hover:bg-gray-700\",\n toggle: \"text-gray-900 bg-gray-100 border border-gray-200 hover:bg-gray-200 dark:bg-gray-700 dark:text-white dark:border-gray-600 dark:hover:bg-gray-600\",\n success: \"text-white bg-green-600 border border-green-600 hover:bg-green-700 dark:bg-green-600 dark:hover:bg-green-700\",\n };\n\n // Active state classes for ghost and toggle\n // NOTE: menu-item and nav active states are now handled by MenuItem and NavItem components\n const activeClasses: Record<string, string> = {\n ghost: \"text-blue-700 bg-blue-50 dark:text-white dark:bg-gray-900\",\n toggle: \"text-white bg-blue-600 border-blue-600 hover:bg-blue-700 dark:text-white dark:bg-blue-600 dark:border-blue-600 dark:hover:bg-blue-700\",\n };\n\n // Disabled classes\n const disabledClasses = \"bg-gray-200 border-gray-200 text-gray-400 cursor-not-allowed dark:bg-gray-700 dark:border-gray-700 dark:text-gray-500\";\n // Disabled classes for transparent variants (link, ghost) - no background\n const disabledTransparentClasses = \"text-gray-400 cursor-not-allowed dark:text-gray-500\";\n\nlet sizeClass = $derived((() => {\n if (resolvedVariant === \"icon\") return buttonIconSizes[size as keyof typeof buttonIconSizes] || buttonIconSizes.sm;\n if (resolvedVariant === \"link\") return \"text-sm\";\n return buttonSizes[size as keyof typeof buttonSizes] || buttonSizes.md;\n })());\n\n // Variants that should stay transparent when disabled\n const transparentVariants = [\"link\", \"ghost\", \"ghost-red\", \"icon\"];\n\n let variantClass = $derived((() => {\n if (success) return variantClasses.success;\n if (disabled && !loading && !success) {\n return transparentVariants.includes(resolvedVariant)\n ? disabledTransparentClasses\n : disabledClasses;\n }\n if (active && activeClasses[resolvedVariant]) {\n // When active, use ONLY active classes (they include all necessary styling)\n return activeClasses[resolvedVariant];\n }\n return variantClasses[resolvedVariant] || variantClasses.default;\n })());\n\n // Button is always centered - left-aligned variants have been extracted to dedicated components\n let isLeftAligned = $derived(false);\n\n // Use justify-between when there's trailing content (e.g., chevrons in nav items)\n let hasTrailing = $derived(typeof trailing === 'function' || trailing);\n\n // Standard buttons use rounded-lg - landing variants have been extracted to LandingButton\n let roundedClass = $derived(\"rounded-lg\");\n\n // Click handler with optional haptic feedback\n function handleClick(e: MouseEvent) {\n if (haptic && !effectiveDisabled) {\n const hapticStyle = getHapticForButtonVariant(resolvedVariant);\n if (hapticStyle) {\n triggerHaptic(hapticStyle);\n }\n }\n onclick?.(e);\n }\n\n let buttonClasses = $derived(twMerge(\n \"relative\",\n isLeftAligned\n ? (hasTrailing ? \"flex items-center justify-between\" : \"flex items-center justify-start\")\n : \"inline-flex items-center justify-center\",\n roundedClass,\n \"font-medium leading-none\",\n \"focus:outline-hidden\",\n // Apple-style micro-interactions (only when not disabled)\n \"transition-all duration-150 ease-out\",\n effectiveDisabled ? \"\" : \"active:scale-[0.97] active:opacity-90\",\n \"select-none\",\n sizeClass,\n variantClass,\n effectiveDisabled ? \"cursor-not-allowed\" : \"cursor-pointer\",\n className\n ));\n</script>\n\n{#if href}\n <a\n {href}\n class=\"{buttonClasses} {loading ? 'loading-pulse' : ''}\"\n onclick={handleClick}\n {...restProps}\n >\n {#if loading}\n <span class=\"shimmer-overlay\"></span>\n {/if}\n <span class=\"inline-flex items-center gap-1.5\" class:invisible={loading || success}>\n {#if typeof children === 'function'}{@render children()}{:else if children}{children}{/if}\n </span>\n {#if typeof trailing === 'function'}{@render trailing()}{:else if trailing}{trailing}{/if}\n </a>\n{:else}\n <button\n {type}\n class=\"{buttonClasses} {loading ? 'loading-pulse' : ''}\"\n disabled={effectiveDisabled}\n onclick={handleClick}\n {...restProps}\n >\n {#if loading}\n <span class=\"shimmer-overlay\"></span>\n {/if}\n <span class=\"inline-flex items-center gap-1.5\" class:invisible={loading || success}>\n {#if typeof children === 'function'}{@render children()}{:else if children}{children}{/if}\n </span>\n {#if typeof trailing === 'function'}{@render trailing()}{:else if trailing}{trailing}{/if}\n {#if success}\n <span class=\"absolute inset-0 flex items-center justify-center gap-2\">\n <CheckOutline class=\"w-5 h-5\" />\n {#if successText}<span class=\"font-medium\">{successText}</span>{/if}\n </span>\n {/if}\n </button>\n{/if}\n\n<style>\n .loading-pulse {\n animation: pulse-bg 2s ease-in-out infinite;\n }\n\n @keyframes pulse-bg {\n 0%, 100% { filter: brightness(1); }\n 50% { filter: brightness(1.15); }\n }\n\n .shimmer-overlay {\n position: absolute;\n inset: 0;\n overflow: hidden;\n border-radius: inherit;\n }\n\n .shimmer-overlay::after {\n content: '';\n position: absolute;\n top: 0;\n left: -100%;\n width: 100%;\n height: 100%;\n background: linear-gradient(\n 90deg,\n transparent 0%,\n rgba(255, 255, 255, 0.2) 50%,\n transparent 100%\n );\n animation: shimmer 1s ease-in-out infinite;\n }\n\n @keyframes shimmer {\n 0% {\n left: -100%;\n }\n 100% {\n left: 100%;\n }\n }\n</style>\n","<script lang=\"ts\">\n import type { Snippet } from 'svelte';\n\n interface Props {\n padding?: boolean;\n border?: boolean;\n horizontal?: boolean;\n class?: string;\n children?: Snippet;\n [key: string]: unknown;\n }\n\n let {\n padding = true,\n border = false,\n horizontal = false,\n class: className = '',\n children,\n ...restProps\n }: Props = $props();\n</script>\n\n<div\n class=\"bg-white dark:bg-gray-900 rounded-lg shadow-md {border ? 'border border-gray-200 dark:border-gray-700' : ''} {padding ? 'p-6' : ''} {horizontal ? 'flex flex-row' : ''} {className}\"\n {...restProps}\n>\n {#if children}{@render children()}{/if}\n</div>\n","<script lang=\"ts\">\n import type { Snippet } from 'svelte';\n\n interface Props {\n checked?: boolean;\n value?: string;\n name?: string;\n disabled?: boolean;\n color?: 'blue' | 'red' | 'green' | 'purple' | 'orange' | 'yellow';\n class?: string;\n onchange?: (detail: { checked: boolean; value: string }) => void;\n onclick?: () => void;\n onfocus?: () => void;\n onblur?: () => void;\n onkeydown?: (e: KeyboardEvent) => void;\n onkeyup?: (e: KeyboardEvent) => void;\n children?: Snippet;\n [key: string]: unknown;\n }\n\n let {\n checked = $bindable(false),\n value = \"\",\n name = \"\",\n disabled = false,\n color = \"blue\",\n class: className = \"\",\n onchange,\n onclick,\n onfocus,\n onblur,\n onkeydown,\n onkeyup,\n children,\n ...restProps\n }: Props = $props();\n\n function handleChange() {\n // Note: checked is already updated by bind:checked before this handler runs\n // We just need to call the onchange callback with the current values\n onchange?.({ checked, value });\n }\n\n const colorClasses = {\n blue: \"text-blue-600\",\n red: \"text-red-600\",\n green: \"text-green-600\",\n purple: \"text-purple-600\",\n orange: \"text-orange-500\",\n yellow: \"text-yellow-400\"\n };\n\n let colorClass = $derived(colorClasses[color] || colorClasses.blue);\n\n let inputClasses = $derived([\n \"w-4 h-4 rounded\",\n \"bg-gray-100 border-gray-300\",\n \"dark:bg-gray-700 dark:border-gray-600\",\n \"focus:outline-hidden\",\n colorClass,\n disabled ? \"cursor-not-allowed opacity-50\" : \"cursor-pointer\"\n ].join(\" \"));\n</script>\n\n<label\n class=\"inline-flex items-center gap-2 {disabled ? 'cursor-not-allowed' : 'cursor-pointer'} select-none {className}\"\n {...restProps}\n>\n <input\n type=\"checkbox\"\n {name}\n {value}\n {disabled}\n bind:checked\n onchange={handleChange}\n {onclick}\n {onfocus}\n {onblur}\n {onkeydown}\n {onkeyup}\n class={inputClasses}\n />\n {#if children}\n <span class=\"text-sm font-medium text-gray-900 dark:text-gray-300\">\n {@render children()}\n </span>\n {/if}\n</label>\n","/**\n * Format a credit card number with spaces every 4 digits\n * @param value - Raw input (digits only)\n * @returns Formatted credit card number (e.g., \"1234 5678 9012 3456\")\n */\nexport function formatCreditCardNumber(value) {\n return value.replace(/\\D/g, \"\").replace(/(.{4})/g, \"$1 \").trim();\n}\n/**\n * Format a US phone number with dashes\n * @param value - Raw input (digits only)\n * @returns Formatted phone number (e.g., \"123-456-7890\")\n */\nexport function formatPhoneNumber(value) {\n const cleanedValue = value.replace(/\\D/g, \"\");\n let formattedValue = \"\";\n if (cleanedValue.length > 0)\n formattedValue += cleanedValue.substring(0, 3);\n if (cleanedValue.length >= 4)\n formattedValue += \"-\" + cleanedValue.substring(3, 6);\n if (cleanedValue.length >= 7)\n formattedValue += \"-\" + cleanedValue.substring(6, 10);\n return formattedValue;\n}\n","<script>\n /**\n * Input Component - Flowbite Native\n * Migrated to Svelte 5 runes\n *\n * NOTE: This component does NOT perform any validation.\n * All validation should be handled externally (e.g., via Zod schemas).\n * Use the `errorText` prop to display validation errors.\n * Use the `color` prop ('red' | 'base') to style the border.\n */\n import { safeSlide } from \"../../utils/transitions.js\";\n import { cubicOut } from \"svelte/easing\";\n import { onDestroy } from \"svelte\";\n import { EyeOutline, EyeSlashOutline, CloseCircleOutline, ExclamationCircleOutline } from \"../Icons\";\n import { typography } from \"../../tokens/typography\";\n import { formInputSizes } from \"../../tokens/sizing\";\n import { formatCreditCardNumber, formatPhoneNumber } from \"../../utils/formatters\";\n\n /** @type {{\n required?: boolean,\n disabled?: boolean,\n optional?: boolean,\n icon?: string | null,\n buttonIcon?: string | null,\n buttonText?: string | null,\n maxlength?: number | null,\n minlength?: number | null,\n type?: string,\n placeholder?: string,\n label?: string,\n id?: string,\n name?: string,\n className?: string,\n size?: 'sm' | 'md' | 'lg',\n textareaSize?: string,\n errorText?: string,\n color?: 'base' | 'red',\n helperText?: string,\n helperIcon?: string,\n hintText?: string,\n hintIcon?: string,\n contentFloat?: string,\n readonly?: boolean,\n controlled?: boolean,\n onButtonClick?: ((value: string) => void) | null,\n value?: string | number | null,\n autocomplete?: string | null,\n autofocus?: boolean,\n showPasswordToggle?: boolean,\n animateFocus?: boolean,\n statusText?: string,\n statusType?: string,\n buttonDisabled?: boolean,\n inputmode?: string | null,\n instantSearch?: boolean,\n debounceMs?: number,\n minSearchChars?: number,\n showClearButton?: boolean,\n onsearch?: (detail: { query: string }) => void,\n onfocus?: () => void,\n onblur?: () => void,\n oninputchange?: (value: string) => void,\n leftIcon?: import('svelte').Snippet\n }} */\n let {\n required = false,\n disabled = false,\n optional = false,\n icon = null,\n buttonIcon = null,\n buttonText = null,\n maxlength = null,\n minlength = null,\n type = \"text\",\n placeholder = \"\",\n label = \"\",\n id = \"\",\n name = \"\",\n className = \"\",\n size = \"md\",\n textareaSize = \"\",\n errorText = \"\",\n color = \"base\",\n helperText = \"\",\n helperIcon = \"\",\n hintText = \"\",\n hintIcon = \"\",\n contentFloat = \"left\",\n readonly = false,\n controlled = false,\n onButtonClick = null,\n value = $bindable(\"\"),\n autocomplete = null,\n autofocus = false,\n showPasswordToggle = true,\n animateFocus = true,\n statusText = \"\",\n statusType = \"\",\n buttonDisabled = false,\n inputmode = null,\n instantSearch = false,\n debounceMs = 250,\n minSearchChars = 2,\n showClearButton = false,\n onsearch,\n onfocus,\n onblur,\n oninputchange,\n leftIcon,\n ...restProps\n } = $props();\n\n let inputValue = $state(value);\n let inputElement = $state(null);\n let debounceTimer;\n\n let computedInputmode = $derived(inputmode || getInputmodeFromType(type));\n\n function getInputmodeFromType(inputType) {\n switch (inputType) {\n case 'phoneNumber':\n case 'creditCardNumber':\n return 'tel';\n case 'email':\n return 'email';\n default:\n return null;\n }\n }\n\n $effect(() => {\n if (value !== inputValue) {\n inputValue = value;\n }\n });\n\n function checkForAutofill() {\n if (inputElement && inputElement.value !== inputValue) {\n inputValue = inputElement.value;\n value = inputValue;\n // Also call oninputchange so parent components can react\n oninputchange?.(inputValue);\n }\n }\n\n let isPasswordVisible = $state(false);\n\n // Error state derived from color prop or errorText\n let hasError = $derived(color === 'red' || Boolean(errorText));\n\n let inputType = $derived(showPasswordToggle && isPasswordVisible ? \"text\" : type);\n let shouldAnimate = $derived(animateFocus && !disabled && !readonly);\n\n let sizeClass = $derived(formInputSizes[size] || formInputSizes.md);\n\n const togglePasswordVisibility = () => {\n isPasswordVisible = !isPasswordVisible;\n };\n\n const handleInput = (event) => {\n inputValue = event.target.value;\n\n // Format special input types\n if (type === \"creditCardNumber\") {\n const rawInput = inputValue.replace(/\\D/g, \"\");\n inputValue = formatCreditCardNumber(rawInput);\n event.target.value = inputValue;\n }\n\n if (type === \"phoneNumber\") {\n const rawInput = inputValue.replace(/\\D/g, \"\");\n inputValue = formatPhoneNumber(rawInput);\n event.target.value = inputValue;\n }\n\n if (type === \"username\") {\n let sanitized = inputValue.trim();\n const urlPattern = /(?:https?:\\/\\/)?(?:www\\.)?(?:instagram\\.com|twitter\\.com|x\\.com|facebook\\.com|fb\\.com|tiktok\\.com|linkedin\\.com)\\/(?:@)?([A-Za-z0-9._]+)\\/?/i;\n const urlMatch = sanitized.match(urlPattern);\n if (urlMatch) {\n sanitized = urlMatch[1];\n }\n sanitized = sanitized.replace(/^@+/, \"\");\n sanitized = sanitized.replace(/[^A-Za-z0-9._]/g, \"\");\n inputValue = sanitized;\n event.target.value = inputValue;\n }\n\n value = inputValue;\n\n // Call oninputchange callback if provided\n oninputchange?.(inputValue);\n\n // Handle instant search\n if (instantSearch) {\n const inputValueStr = inputValue ?? '';\n clearTimeout(debounceTimer);\n if (inputValueStr.length === 0) {\n onsearch?.({ query: '' });\n return;\n }\n if (inputValueStr.length >= minSearchChars) {\n debounceTimer = setTimeout(() => {\n onsearch?.({ query: inputValue });\n }, debounceMs);\n }\n }\n };\n\n function clearInput() {\n inputValue = '';\n value = '';\n clearTimeout(debounceTimer);\n if (instantSearch) {\n onsearch?.({ query: '' });\n }\n if (inputElement) {\n inputElement.focus();\n }\n }\n\n function handleSearchKeyDown(event) {\n if (instantSearch) {\n if (event.key === 'Enter') {\n clearTimeout(debounceTimer);\n onsearch?.({ query: inputValue });\n }\n if (event.key === 'Escape') {\n clearInput();\n }\n }\n }\n\n onDestroy(() => {\n clearTimeout(debounceTimer);\n });\n\n const handleBlur = () => {\n onblur?.();\n };\n\n const handleFocus = () => {\n onfocus?.();\n };\n\n const getContentFloatClass = () => {\n switch (contentFloat) {\n case \"center\": return \"text-center\";\n case \"right\": return \"text-right\";\n default: return \"text-left\";\n }\n };\n\n const getTextareaSizeClass = () => {\n switch (textareaSize) {\n case \"sm\": return \"h-24\";\n case \"md\": return \"h-36\";\n case \"lg\": return \"h-44\";\n default: return \"\";\n }\n };\n\n const handleButtonClick = () => {\n if (typeof onButtonClick === \"function\") {\n onButtonClick(inputValue);\n }\n };\n</script>\n\n<div class=\"flex flex-col gap-2 {className}\" {...restProps}>\n {#if label}\n <div class=\"flex justify-start items-center gap-1\">\n <label for={id} class={`${typography.label} leading-tight sm:leading-none`}>\n {label}{#if required}<span class=\"text-red-500 font-medium text-sm ml-0.5\">*</span>{/if}\n </label>\n {#if statusText}\n <span class=\"text-sm font-medium {statusType === 'success' ? 'text-green-600' : statusType === 'error' ? 'text-red-500' : ''}\">({statusText})</span>\n {/if}\n {#if optional}\n <span class={typography.smMuted}>(optional)</span>\n {/if}\n </div>\n {/if}\n <div class=\"relative w-full\">\n {#if type === \"textarea\"}\n <textarea\n {id}\n {name}\n {placeholder}\n value={inputValue}\n oninput={handleInput}\n onblur={handleBlur}\n onfocus={handleFocus}\n {maxlength}\n {minlength}\n class=\"{typography.sm} w-full px-3 py-2 bg-gray-50 dark:bg-gray-800 border rounded-lg font-medium placeholder-gray-500 dark:placeholder-gray-400 transition-all focus:outline-hidden focus:ring-4 focus:ring-blue-300 dark:focus:ring-blue-300 resize-y {hasError ? 'border-red-500' : 'border-gray-300 dark:border-gray-600 hover:border-blue-500 focus:border-blue-500'} {getContentFloatClass()} {getTextareaSizeClass()} {shouldAnimate ? 'focus:scale-[1.01]' : ''}\"\n required={false}\n {disabled}\n {readonly}\n rows=\"4\"\n aria-required={required}\n ></textarea>\n {:else if type === \"password\" && showPasswordToggle}\n <div class=\"relative flex items-center w-full\">\n <!-- svelte-ignore a11y_autofocus -->\n <input\n bind:this={inputElement}\n {id}\n type={inputType}\n {name}\n {placeholder}\n value={inputValue}\n oninput={handleInput}\n onchange={checkForAutofill}\n onblur={handleBlur}\n onfocus={handleFocus}\n {maxlength}\n {minlength}\n class=\"{typography.body} w-full {sizeClass} bg-gray-50 dark:bg-gray-800 border rounded-lg font-medium placeholder-gray-500 dark:placeholder-gray-400 transition-all focus:outline-hidden focus:ring-4 focus:ring-blue-300 dark:focus:ring-blue-300 {hasError ? 'border-red-500' : 'border-gray-300 dark:border-gray-600 hover:border-blue-500 focus:border-blue-500'} pr-10 {getContentFloatClass()} {shouldAnimate ? 'focus:scale-[1.01]' : ''} {disabled ? 'opacity-50 cursor-not-allowed' : ''}\"\n required={false}\n {disabled}\n {readonly}\n aria-required={required}\n {autocomplete}\n {autofocus}\n inputmode={computedInputmode}\n />\n <button\n type=\"button\"\n onclick={togglePasswordVisibility}\n class=\"absolute right-3 inset-y-0 flex items-center justify-center text-gray-500 dark:text-gray-400 hover:text-gray-700 dark:hover:text-gray-200 focus:outline-hidden\"\n tabindex=\"-1\"\n aria-label={isPasswordVisible ? \"Hide password\" : \"Show password\"}\n >\n {#if isPasswordVisible}\n <EyeSlashOutline class=\"w-5 h-5\" />\n {:else}\n <EyeOutline class=\"w-5 h-5\" />\n {/if}\n </button>\n </div>\n {:else}\n <div class=\"relative flex items-center w-full\">\n {#if leftIcon}\n <div class=\"absolute left-3 inset-y-0 flex items-center text-gray-400 z-10 pointer-events-none\">\n {@render leftIcon()}\n </div>\n {/if}\n <!-- svelte-ignore a11y_autofocus -->\n <input\n bind:this={inputElement}\n {id}\n type={inputType}\n {name}\n {placeholder}\n value={inputValue}\n oninput={handleInput}\n onchange={checkForAutofill}\n onblur={handleBlur}\n onfocus={handleFocus}\n onkeydown={handleSearchKeyDown}\n {maxlength}\n {minlength}\n class=\"{typography.body} w-full {sizeClass} bg-gray-50 dark:bg-gray-800 border rounded-lg font-medium placeholder-gray-500 dark:placeholder-gray-400 transition-all focus:outline-hidden focus:ring-4 focus:ring-blue-300 dark:focus:ring-blue-300 {hasError ? 'border-red-500' : 'border-gray-300 dark:border-gray-600 hover:border-blue-500 focus:border-blue-500'} {icon || (showClearButton && inputValue) ? 'pr-10' : ''} {leftIcon ? 'pl-10' : ''} {getContentFloatClass()} {shouldAnimate ? 'focus:scale-[1.01]' : ''} {disabled ? 'opacity-50 cursor-not-allowed' : ''}\"\n required={false}\n {disabled}\n {readonly}\n aria-required={required}\n {autocomplete}\n {autofocus}\n inputmode={computedInputmode}\n />\n {#if showClearButton && inputValue}\n <button\n type=\"button\"\n onclick={clearInput}\n class=\"absolute right-3 inset-y-0 flex items-center justify-center text-gray-400 hover:text-gray-600 dark:hover:text-gray-200\"\n aria-label=\"Clear input\"\n tabindex=\"-1\"\n >\n <CloseCircleOutline class=\"w-4 h-4\" />\n </button>\n {:else if controlled && (buttonIcon || buttonText)}\n <button\n type=\"button\"\n onclick={handleButtonClick}\n disabled={buttonDisabled}\n class=\"absolute inset-y-0 right-0 gap-1 flex items-center justify-center px-4 text-blue-600 hover:text-blue-800 dark:text-blue-400 dark:hover:text-blue-300 disabled:opacity-50 disabled:cursor-not-allowed {helperText || hintText || errorText ? 'mb-7' : ''}\"\n >\n {#if buttonIcon}\n <img src={buttonIcon} alt=\"Button Icon\" class=\"w-5 h-5\" />\n {/if}\n {#if buttonText}\n <span class=\"text-sm font-medium\">{buttonText}</span>\n {/if}\n </button>\n {/if}\n {#if icon && type !== \"textarea\" && !(showClearButton && inputValue)}\n <img src={icon} alt=\"Input icon\" class=\"absolute inset-y-0 right-0 w-5 h-5 mr-3 top-1/2 transform -translate-y-1/2\" />\n {/if}\n </div>\n {/if}\n\n {#if errorText}\n <div transition:safeSlide={{ duration: 300, easing: cubicOut }} class=\"flex items-start gap-1.5 mt-2\" role=\"alert\" aria-live=\"assertive\">\n <ExclamationCircleOutline class=\"w-4 h-4 shrink-0 text-red-500 mt-0.5\" />\n <p class={typography.error}>{errorText}</p>\n </div>\n {:else if helperText || hintText}\n <div class={`mt-2 flex items-center ${typography.xsMuted} opacity-65`}>\n {#if helperIcon || hintIcon}\n <img src={helperIcon || hintIcon} alt=\"Helper icon\" class=\"w-4 h-4 mr-2\" />\n {/if}\n <!-- eslint-disable-next-line svelte/no-at-html-tags -->\n <span>{@html helperText || hintText}</span>\n </div>\n {/if}\n </div>\n</div>\n\n<style>\n /* No custom styles needed - password input now uses same structure as email input */\n</style>\n","/**\n * Svelte action that portals an element to a target container (default: document.body)\n * This moves the element outside of any stacking contexts, solving iOS z-index issues.\n *\n * Usage: <div use:portal>...</div>\n * Or: <div use:portal={document.getElementById('modal-root')}>...</div>\n */\nexport function portal(node, target = document.body) {\n // Move the node to the target\n target.appendChild(node);\n\n return {\n update(newTarget) {\n // If target changes, move to new target\n newTarget = newTarget || document.body;\n newTarget.appendChild(node);\n },\n destroy() {\n // Clean up - remove the node when component is destroyed\n if (node.parentNode) {\n node.parentNode.removeChild(node);\n }\n }\n };\n}\n","<script>\n /**\n * Modal Component - Flowbite Native\n * Migrated to Svelte 5 runes\n *\n * Haptic Feedback:\n * - Light haptic on modal open (subtle attention cue)\n */\n import { onDestroy } from \"svelte\";\n import { fade, fly } from \"svelte/transition\";\n import { cubicOut } from \"svelte/easing\";\n import { portal } from \"../../utils/portal.js\";\n import { triggerHaptic } from \"../../utils/haptic.js\";\n\n /** @type {{\n open?: boolean,\n isProcessing?: boolean,\n isSuccess?: boolean,\n size?: 'sm' | 'md' | 'lg' | 'xl',\n persistent?: boolean,\n haptic?: boolean,\n oncancel?: () => void,\n header?: import('svelte').Snippet,\n body?: import('svelte').Snippet,\n footer?: import('svelte').Snippet,\n class?: string,\n }} */\n let {\n open = $bindable(false),\n isProcessing: _isProcessing = false,\n isSuccess: _isSuccess = false,\n size = \"md\",\n persistent = false,\n haptic = true,\n oncancel,\n header,\n body,\n footer,\n class: _className,\n ...restProps\n } = $props();\n\n // Store scroll position for iOS scroll lock\n let scrollY = $state(0);\n\n // Track previous open state to detect open transitions\n let prevOpen = $state(false);\n\n // Trigger haptic on modal open (QOL Bible)\n $effect(() => {\n if (open && !prevOpen && haptic) {\n triggerHaptic('light');\n }\n prevOpen = open;\n });\n\n // Handle escape key\n function handleKeydown(event) {\n if (event.key === \"Escape\" && open && !persistent) {\n resetModal();\n }\n }\n\n const resetModal = () => {\n oncancel?.();\n open = false;\n };\n\n // Size classes for desktop modal (xs/sm/md/lg/xl scale)\n const sizeClasses = {\n sm: \"max-w-sm\",\n md: \"max-w-md\",\n lg: \"max-w-xl\",\n xl: \"max-w-2xl\"\n };\n\n let modalSizeClass = $derived(sizeClasses[size] || sizeClasses.md);\n\n // iOS-compatible scroll lock using position:fixed approach\n // Also compensates for scrollbar width to prevent layout shift\n $effect(() => {\n if (typeof document !== \"undefined\") {\n if (open) {\n scrollY = window.scrollY;\n // Calculate scrollbar width before hiding it\n const scrollbarWidth = window.innerWidth - document.documentElement.clientWidth;\n document.body.style.position = \"fixed\";\n document.body.style.top = `-${scrollY}px`;\n document.body.style.left = \"0\";\n document.body.style.right = \"0\";\n document.body.style.overflow = \"hidden\";\n // Add padding to compensate for scrollbar disappearing\n document.body.style.paddingRight = `${scrollbarWidth}px`;\n } else {\n document.body.style.position = \"\";\n document.body.style.top = \"\";\n document.body.style.left = \"\";\n document.body.style.right = \"\";\n document.body.style.overflow = \"\";\n document.body.style.paddingRight = \"\";\n window.scrollTo(0, scrollY);\n }\n }\n });\n\n onDestroy(() => {\n if (typeof document !== \"undefined\") {\n document.body.style.position = \"\";\n document.body.style.top = \"\";\n document.body.style.left = \"\";\n document.body.style.right = \"\";\n document.body.style.overflow = \"\";\n document.body.style.paddingRight = \"\";\n }\n });\n</script>\n\n<svelte:window onkeydown={handleKeydown} />\n\n{#if open}\n <!-- svelte-ignore a11y_click_events_have_key_events -->\n <!-- svelte-ignore a11y_no_static_element_interactions -->\n <div\n class=\"fixed inset-0 flex bg-black/50 z-50 items-end justify-center md:items-center md:p-4 touch-none overscroll-none\"\n onmousedown={(e) => {\n // Only track direct clicks on backdrop, not drags that end on backdrop\n if (e.target === e.currentTarget && !persistent) {\n e.currentTarget.dataset.clickStartedOnBackdrop = 'true';\n }\n }}\n onmouseup={(e) => {\n // Only close if both mousedown and mouseup were on the backdrop\n if (e.target === e.currentTarget && e.currentTarget.dataset.clickStartedOnBackdrop === 'true' && !persistent) {\n resetModal();\n }\n delete e.currentTarget.dataset.clickStartedOnBackdrop;\n }}\n transition:fade={{ duration: 300 }}\n role=\"dialog\"\n aria-modal=\"true\"\n use:portal\n {...restProps}\n >\n <!-- Mobile: Bottom sheet -->\n <!-- svelte-ignore a11y_click_events_have_key_events -->\n <!-- svelte-ignore a11y_no_static_element_interactions -->\n <div\n class=\"md:hidden bg-white dark:bg-gray-800 rounded-t-3xl w-full max-h-[90vh] max-h-[90dvh] overflow-hidden flex flex-col shadow-[0_-10px_40px_rgba(0,0,0,0.15)] touch-pan-y overscroll-contain\"\n onclick={(e) => e.stopPropagation()}\n transition:fly={{ y: 300, duration: 300, easing: cubicOut }}\n >\n <!-- Handle bar -->\n <div class=\"flex justify-center pt-3 pb-1 shrink-0\">\n <div class=\"w-10 h-1 bg-gray-300 dark:bg-gray-600 rounded-xs\"></div>\n </div>\n\n <div class=\"p-6 pb-[calc(5rem+env(safe-area-inset-bottom,0px))] overflow-y-auto flex-1\">\n {#if header}{@render header()}{/if}\n {#if body}{@render body()}{/if}\n <div class=\"w-full flex flex-col gap-3 mt-6 empty:hidden empty:mt-0\">\n {#if footer}{@render footer()}{/if}\n </div>\n </div>\n </div>\n\n <!-- Desktop: Centered modal -->\n <!-- svelte-ignore a11y_click_events_have_key_events -->\n <!-- svelte-ignore a11y_no_static_element_interactions -->\n <div\n class=\"hidden md:block bg-white dark:bg-gray-800 p-6 rounded-lg {modalSizeClass} w-full max-h-[calc(100vh-4rem)] overflow-y-auto shadow-2xl\"\n onclick={(e) => e.stopPropagation()}\n transition:fly={{ y: 20, duration: 200 }}\n >\n {#if header}{@render header()}{/if}\n {#if body}{@render body()}{/if}\n <div class=\"w-full flex flex-col md:flex-row md:justify-end gap-3 mt-6 empty:hidden empty:mt-0\">\n {#if footer}{@render footer()}{/if}\n </div>\n </div>\n </div>\n{/if}\n","<script lang=\"ts\">\n import {\n spinnerColorVariants,\n type SpinnerColorVariant,\n } from '../../tokens/variants.js';\n import { iconSizes, type IconSize } from '../../tokens/sizing.js';\n\n interface Props {\n size?: IconSize;\n color?: SpinnerColorVariant;\n class?: string;\n [key: string]: unknown;\n }\n\n let {\n size = 'md',\n color = 'blue',\n class: className = '',\n ...restProps\n }: Props = $props();\n\n let sizeClass = $derived(iconSizes[size] || iconSizes.md);\n let colorClass = $derived(spinnerColorVariants[color] || spinnerColorVariants.blue);\n</script>\n\n<svg\n aria-hidden=\"true\"\n class=\"{sizeClass} text-gray-200 animate-spin dark:text-gray-600 {colorClass} {className}\"\n viewBox=\"0 0 100 101\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n role=\"status\"\n {...restProps}\n>\n <path\n d=\"M100 50.5908C100 78.2051 77.6142 100.591 50 100.591C22.3858 100.591 0 78.2051 0 50.5908C0 22.9766 22.3858 0.59082 50 0.59082C77.6142 0.59082 100 22.9766 100 50.5908ZM9.08144 50.5908C9.08144 73.1895 27.4013 91.5094 50 91.5094C72.5987 91.5094 90.9186 73.1895 90.9186 50.5908C90.9186 27.9921 72.5987 9.67226 50 9.67226C27.4013 9.67226 9.08144 27.9921 9.08144 50.5908Z\"\n fill=\"currentColor\"\n />\n <path\n d=\"M93.9676 39.0409C96.393 38.4038 97.8624 35.9116 97.0079 33.5539C95.2932 28.8227 92.871 24.3692 89.8167 20.348C85.8452 15.1192 80.8826 10.7238 75.2124 7.41289C69.5422 4.10194 63.2754 1.94025 56.7698 1.05124C51.7666 0.367541 46.6976 0.446843 41.7345 1.27873C39.2613 1.69328 37.813 4.19778 38.4501 6.62326C39.0873 9.04874 41.5694 10.4717 44.0505 10.1071C47.8511 9.54855 51.7191 9.52689 55.5402 10.0491C60.8642 10.7766 65.9928 12.5457 70.6331 15.2552C75.2735 17.9648 79.3347 21.5619 82.5849 25.841C84.9175 28.9121 86.7997 32.2913 88.1811 35.8758C89.083 38.2158 91.5421 39.6781 93.9676 39.0409Z\"\n fill=\"currentFill\"\n />\n</svg>\n<span class=\"sr-only\">Loading...</span>\n","<script lang=\"ts\">\n import type { Snippet } from 'svelte';\n\n interface Props {\n level?: 1 | 2 | 3 | 4 | 5 | 6;\n size?: 'xs' | 'sm' | 'base' | 'md' | 'lg' | 'xl' | '2xl' | '3xl' | '4xl' | '5xl';\n weight?: 'normal' | 'medium' | 'semibold' | 'bold';\n class?: string;\n id?: string;\n children: Snippet;\n }\n\n let {\n level = 2,\n size = 'lg',\n weight,\n class: className = '',\n id,\n children,\n }: Props = $props();\n\n const sizeClasses: Record<string, string> = {\n xs: 'text-xs',\n sm: 'text-sm',\n base: 'text-base',\n md: 'text-base',\n lg: 'text-lg',\n xl: 'text-xl',\n '2xl': 'text-2xl',\n '3xl': 'text-3xl',\n '4xl': 'text-4xl',\n '5xl': 'text-5xl',\n };\n\n const weightClasses: Record<string, string> = {\n normal: 'font-normal',\n medium: 'font-medium',\n semibold: 'font-semibold',\n bold: 'font-bold',\n };\n\n const baseClasses = 'text-gray-900 dark:text-white';\n let sizeClass = $derived(sizeClasses[size] || 'text-lg');\n let weightClass = $derived(weight ? weightClasses[weight] : '');\n let classes = $derived(`${baseClasses} ${sizeClass} ${weightClass} ${className}`.trim());\n</script>\n\n{#if level === 1}\n <h1 {id} class={classes}>{@render children()}</h1>\n{:else if level === 2}\n <h2 {id} class={classes}>{@render children()}</h2>\n{:else if level === 3}\n <h3 {id} class={classes}>{@render children()}</h3>\n{:else if level === 4}\n <h4 {id} class={classes}>{@render children()}</h4>\n{:else if level === 5}\n <h5 {id} class={classes}>{@render children()}</h5>\n{:else}\n <h6 {id} class={classes}>{@render children()}</h6>\n{/if}\n","<script lang=\"ts\">\n import type { Snippet } from 'svelte';\n\n interface Props {\n size?: 'xs' | 'sm' | 'base' | 'md' | 'lg' | 'xl' | '2xl';\n leading?: 'none' | 'tight' | 'snug' | 'normal' | 'relaxed' | 'loose';\n color?: 'default' | 'muted' | 'primary' | 'secondary' | 'success' | 'warning' | 'error';\n class?: string;\n children: Snippet;\n }\n\n let {\n size = 'md',\n leading,\n color = 'default',\n class: className = '',\n children,\n }: Props = $props();\n\n const sizeClasses: Record<string, string> = {\n xs: 'text-xs',\n sm: 'text-sm',\n base: 'text-base',\n md: 'text-base',\n lg: 'text-lg',\n xl: 'text-xl',\n '2xl': 'text-2xl',\n };\n\n const colorClasses: Record<string, string> = {\n default: 'text-gray-900 dark:text-gray-100',\n muted: 'text-gray-500 dark:text-gray-400',\n primary: 'text-primary-600 dark:text-primary-400',\n secondary: 'text-gray-600 dark:text-gray-300',\n success: 'text-green-600 dark:text-green-400',\n warning: 'text-yellow-600 dark:text-yellow-400',\n error: 'text-red-600 dark:text-red-400',\n };\n\n const leadingClasses: Record<string, string> = {\n none: 'leading-none',\n tight: 'leading-tight',\n snug: 'leading-snug',\n normal: 'leading-normal',\n relaxed: 'leading-relaxed',\n loose: 'leading-loose',\n };\n\n let leadingClass = $derived(leading ? leadingClasses[leading] : '');\n let classes = $derived(`${sizeClasses[size] || 'text-base'} ${leadingClass} ${colorClasses[color] || ''} ${className}`.trim());\n</script>\n\n<span class={classes}>{@render children()}</span>\n","/*!\n * FilePond 4.32.11\n * Licensed under MIT, https://opensource.org/licenses/MIT/\n * Please visit https://pqina.nl/filepond/ for details.\n */\n\n/* eslint-disable */\n\nconst isNode = value => value instanceof HTMLElement;\n\nconst createStore = (initialState, queries = [], actions = []) => {\n // internal state\n const state = {\n ...initialState,\n };\n\n // contains all actions for next frame, is clear when actions are requested\n const actionQueue = [];\n const dispatchQueue = [];\n\n // returns a duplicate of the current state\n const getState = () => ({ ...state });\n\n // returns a duplicate of the actions array and clears the actions array\n const processActionQueue = () => {\n // create copy of actions queue\n const queue = [...actionQueue];\n\n // clear actions queue (we don't want no double actions)\n actionQueue.length = 0;\n\n return queue;\n };\n\n // processes actions that might block the main UI thread\n const processDispatchQueue = () => {\n // create copy of actions queue\n const queue = [...dispatchQueue];\n\n // clear actions queue (we don't want no double actions)\n dispatchQueue.length = 0;\n\n // now dispatch these actions\n queue.forEach(({ type, data }) => {\n dispatch(type, data);\n });\n };\n\n // adds a new action, calls its handler and\n const dispatch = (type, data, isBlocking) => {\n // is blocking action (should never block if document is hidden)\n if (isBlocking && !document.hidden) {\n dispatchQueue.push({ type, data });\n return;\n }\n\n // if this action has a handler, handle the action\n if (actionHandlers[type]) {\n actionHandlers[type](data);\n }\n\n // now add action\n actionQueue.push({\n type,\n data,\n });\n };\n\n const query = (str, ...args) => (queryHandles[str] ? queryHandles[str](...args) : null);\n\n const api = {\n getState,\n processActionQueue,\n processDispatchQueue,\n dispatch,\n query,\n };\n\n let queryHandles = {};\n queries.forEach(query => {\n queryHandles = {\n ...query(state),\n ...queryHandles,\n };\n });\n\n let actionHandlers = {};\n actions.forEach(action => {\n actionHandlers = {\n ...action(dispatch, query, state),\n ...actionHandlers,\n };\n });\n\n return api;\n};\n\nconst defineProperty = (obj, property, definition) => {\n if (typeof definition === 'function') {\n obj[property] = definition;\n return;\n }\n Object.defineProperty(obj, property, { ...definition });\n};\n\nconst forin = (obj, cb) => {\n for (const key in obj) {\n if (!obj.hasOwnProperty(key)) {\n continue;\n }\n\n cb(key, obj[key]);\n }\n};\n\nconst createObject = definition => {\n const obj = {};\n forin(definition, property => {\n defineProperty(obj, property, definition[property]);\n });\n return obj;\n};\n\nconst attr = (node, name, value = null) => {\n if (value === null) {\n return node.getAttribute(name) || node.hasAttribute(name);\n }\n node.setAttribute(name, value);\n};\n\nconst ns = 'http://www.w3.org/2000/svg';\nconst svgElements = ['svg', 'path']; // only svg elements used\n\nconst isSVGElement = tag => svgElements.includes(tag);\n\nconst createElement = (tag, className, attributes = {}) => {\n if (typeof className === 'object') {\n attributes = className;\n className = null;\n }\n const element = isSVGElement(tag)\n ? document.createElementNS(ns, tag)\n : document.createElement(tag);\n if (className) {\n if (isSVGElement(tag)) {\n attr(element, 'class', className);\n } else {\n element.className = className;\n }\n }\n forin(attributes, (name, value) => {\n attr(element, name, value);\n });\n return element;\n};\n\nconst appendChild = parent => (child, index) => {\n if (typeof index !== 'undefined' && parent.children[index]) {\n parent.insertBefore(child, parent.children[index]);\n } else {\n parent.appendChild(child);\n }\n};\n\nconst appendChildView = (parent, childViews) => (view, index) => {\n if (typeof index !== 'undefined') {\n childViews.splice(index, 0, view);\n } else {\n childViews.push(view);\n }\n\n return view;\n};\n\nconst removeChildView = (parent, childViews) => view => {\n // remove from child views\n childViews.splice(childViews.indexOf(view), 1);\n\n // remove the element\n if (view.element.parentNode) {\n parent.removeChild(view.element);\n }\n\n return view;\n};\n\nconst IS_BROWSER = (() =>\n typeof window !== 'undefined' && typeof window.document !== 'undefined')();\nconst isBrowser = () => IS_BROWSER;\n\nconst testElement = isBrowser() ? createElement('svg') : {};\nconst getChildCount =\n 'children' in testElement ? el => el.children.length : el => el.childNodes.length;\n\nconst getViewRect = (elementRect, childViews, offset, scale) => {\n const left = offset[0] || elementRect.left;\n const top = offset[1] || elementRect.top;\n const right = left + elementRect.width;\n const bottom = top + elementRect.height * (scale[1] || 1);\n\n const rect = {\n // the rectangle of the element itself\n element: {\n ...elementRect,\n },\n\n // the rectangle of the element expanded to contain its children, does not include any margins\n inner: {\n left: elementRect.left,\n top: elementRect.top,\n right: elementRect.right,\n bottom: elementRect.bottom,\n },\n\n // the rectangle of the element expanded to contain its children including own margin and child margins\n // margins will be added after we've recalculated the size\n outer: {\n left,\n top,\n right,\n bottom,\n },\n };\n\n // expand rect to fit all child rectangles\n childViews\n .filter(childView => !childView.isRectIgnored())\n .map(childView => childView.rect)\n .forEach(childViewRect => {\n expandRect(rect.inner, { ...childViewRect.inner });\n expandRect(rect.outer, { ...childViewRect.outer });\n });\n\n // calculate inner width and height\n calculateRectSize(rect.inner);\n\n // append additional margin (top and left margins are included in top and left automatically)\n rect.outer.bottom += rect.element.marginBottom;\n rect.outer.right += rect.element.marginRight;\n\n // calculate outer width and height\n calculateRectSize(rect.outer);\n\n return rect;\n};\n\nconst expandRect = (parent, child) => {\n // adjust for parent offset\n child.top += parent.top;\n child.right += parent.left;\n child.bottom += parent.top;\n child.left += parent.left;\n\n if (child.bottom > parent.bottom) {\n parent.bottom = child.bottom;\n }\n\n if (child.right > parent.right) {\n parent.right = child.right;\n }\n};\n\nconst calculateRectSize = rect => {\n rect.width = rect.right - rect.left;\n rect.height = rect.bottom - rect.top;\n};\n\nconst isNumber = value => typeof value === 'number';\n\n/**\n * Determines if position is at destination\n * @param position\n * @param destination\n * @param velocity\n * @param errorMargin\n * @returns {boolean}\n */\nconst thereYet = (position, destination, velocity, errorMargin = 0.001) => {\n return Math.abs(position - destination) < errorMargin && Math.abs(velocity) < errorMargin;\n};\n\n/**\n * Spring animation\n */\nconst spring =\n // default options\n ({ stiffness = 0.5, damping = 0.75, mass = 10 } = {}) =>\n // method definition\n {\n let target = null;\n let position = null;\n let velocity = 0;\n let resting = false;\n\n // updates spring state\n const interpolate = (ts, skipToEndState) => {\n // in rest, don't animate\n if (resting) return;\n\n // need at least a target or position to do springy things\n if (!(isNumber(target) && isNumber(position))) {\n resting = true;\n velocity = 0;\n return;\n }\n\n // calculate spring force\n const f = -(position - target) * stiffness;\n\n // update velocity by adding force based on mass\n velocity += f / mass;\n\n // update position by adding velocity\n position += velocity;\n\n // slow down based on amount of damping\n velocity *= damping;\n\n // we've arrived if we're near target and our velocity is near zero\n if (thereYet(position, target, velocity) || skipToEndState) {\n position = target;\n velocity = 0;\n resting = true;\n\n // we done\n api.onupdate(position);\n api.oncomplete(position);\n } else {\n // progress update\n api.onupdate(position);\n }\n };\n\n /**\n * Set new target value\n * @param value\n */\n const setTarget = value => {\n // if currently has no position, set target and position to this value\n if (isNumber(value) && !isNumber(position)) {\n position = value;\n }\n\n // next target value will not be animated to\n if (target === null) {\n target = value;\n position = value;\n }\n\n // let start moving to target\n target = value;\n\n // already at target\n if (position === target || typeof target === 'undefined') {\n // now resting as target is current position, stop moving\n resting = true;\n velocity = 0;\n\n // done!\n api.onupdate(position);\n api.oncomplete(position);\n\n return;\n }\n\n resting = false;\n };\n\n // need 'api' to call onupdate callback\n const api = createObject({\n interpolate,\n target: {\n set: setTarget,\n get: () => target,\n },\n resting: {\n get: () => resting,\n },\n onupdate: value => {},\n oncomplete: value => {},\n });\n\n return api;\n };\n\nconst easeLinear = t => t;\nconst easeInOutQuad = t => (t < 0.5 ? 2 * t * t : -1 + (4 - 2 * t) * t);\n\nconst tween =\n // default values\n ({ duration = 500, easing = easeInOutQuad, delay = 0 } = {}) =>\n // method definition\n {\n let start = null;\n let t;\n let p;\n let resting = true;\n let reverse = false;\n let target = null;\n\n const interpolate = (ts, skipToEndState) => {\n if (resting || target === null) return;\n\n if (start === null) {\n start = ts;\n }\n\n if (ts - start < delay) return;\n\n t = ts - start - delay;\n\n if (t >= duration || skipToEndState) {\n t = 1;\n p = reverse ? 0 : 1;\n api.onupdate(p * target);\n api.oncomplete(p * target);\n resting = true;\n } else {\n p = t / duration;\n api.onupdate((t >= 0 ? easing(reverse ? 1 - p : p) : 0) * target);\n }\n };\n\n // need 'api' to call onupdate callback\n const api = createObject({\n interpolate,\n target: {\n get: () => (reverse ? 0 : target),\n set: value => {\n // is initial value\n if (target === null) {\n target = value;\n api.onupdate(value);\n api.oncomplete(value);\n return;\n }\n\n // want to tween to a smaller value and have a current value\n if (value < target) {\n target = 1;\n reverse = true;\n } else {\n // not tweening to a smaller value\n reverse = false;\n target = value;\n }\n\n // let's go!\n resting = false;\n start = null;\n },\n },\n resting: {\n get: () => resting,\n },\n onupdate: value => {},\n oncomplete: value => {},\n });\n\n return api;\n };\n\nconst animator = {\n spring,\n tween,\n};\n\n/*\n { type: 'spring', stiffness: .5, damping: .75, mass: 10 };\n { translation: { type: 'spring', ... }, ... }\n { translation: { x: { type: 'spring', ... } } }\n*/\nconst createAnimator = (definition, category, property) => {\n // default is single definition\n // we check if transform is set, if so, we check if property is set\n const def =\n definition[category] && typeof definition[category][property] === 'object'\n ? definition[category][property]\n : definition[category] || definition;\n\n const type = typeof def === 'string' ? def : def.type;\n const props = typeof def === 'object' ? { ...def } : {};\n\n return animator[type] ? animator[type](props) : null;\n};\n\nconst addGetSet = (keys, obj, props, overwrite = false) => {\n obj = Array.isArray(obj) ? obj : [obj];\n obj.forEach(o => {\n keys.forEach(key => {\n let name = key;\n let getter = () => props[key];\n let setter = value => (props[key] = value);\n\n if (typeof key === 'object') {\n name = key.key;\n getter = key.getter || getter;\n setter = key.setter || setter;\n }\n\n if (o[name] && !overwrite) {\n return;\n }\n\n o[name] = {\n get: getter,\n set: setter,\n };\n });\n });\n};\n\n// add to state,\n// add getters and setters to internal and external api (if not set)\n// setup animators\n\nconst animations = ({ mixinConfig, viewProps, viewInternalAPI, viewExternalAPI }) => {\n // initial properties\n const initialProps = { ...viewProps };\n\n // list of all active animations\n const animations = [];\n\n // setup animators\n forin(mixinConfig, (property, animation) => {\n const animator = createAnimator(animation);\n if (!animator) {\n return;\n }\n\n // when the animator updates, update the view state value\n animator.onupdate = value => {\n viewProps[property] = value;\n };\n\n // set animator target\n animator.target = initialProps[property];\n\n // when value is set, set the animator target value\n const prop = {\n key: property,\n setter: value => {\n // if already at target, we done!\n if (animator.target === value) {\n return;\n }\n\n animator.target = value;\n },\n getter: () => viewProps[property],\n };\n\n // add getters and setters\n addGetSet([prop], [viewInternalAPI, viewExternalAPI], viewProps, true);\n\n // add it to the list for easy updating from the _write method\n animations.push(animator);\n });\n\n // expose internal write api\n return {\n write: ts => {\n let skipToEndState = document.hidden;\n let resting = true;\n animations.forEach(animation => {\n if (!animation.resting) resting = false;\n animation.interpolate(ts, skipToEndState);\n });\n return resting;\n },\n destroy: () => {},\n };\n};\n\nconst addEvent = element => (type, fn) => {\n element.addEventListener(type, fn);\n};\n\nconst removeEvent = element => (type, fn) => {\n element.removeEventListener(type, fn);\n};\n\n// mixin\nconst listeners = ({\n mixinConfig,\n viewProps,\n viewInternalAPI,\n viewExternalAPI,\n viewState,\n view,\n}) => {\n const events = [];\n\n const add = addEvent(view.element);\n const remove = removeEvent(view.element);\n\n viewExternalAPI.on = (type, fn) => {\n events.push({\n type,\n fn,\n });\n add(type, fn);\n };\n\n viewExternalAPI.off = (type, fn) => {\n events.splice(events.findIndex(event => event.type === type && event.fn === fn), 1);\n remove(type, fn);\n };\n\n return {\n write: () => {\n // not busy\n return true;\n },\n destroy: () => {\n events.forEach(event => {\n remove(event.type, event.fn);\n });\n },\n };\n};\n\n// add to external api and link to props\n\nconst apis = ({ mixinConfig, viewProps, viewExternalAPI }) => {\n addGetSet(mixinConfig, viewExternalAPI, viewProps);\n};\n\nconst isDefined = value => value != null;\n\n// add to state,\n// add getters and setters to internal and external api (if not set)\n// set initial state based on props in viewProps\n// apply as transforms each frame\n\nconst defaults = {\n opacity: 1,\n scaleX: 1,\n scaleY: 1,\n translateX: 0,\n translateY: 0,\n rotateX: 0,\n rotateY: 0,\n rotateZ: 0,\n originX: 0,\n originY: 0,\n};\n\nconst styles = ({ mixinConfig, viewProps, viewInternalAPI, viewExternalAPI, view }) => {\n // initial props\n const initialProps = { ...viewProps };\n\n // current props\n const currentProps = {};\n\n // we will add those properties to the external API and link them to the viewState\n addGetSet(mixinConfig, [viewInternalAPI, viewExternalAPI], viewProps);\n\n // override rect on internal and external rect getter so it takes in account transforms\n const getOffset = () => [viewProps['translateX'] || 0, viewProps['translateY'] || 0];\n const getScale = () => [viewProps['scaleX'] || 0, viewProps['scaleY'] || 0];\n const getRect = () =>\n view.rect ? getViewRect(view.rect, view.childViews, getOffset(), getScale()) : null;\n viewInternalAPI.rect = { get: getRect };\n viewExternalAPI.rect = { get: getRect };\n\n // apply view props\n mixinConfig.forEach(key => {\n viewProps[key] =\n typeof initialProps[key] === 'undefined' ? defaults[key] : initialProps[key];\n });\n\n // expose api\n return {\n write: () => {\n // see if props have changed\n if (!propsHaveChanged(currentProps, viewProps)) {\n return;\n }\n\n // moves element to correct position on screen\n applyStyles(view.element, viewProps);\n\n // store new transforms\n Object.assign(currentProps, { ...viewProps });\n\n // no longer busy\n return true;\n },\n destroy: () => {},\n };\n};\n\nconst propsHaveChanged = (currentProps, newProps) => {\n // different amount of keys\n if (Object.keys(currentProps).length !== Object.keys(newProps).length) {\n return true;\n }\n\n // lets analyze the individual props\n for (const prop in newProps) {\n if (newProps[prop] !== currentProps[prop]) {\n return true;\n }\n }\n\n return false;\n};\n\nconst applyStyles = (\n element,\n {\n opacity,\n perspective,\n translateX,\n translateY,\n scaleX,\n scaleY,\n rotateX,\n rotateY,\n rotateZ,\n originX,\n originY,\n width,\n height,\n }\n) => {\n let transforms = '';\n let styles = '';\n\n // handle transform origin\n if (isDefined(originX) || isDefined(originY)) {\n styles += `transform-origin: ${originX || 0}px ${originY || 0}px;`;\n }\n\n // transform order is relevant\n // 0. perspective\n if (isDefined(perspective)) {\n transforms += `perspective(${perspective}px) `;\n }\n\n // 1. translate\n if (isDefined(translateX) || isDefined(translateY)) {\n transforms += `translate3d(${translateX || 0}px, ${translateY || 0}px, 0) `;\n }\n\n // 2. scale\n if (isDefined(scaleX) || isDefined(scaleY)) {\n transforms += `scale3d(${isDefined(scaleX) ? scaleX : 1}, ${\n isDefined(scaleY) ? scaleY : 1\n }, 1) `;\n }\n\n // 3. rotate\n if (isDefined(rotateZ)) {\n transforms += `rotateZ(${rotateZ}rad) `;\n }\n\n if (isDefined(rotateX)) {\n transforms += `rotateX(${rotateX}rad) `;\n }\n\n if (isDefined(rotateY)) {\n transforms += `rotateY(${rotateY}rad) `;\n }\n\n // add transforms\n if (transforms.length) {\n styles += `transform:${transforms};`;\n }\n\n // add opacity\n if (isDefined(opacity)) {\n styles += `opacity:${opacity};`;\n\n // if we reach zero, we make the element inaccessible\n if (opacity === 0) {\n styles += `visibility:hidden;`;\n }\n\n // if we're below 100% opacity this element can't be clicked\n if (opacity < 1) {\n styles += `pointer-events:none;`;\n }\n }\n\n // add height\n if (isDefined(height)) {\n styles += `height:${height}px;`;\n }\n\n // add width\n if (isDefined(width)) {\n styles += `width:${width}px;`;\n }\n\n // apply styles\n const elementCurrentStyle = element.elementCurrentStyle || '';\n\n // if new styles does not match current styles, lets update!\n if (styles.length !== elementCurrentStyle.length || styles !== elementCurrentStyle) {\n element.style.cssText = styles;\n // store current styles so we can compare them to new styles later on\n // _not_ getting the style value is faster\n element.elementCurrentStyle = styles;\n }\n};\n\nconst Mixins = {\n styles,\n listeners,\n animations,\n apis,\n};\n\nconst updateRect = (rect = {}, element = {}, style = {}) => {\n if (!element.layoutCalculated) {\n rect.paddingTop = parseInt(style.paddingTop, 10) || 0;\n rect.marginTop = parseInt(style.marginTop, 10) || 0;\n rect.marginRight = parseInt(style.marginRight, 10) || 0;\n rect.marginBottom = parseInt(style.marginBottom, 10) || 0;\n rect.marginLeft = parseInt(style.marginLeft, 10) || 0;\n element.layoutCalculated = true;\n }\n\n rect.left = element.offsetLeft || 0;\n rect.top = element.offsetTop || 0;\n rect.width = element.offsetWidth || 0;\n rect.height = element.offsetHeight || 0;\n\n rect.right = rect.left + rect.width;\n rect.bottom = rect.top + rect.height;\n\n rect.scrollTop = element.scrollTop;\n\n rect.hidden = element.offsetParent === null;\n\n return rect;\n};\n\nconst createView =\n // default view definition\n ({\n // element definition\n tag = 'div',\n name = null,\n attributes = {},\n\n // view interaction\n read = () => {},\n write = () => {},\n create = () => {},\n destroy = () => {},\n\n // hooks\n filterFrameActionsForChild = (child, actions) => actions,\n didCreateView = () => {},\n didWriteView = () => {},\n\n // rect related\n ignoreRect = false,\n ignoreRectUpdate = false,\n\n // mixins\n mixins = [],\n } = {}) => (\n // each view requires reference to store\n store,\n // specific properties for this view\n props = {}\n ) => {\n // root element should not be changed\n const element = createElement(tag, `filepond--${name}`, attributes);\n\n // style reference should also not be changed\n const style = window.getComputedStyle(element, null);\n\n // element rectangle\n const rect = updateRect();\n let frameRect = null;\n\n // rest state\n let isResting = false;\n\n // pretty self explanatory\n const childViews = [];\n\n // loaded mixins\n const activeMixins = [];\n\n // references to created children\n const ref = {};\n\n // state used for each instance\n const state = {};\n\n // list of writers that will be called to update this view\n const writers = [\n write, // default writer\n ];\n\n const readers = [\n read, // default reader\n ];\n\n const destroyers = [\n destroy, // default destroy\n ];\n\n // core view methods\n const getElement = () => element;\n const getChildViews = () => childViews.concat();\n const getReference = () => ref;\n const createChildView = store => (view, props) => view(store, props);\n const getRect = () => {\n if (frameRect) {\n return frameRect;\n }\n frameRect = getViewRect(rect, childViews, [0, 0], [1, 1]);\n return frameRect;\n };\n const getStyle = () => style;\n\n /**\n * Read data from DOM\n * @private\n */\n const _read = () => {\n frameRect = null;\n\n // read child views\n childViews.forEach(child => child._read());\n\n const shouldUpdate = !(ignoreRectUpdate && rect.width && rect.height);\n if (shouldUpdate) {\n updateRect(rect, element, style);\n }\n\n // readers\n const api = { root: internalAPI, props, rect };\n readers.forEach(reader => reader(api));\n };\n\n /**\n * Write data to DOM\n * @private\n */\n const _write = (ts, frameActions, shouldOptimize) => {\n // if no actions, we assume that the view is resting\n let resting = frameActions.length === 0;\n\n // writers\n writers.forEach(writer => {\n const writerResting = writer({\n props,\n root: internalAPI,\n actions: frameActions,\n timestamp: ts,\n shouldOptimize,\n });\n if (writerResting === false) {\n resting = false;\n }\n });\n\n // run mixins\n activeMixins.forEach(mixin => {\n // if one of the mixins is still busy after write operation, we are not resting\n const mixinResting = mixin.write(ts);\n if (mixinResting === false) {\n resting = false;\n }\n });\n\n // updates child views that are currently attached to the DOM\n childViews\n .filter(child => !!child.element.parentNode)\n .forEach(child => {\n // if a child view is not resting, we are not resting\n const childResting = child._write(\n ts,\n filterFrameActionsForChild(child, frameActions),\n shouldOptimize\n );\n if (!childResting) {\n resting = false;\n }\n });\n\n // append new elements to DOM and update those\n childViews\n //.filter(child => !child.element.parentNode)\n .forEach((child, index) => {\n // skip\n if (child.element.parentNode) {\n return;\n }\n\n // append to DOM\n internalAPI.appendChild(child.element, index);\n\n // call read (need to know the size of these elements)\n child._read();\n\n // re-call write\n child._write(\n ts,\n filterFrameActionsForChild(child, frameActions),\n shouldOptimize\n );\n\n // we just added somthing to the dom, no rest\n resting = false;\n });\n\n // update resting state\n isResting = resting;\n\n didWriteView({\n props,\n root: internalAPI,\n actions: frameActions,\n timestamp: ts,\n });\n\n // let parent know if we are resting\n return resting;\n };\n\n const _destroy = () => {\n activeMixins.forEach(mixin => mixin.destroy());\n destroyers.forEach(destroyer => {\n destroyer({ root: internalAPI, props });\n });\n childViews.forEach(child => child._destroy());\n };\n\n // sharedAPI\n const sharedAPIDefinition = {\n element: {\n get: getElement,\n },\n style: {\n get: getStyle,\n },\n childViews: {\n get: getChildViews,\n },\n };\n\n // private API definition\n const internalAPIDefinition = {\n ...sharedAPIDefinition,\n rect: {\n get: getRect,\n },\n\n // access to custom children references\n ref: {\n get: getReference,\n },\n\n // dom modifiers\n is: needle => name === needle,\n appendChild: appendChild(element),\n createChildView: createChildView(store),\n linkView: view => {\n childViews.push(view);\n return view;\n },\n unlinkView: view => {\n childViews.splice(childViews.indexOf(view), 1);\n },\n appendChildView: appendChildView(element, childViews),\n removeChildView: removeChildView(element, childViews),\n registerWriter: writer => writers.push(writer),\n registerReader: reader => readers.push(reader),\n registerDestroyer: destroyer => destroyers.push(destroyer),\n invalidateLayout: () => (element.layoutCalculated = false),\n\n // access to data store\n dispatch: store.dispatch,\n query: store.query,\n };\n\n // public view API methods\n const externalAPIDefinition = {\n element: {\n get: getElement,\n },\n childViews: {\n get: getChildViews,\n },\n rect: {\n get: getRect,\n },\n resting: {\n get: () => isResting,\n },\n isRectIgnored: () => ignoreRect,\n _read,\n _write,\n _destroy,\n };\n\n // mixin API methods\n const mixinAPIDefinition = {\n ...sharedAPIDefinition,\n rect: {\n get: () => rect,\n },\n };\n\n // add mixin functionality\n Object.keys(mixins)\n .sort((a, b) => {\n // move styles to the back of the mixin list (so adjustments of other mixins are applied to the props correctly)\n if (a === 'styles') {\n return 1;\n } else if (b === 'styles') {\n return -1;\n }\n return 0;\n })\n .forEach(key => {\n const mixinAPI = Mixins[key]({\n mixinConfig: mixins[key],\n viewProps: props,\n viewState: state,\n viewInternalAPI: internalAPIDefinition,\n viewExternalAPI: externalAPIDefinition,\n view: createObject(mixinAPIDefinition),\n });\n\n if (mixinAPI) {\n activeMixins.push(mixinAPI);\n }\n });\n\n // construct private api\n const internalAPI = createObject(internalAPIDefinition);\n\n // create the view\n create({\n root: internalAPI,\n props,\n });\n\n // append created child views to root node\n const childCount = getChildCount(element); // need to know the current child count so appending happens in correct order\n childViews.forEach((child, index) => {\n internalAPI.appendChild(child.element, childCount + index);\n });\n\n // call did create\n didCreateView(internalAPI);\n\n // expose public api\n return createObject(externalAPIDefinition);\n };\n\nconst createPainter = (read, write, fps = 60) => {\n const name = '__framePainter';\n\n // set global painter\n if (window[name]) {\n window[name].readers.push(read);\n window[name].writers.push(write);\n return;\n }\n\n window[name] = {\n readers: [read],\n writers: [write],\n };\n\n const painter = window[name];\n\n const interval = 1000 / fps;\n let last = null;\n let id = null;\n let requestTick = null;\n let cancelTick = null;\n\n const setTimerType = () => {\n if (document.hidden) {\n requestTick = () => window.setTimeout(() => tick(performance.now()), interval);\n cancelTick = () => window.clearTimeout(id);\n } else {\n requestTick = () => window.requestAnimationFrame(tick);\n cancelTick = () => window.cancelAnimationFrame(id);\n }\n };\n\n document.addEventListener('visibilitychange', () => {\n if (cancelTick) cancelTick();\n setTimerType();\n tick(performance.now());\n });\n\n const tick = ts => {\n // queue next tick\n id = requestTick(tick);\n\n // limit fps\n if (!last) {\n last = ts;\n }\n\n const delta = ts - last;\n\n if (delta <= interval) {\n // skip frame\n return;\n }\n\n // align next frame\n last = ts - (delta % interval);\n\n // update view\n painter.readers.forEach(read => read());\n painter.writers.forEach(write => write(ts));\n };\n\n setTimerType();\n tick(performance.now());\n\n return {\n pause: () => {\n cancelTick(id);\n },\n };\n};\n\nconst createRoute = (routes, fn) => ({ root, props, actions = [], timestamp, shouldOptimize }) => {\n actions\n .filter(action => routes[action.type])\n .forEach(action =>\n routes[action.type]({ root, props, action: action.data, timestamp, shouldOptimize })\n );\n if (fn) {\n fn({ root, props, actions, timestamp, shouldOptimize });\n }\n};\n\nconst insertBefore = (newNode, referenceNode) =>\n referenceNode.parentNode.insertBefore(newNode, referenceNode);\n\nconst insertAfter = (newNode, referenceNode) => {\n return referenceNode.parentNode.insertBefore(newNode, referenceNode.nextSibling);\n};\n\nconst isArray = value => Array.isArray(value);\n\nconst isEmpty = value => value == null;\n\nconst trim = str => str.trim();\n\nconst toString = value => '' + value;\n\nconst toArray = (value, splitter = ',') => {\n if (isEmpty(value)) {\n return [];\n }\n if (isArray(value)) {\n return value;\n }\n return toString(value)\n .split(splitter)\n .map(trim)\n .filter(str => str.length);\n};\n\nconst isBoolean = value => typeof value === 'boolean';\n\nconst toBoolean = value => (isBoolean(value) ? value : value === 'true');\n\nconst isString = value => typeof value === 'string';\n\nconst toNumber = value =>\n isNumber(value) ? value : isString(value) ? toString(value).replace(/[a-z]+/gi, '') : 0;\n\nconst toInt = value => parseInt(toNumber(value), 10);\n\nconst toFloat = value => parseFloat(toNumber(value));\n\nconst isInt = value => isNumber(value) && isFinite(value) && Math.floor(value) === value;\n\nconst toBytes = (value, base = 1000) => {\n // is in bytes\n if (isInt(value)) {\n return value;\n }\n\n // is natural file size\n let naturalFileSize = toString(value).trim();\n\n // if is value in megabytes\n if (/MB$/i.test(naturalFileSize)) {\n naturalFileSize = naturalFileSize.replace(/MB$i/, '').trim();\n return toInt(naturalFileSize) * base * base;\n }\n\n // if is value in kilobytes\n if (/KB/i.test(naturalFileSize)) {\n naturalFileSize = naturalFileSize.replace(/KB$i/, '').trim();\n return toInt(naturalFileSize) * base;\n }\n\n return toInt(naturalFileSize);\n};\n\nconst isFunction = value => typeof value === 'function';\n\nconst toFunctionReference = string => {\n let ref = self;\n let levels = string.split('.');\n let level = null;\n while ((level = levels.shift())) {\n ref = ref[level];\n if (!ref) {\n return null;\n }\n }\n return ref;\n};\n\nconst methods = {\n process: 'POST',\n patch: 'PATCH',\n revert: 'DELETE',\n fetch: 'GET',\n restore: 'GET',\n load: 'GET',\n};\n\nconst createServerAPI = outline => {\n const api = {};\n\n api.url = isString(outline) ? outline : outline.url || '';\n api.timeout = outline.timeout ? parseInt(outline.timeout, 10) : 0;\n api.headers = outline.headers ? outline.headers : {};\n\n forin(methods, key => {\n api[key] = createAction(key, outline[key], methods[key], api.timeout, api.headers);\n });\n\n // remove process if no url or process on outline\n api.process = outline.process || isString(outline) || outline.url ? api.process : null;\n\n // special treatment for remove\n api.remove = outline.remove || null;\n\n // remove generic headers from api object\n delete api.headers;\n\n return api;\n};\n\nconst createAction = (name, outline, method, timeout, headers) => {\n // is explicitely set to null so disable\n if (outline === null) {\n return null;\n }\n\n // if is custom function, done! Dev handles everything.\n if (typeof outline === 'function') {\n return outline;\n }\n\n // build action object\n const action = {\n url: method === 'GET' || method === 'PATCH' ? `?${name}=` : '',\n method,\n headers,\n withCredentials: false,\n timeout,\n onload: null,\n ondata: null,\n onerror: null,\n };\n\n // is a single url\n if (isString(outline)) {\n action.url = outline;\n return action;\n }\n\n // overwrite\n Object.assign(action, outline);\n\n // see if should reformat headers;\n if (isString(action.headers)) {\n const parts = action.headers.split(/:(.+)/);\n action.headers = {\n header: parts[0],\n value: parts[1],\n };\n }\n\n // if is bool withCredentials\n action.withCredentials = toBoolean(action.withCredentials);\n\n return action;\n};\n\nconst toServerAPI = value => createServerAPI(value);\n\nconst isNull = value => value === null;\n\nconst isObject = value => typeof value === 'object' && value !== null;\n\nconst isAPI = value => {\n return (\n isObject(value) &&\n isString(value.url) &&\n isObject(value.process) &&\n isObject(value.revert) &&\n isObject(value.restore) &&\n isObject(value.fetch)\n );\n};\n\nconst getType = value => {\n if (isArray(value)) {\n return 'array';\n }\n\n if (isNull(value)) {\n return 'null';\n }\n\n if (isInt(value)) {\n return 'int';\n }\n\n if (/^[0-9]+ ?(?:GB|MB|KB)$/gi.test(value)) {\n return 'bytes';\n }\n\n if (isAPI(value)) {\n return 'api';\n }\n\n return typeof value;\n};\n\nconst replaceSingleQuotes = str =>\n str\n .replace(/{\\s*'/g, '{\"')\n .replace(/'\\s*}/g, '\"}')\n .replace(/'\\s*:/g, '\":')\n .replace(/:\\s*'/g, ':\"')\n .replace(/,\\s*'/g, ',\"')\n .replace(/'\\s*,/g, '\",');\n\nconst conversionTable = {\n array: toArray,\n boolean: toBoolean,\n int: value => (getType(value) === 'bytes' ? toBytes(value) : toInt(value)),\n number: toFloat,\n float: toFloat,\n bytes: toBytes,\n string: value => (isFunction(value) ? value : toString(value)),\n function: value => toFunctionReference(value),\n serverapi: toServerAPI,\n object: value => {\n try {\n return JSON.parse(replaceSingleQuotes(value));\n } catch (e) {\n return null;\n }\n },\n};\n\nconst convertTo = (value, type) => conversionTable[type](value);\n\nconst getValueByType = (newValue, defaultValue, valueType) => {\n // can always assign default value\n if (newValue === defaultValue) {\n return newValue;\n }\n\n // get the type of the new value\n let newValueType = getType(newValue);\n\n // is valid type?\n if (newValueType !== valueType) {\n // is string input, let's attempt to convert\n const convertedValue = convertTo(newValue, valueType);\n\n // what is the type now\n newValueType = getType(convertedValue);\n\n // no valid conversions found\n if (convertedValue === null) {\n throw `Trying to assign value with incorrect type to \"${option}\", allowed type: \"${valueType}\"`;\n } else {\n newValue = convertedValue;\n }\n }\n\n // assign new value\n return newValue;\n};\n\nconst createOption = (defaultValue, valueType) => {\n let currentValue = defaultValue;\n return {\n enumerable: true,\n get: () => currentValue,\n set: newValue => {\n currentValue = getValueByType(newValue, defaultValue, valueType);\n },\n };\n};\n\nconst createOptions = options => {\n const obj = {};\n forin(options, prop => {\n const optionDefinition = options[prop];\n obj[prop] = createOption(optionDefinition[0], optionDefinition[1]);\n });\n return createObject(obj);\n};\n\nconst createInitialState = options => ({\n // model\n items: [],\n\n // timeout used for calling update items\n listUpdateTimeout: null,\n\n // timeout used for stacking metadata updates\n itemUpdateTimeout: null,\n\n // queue of items waiting to be processed\n processingQueue: [],\n\n // options\n options: createOptions(options),\n});\n\nconst fromCamels = (string, separator = '-') =>\n string\n .split(/(?=[A-Z])/)\n .map(part => part.toLowerCase())\n .join(separator);\n\nconst createOptionAPI = (store, options) => {\n const obj = {};\n forin(options, key => {\n obj[key] = {\n get: () => store.getState().options[key],\n set: value => {\n store.dispatch(`SET_${fromCamels(key, '_').toUpperCase()}`, {\n value,\n });\n },\n };\n });\n return obj;\n};\n\nconst createOptionActions = options => (dispatch, query, state) => {\n const obj = {};\n forin(options, key => {\n const name = fromCamels(key, '_').toUpperCase();\n\n obj[`SET_${name}`] = action => {\n try {\n state.options[key] = action.value;\n } catch (e) {\n // nope, failed\n }\n\n // we successfully set the value of this option\n dispatch(`DID_SET_${name}`, { value: state.options[key] });\n };\n });\n return obj;\n};\n\nconst createOptionQueries = options => state => {\n const obj = {};\n forin(options, key => {\n obj[`GET_${fromCamels(key, '_').toUpperCase()}`] = action => state.options[key];\n });\n return obj;\n};\n\nconst InteractionMethod = {\n API: 1,\n DROP: 2,\n BROWSE: 3,\n PASTE: 4,\n NONE: 5,\n};\n\nconst getUniqueId = () =>\n Math.random()\n .toString(36)\n .substring(2, 11);\n\nconst arrayRemove = (arr, index) => arr.splice(index, 1);\n\nconst run = (cb, sync) => {\n if (sync) {\n cb();\n } else if (document.hidden) {\n Promise.resolve(1).then(cb);\n } else {\n setTimeout(cb, 0);\n }\n};\n\nconst on = () => {\n const listeners = [];\n const off = (event, cb) => {\n arrayRemove(\n listeners,\n listeners.findIndex(listener => listener.event === event && (listener.cb === cb || !cb))\n );\n };\n const fire = (event, args, sync) => {\n listeners\n .filter(listener => listener.event === event)\n .map(listener => listener.cb)\n .forEach(cb => run(() => cb(...args), sync));\n };\n return {\n fireSync: (event, ...args) => {\n fire(event, args, true);\n },\n fire: (event, ...args) => {\n fire(event, args, false);\n },\n on: (event, cb) => {\n listeners.push({ event, cb });\n },\n onOnce: (event, cb) => {\n listeners.push({\n event,\n cb: (...args) => {\n off(event, cb);\n cb(...args);\n },\n });\n },\n off,\n };\n};\n\nconst copyObjectPropertiesToObject = (src, target, excluded) => {\n Object.getOwnPropertyNames(src)\n .filter(property => !excluded.includes(property))\n .forEach(key =>\n Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(src, key))\n );\n};\n\nconst PRIVATE = [\n 'fire',\n 'process',\n 'revert',\n 'load',\n 'on',\n 'off',\n 'onOnce',\n 'retryLoad',\n 'extend',\n 'archive',\n 'archived',\n 'release',\n 'released',\n 'requestProcessing',\n 'freeze',\n];\n\nconst createItemAPI = item => {\n const api = {};\n copyObjectPropertiesToObject(item, api, PRIVATE);\n return api;\n};\n\nconst removeReleasedItems = items => {\n items.forEach((item, index) => {\n if (item.released) {\n arrayRemove(items, index);\n }\n });\n};\n\nconst ItemStatus = {\n INIT: 1,\n IDLE: 2,\n PROCESSING_QUEUED: 9,\n PROCESSING: 3,\n PROCESSING_COMPLETE: 5,\n PROCESSING_ERROR: 6,\n PROCESSING_REVERT_ERROR: 10,\n LOADING: 7,\n LOAD_ERROR: 8,\n};\n\nconst FileOrigin = {\n INPUT: 1,\n LIMBO: 2,\n LOCAL: 3,\n};\n\nconst getNonNumeric = str => /[^0-9]+/.exec(str);\n\nconst getDecimalSeparator = () => getNonNumeric((1.1).toLocaleString())[0];\n\nconst getThousandsSeparator = () => {\n // Added for browsers that do not return the thousands separator (happend on native browser Android 4.4.4)\n // We check against the normal toString output and if they're the same return a comma when decimal separator is a dot\n const decimalSeparator = getDecimalSeparator();\n const thousandsStringWithSeparator = (1000.0).toLocaleString();\n const thousandsStringWithoutSeparator = (1000.0).toString();\n if (thousandsStringWithSeparator !== thousandsStringWithoutSeparator) {\n return getNonNumeric(thousandsStringWithSeparator)[0];\n }\n return decimalSeparator === '.' ? ',' : '.';\n};\n\nconst Type = {\n BOOLEAN: 'boolean',\n INT: 'int',\n NUMBER: 'number',\n STRING: 'string',\n ARRAY: 'array',\n OBJECT: 'object',\n FUNCTION: 'function',\n ACTION: 'action',\n SERVER_API: 'serverapi',\n REGEX: 'regex',\n};\n\n// all registered filters\nconst filters = [];\n\n// loops over matching filters and passes options to each filter, returning the mapped results\nconst applyFilterChain = (key, value, utils) =>\n new Promise((resolve, reject) => {\n // find matching filters for this key\n const matchingFilters = filters.filter(f => f.key === key).map(f => f.cb);\n\n // resolve now\n if (matchingFilters.length === 0) {\n resolve(value);\n return;\n }\n\n // first filter to kick things of\n const initialFilter = matchingFilters.shift();\n\n // chain filters\n matchingFilters\n .reduce(\n // loop over promises passing value to next promise\n (current, next) => current.then(value => next(value, utils)),\n\n // call initial filter, will return a promise\n initialFilter(value, utils)\n\n // all executed\n )\n .then(value => resolve(value))\n .catch(error => reject(error));\n });\n\nconst applyFilters = (key, value, utils) =>\n filters.filter(f => f.key === key).map(f => f.cb(value, utils));\n\n// adds a new filter to the list\nconst addFilter = (key, cb) => filters.push({ key, cb });\n\nconst extendDefaultOptions = additionalOptions => Object.assign(defaultOptions, additionalOptions);\n\nconst getOptions = () => ({ ...defaultOptions });\n\nconst setOptions = opts => {\n forin(opts, (key, value) => {\n // key does not exist, so this option cannot be set\n if (!defaultOptions[key]) {\n return;\n }\n defaultOptions[key][0] = getValueByType(\n value,\n defaultOptions[key][0],\n defaultOptions[key][1]\n );\n });\n};\n\n// default options on app\nconst defaultOptions = {\n // the id to add to the root element\n id: [null, Type.STRING],\n\n // input field name to use\n name: ['filepond', Type.STRING],\n\n // disable the field\n disabled: [false, Type.BOOLEAN],\n\n // classname to put on wrapper\n className: [null, Type.STRING],\n\n // is the field required\n required: [false, Type.BOOLEAN],\n\n // Allow media capture when value is set\n captureMethod: [null, Type.STRING],\n // - \"camera\", \"microphone\" or \"camcorder\",\n // - Does not work with multiple on apple devices\n // - If set, acceptedFileTypes must be made to match with media wildcard \"image/*\", \"audio/*\" or \"video/*\"\n\n // sync `acceptedFileTypes` property with `accept` attribute\n allowSyncAcceptAttribute: [true, Type.BOOLEAN],\n\n // Feature toggles\n allowDrop: [true, Type.BOOLEAN], // Allow dropping of files\n allowBrowse: [true, Type.BOOLEAN], // Allow browsing the file system\n allowPaste: [true, Type.BOOLEAN], // Allow pasting files\n allowMultiple: [false, Type.BOOLEAN], // Allow multiple files (disabled by default, as multiple attribute is also required on input to allow multiple)\n allowReplace: [true, Type.BOOLEAN], // Allow dropping a file on other file to replace it (only works when multiple is set to false)\n allowRevert: [true, Type.BOOLEAN], // Allows user to revert file upload\n allowRemove: [true, Type.BOOLEAN], // Allow user to remove a file\n allowProcess: [true, Type.BOOLEAN], // Allows user to process a file, when set to false, this removes the file upload button\n allowReorder: [false, Type.BOOLEAN], // Allow reordering of files\n allowDirectoriesOnly: [false, Type.BOOLEAN], // Allow only selecting directories with browse (no support for filtering dnd at this point)\n\n // Try store file if `server` not set\n storeAsFile: [false, Type.BOOLEAN],\n\n // Revert mode\n forceRevert: [false, Type.BOOLEAN], // Set to 'force' to require the file to be reverted before removal\n\n // Input requirements\n maxFiles: [null, Type.INT], // Max number of files\n checkValidity: [false, Type.BOOLEAN], // Enables custom validity messages\n\n // Where to put file\n itemInsertLocationFreedom: [true, Type.BOOLEAN], // Set to false to always add items to begin or end of list\n itemInsertLocation: ['before', Type.STRING], // Default index in list to add items that have been dropped at the top of the list\n itemInsertInterval: [75, Type.INT],\n\n // Drag 'n Drop related\n dropOnPage: [false, Type.BOOLEAN], // Allow dropping of files anywhere on page (prevents browser from opening file if dropped outside of Up)\n dropOnElement: [true, Type.BOOLEAN], // Drop needs to happen on element (set to false to also load drops outside of Up)\n dropValidation: [false, Type.BOOLEAN], // Enable or disable validating files on drop\n ignoredFiles: [['.ds_store', 'thumbs.db', 'desktop.ini'], Type.ARRAY],\n\n // Upload related\n instantUpload: [true, Type.BOOLEAN], // Should upload files immediately on drop\n maxParallelUploads: [2, Type.INT], // Maximum files to upload in parallel\n allowMinimumUploadDuration: [true, Type.BOOLEAN], // if true uploads take at least 750 ms, this ensures the user sees the upload progress giving trust the upload actually happened\n\n // Chunks\n chunkUploads: [false, Type.BOOLEAN], // Enable chunked uploads\n chunkForce: [false, Type.BOOLEAN], // Force use of chunk uploads even for files smaller than chunk size\n chunkSize: [5000000, Type.INT], // Size of chunks (5MB default)\n chunkRetryDelays: [[500, 1000, 3000], Type.ARRAY], // Amount of times to retry upload of a chunk when it fails\n\n // The server api end points to use for uploading (see docs)\n server: [null, Type.SERVER_API],\n\n // File size calculations, can set to 1024, this is only used for display, properties use file size base 1000\n fileSizeBase: [1000, Type.INT],\n\n // Labels and status messages\n labelFileSizeBytes: ['bytes', Type.STRING],\n labelFileSizeKilobytes: ['KB', Type.STRING],\n labelFileSizeMegabytes: ['MB', Type.STRING],\n labelFileSizeGigabytes: ['GB', Type.STRING],\n\n labelDecimalSeparator: [getDecimalSeparator(), Type.STRING], // Default is locale separator\n labelThousandsSeparator: [getThousandsSeparator(), Type.STRING], // Default is locale separator\n\n labelIdle: [\n 'Drag & Drop your files or <span class=\"filepond--label-action\">Browse</span>',\n Type.STRING,\n ],\n labelInvalidField: ['Field contains invalid files', Type.STRING],\n labelFileWaitingForSize: ['Waiting for size', Type.STRING],\n labelFileSizeNotAvailable: ['Size not available', Type.STRING],\n labelFileCountSingular: ['file in list', Type.STRING],\n labelFileCountPlural: ['files in list', Type.STRING],\n labelFileLoading: ['Loading', Type.STRING],\n labelFileAdded: ['Added', Type.STRING], // assistive only\n labelFileLoadError: ['Error during load', Type.STRING],\n labelFileRemoved: ['Removed', Type.STRING], // assistive only\n labelFileRemoveError: ['Error during remove', Type.STRING],\n labelFileProcessing: ['Uploading', Type.STRING],\n labelFileProcessingComplete: ['Upload complete', Type.STRING],\n labelFileProcessingAborted: ['Upload cancelled', Type.STRING],\n labelFileProcessingError: ['Error during upload', Type.STRING],\n labelFileProcessingRevertError: ['Error during revert', Type.STRING],\n\n labelTapToCancel: ['tap to cancel', Type.STRING],\n labelTapToRetry: ['tap to retry', Type.STRING],\n labelTapToUndo: ['tap to undo', Type.STRING],\n\n labelButtonRemoveItem: ['Remove', Type.STRING],\n labelButtonAbortItemLoad: ['Abort', Type.STRING],\n labelButtonRetryItemLoad: ['Retry', Type.STRING],\n labelButtonAbortItemProcessing: ['Cancel', Type.STRING],\n labelButtonUndoItemProcessing: ['Undo', Type.STRING],\n labelButtonRetryItemProcessing: ['Retry', Type.STRING],\n labelButtonProcessItem: ['Upload', Type.STRING],\n\n // make sure width and height plus viewpox are even numbers so icons are nicely centered\n iconRemove: [\n '<svg width=\"26\" height=\"26\" viewBox=\"0 0 26 26\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M11.586 13l-2.293 2.293a1 1 0 0 0 1.414 1.414L13 14.414l2.293 2.293a1 1 0 0 0 1.414-1.414L14.414 13l2.293-2.293a1 1 0 0 0-1.414-1.414L13 11.586l-2.293-2.293a1 1 0 0 0-1.414 1.414L11.586 13z\" fill=\"currentColor\" fill-rule=\"nonzero\"/></svg>',\n Type.STRING,\n ],\n iconProcess: [\n '<svg width=\"26\" height=\"26\" viewBox=\"0 0 26 26\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M14 10.414v3.585a1 1 0 0 1-2 0v-3.585l-1.293 1.293a1 1 0 0 1-1.414-1.415l3-3a1 1 0 0 1 1.414 0l3 3a1 1 0 0 1-1.414 1.415L14 10.414zM9 18a1 1 0 0 1 0-2h8a1 1 0 0 1 0 2H9z\" fill=\"currentColor\" fill-rule=\"evenodd\"/></svg>',\n Type.STRING,\n ],\n iconRetry: [\n '<svg width=\"26\" height=\"26\" viewBox=\"0 0 26 26\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M10.81 9.185l-.038.02A4.997 4.997 0 0 0 8 13.683a5 5 0 0 0 5 5 5 5 0 0 0 5-5 1 1 0 0 1 2 0A7 7 0 1 1 9.722 7.496l-.842-.21a.999.999 0 1 1 .484-1.94l3.23.806c.535.133.86.675.73 1.21l-.804 3.233a.997.997 0 0 1-1.21.73.997.997 0 0 1-.73-1.21l.23-.928v-.002z\" fill=\"currentColor\" fill-rule=\"nonzero\"/></svg>',\n Type.STRING,\n ],\n iconUndo: [\n '<svg width=\"26\" height=\"26\" viewBox=\"0 0 26 26\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M9.185 10.81l.02-.038A4.997 4.997 0 0 1 13.683 8a5 5 0 0 1 5 5 5 5 0 0 1-5 5 1 1 0 0 0 0 2A7 7 0 1 0 7.496 9.722l-.21-.842a.999.999 0 1 0-1.94.484l.806 3.23c.133.535.675.86 1.21.73l3.233-.803a.997.997 0 0 0 .73-1.21.997.997 0 0 0-1.21-.73l-.928.23-.002-.001z\" fill=\"currentColor\" fill-rule=\"nonzero\"/></svg>',\n Type.STRING,\n ],\n iconDone: [\n '<svg width=\"26\" height=\"26\" viewBox=\"0 0 26 26\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M18.293 9.293a1 1 0 0 1 1.414 1.414l-7.002 7a1 1 0 0 1-1.414 0l-3.998-4a1 1 0 1 1 1.414-1.414L12 15.586l6.294-6.293z\" fill=\"currentColor\" fill-rule=\"nonzero\"/></svg>',\n Type.STRING,\n ],\n\n // event handlers\n oninit: [null, Type.FUNCTION],\n onwarning: [null, Type.FUNCTION],\n onerror: [null, Type.FUNCTION],\n onactivatefile: [null, Type.FUNCTION],\n oninitfile: [null, Type.FUNCTION],\n onaddfilestart: [null, Type.FUNCTION],\n onaddfileprogress: [null, Type.FUNCTION],\n onaddfile: [null, Type.FUNCTION],\n onprocessfilestart: [null, Type.FUNCTION],\n onprocessfileprogress: [null, Type.FUNCTION],\n onprocessfileabort: [null, Type.FUNCTION],\n onprocessfilerevert: [null, Type.FUNCTION],\n onprocessfile: [null, Type.FUNCTION],\n onprocessfiles: [null, Type.FUNCTION],\n onremovefile: [null, Type.FUNCTION],\n onpreparefile: [null, Type.FUNCTION],\n onupdatefiles: [null, Type.FUNCTION],\n onreorderfiles: [null, Type.FUNCTION],\n\n // hooks\n beforeDropFile: [null, Type.FUNCTION],\n beforeAddFile: [null, Type.FUNCTION],\n beforeRemoveFile: [null, Type.FUNCTION],\n beforePrepareFile: [null, Type.FUNCTION],\n\n // styles\n stylePanelLayout: [null, Type.STRING], // null 'integrated', 'compact', 'circle'\n stylePanelAspectRatio: [null, Type.STRING], // null or '3:2' or 1\n styleItemPanelAspectRatio: [null, Type.STRING],\n styleButtonRemoveItemPosition: ['left', Type.STRING],\n styleButtonProcessItemPosition: ['right', Type.STRING],\n styleLoadIndicatorPosition: ['right', Type.STRING],\n styleProgressIndicatorPosition: ['right', Type.STRING],\n styleButtonRemoveItemAlign: [false, Type.BOOLEAN],\n\n // custom initial files array\n files: [[], Type.ARRAY],\n\n // show support by displaying credits\n credits: [['https://pqina.nl/', 'Powered by PQINA'], Type.ARRAY],\n};\n\nconst getItemByQuery = (items, query) => {\n // just return first index\n if (isEmpty(query)) {\n return items[0] || null;\n }\n\n // query is index\n if (isInt(query)) {\n return items[query] || null;\n }\n\n // if query is item, get the id\n if (typeof query === 'object') {\n query = query.id;\n }\n\n // assume query is a string and return item by id\n return items.find(item => item.id === query) || null;\n};\n\nconst getNumericAspectRatioFromString = aspectRatio => {\n if (isEmpty(aspectRatio)) {\n return aspectRatio;\n }\n if (/:/.test(aspectRatio)) {\n const parts = aspectRatio.split(':');\n return parts[1] / parts[0];\n }\n return parseFloat(aspectRatio);\n};\n\nconst getActiveItems = items => items.filter(item => !item.archived);\n\nconst Status = {\n EMPTY: 0,\n IDLE: 1, // waiting\n ERROR: 2, // a file is in error state\n BUSY: 3, // busy processing or loading\n READY: 4, // all files uploaded\n};\n\nlet res = null;\nconst canUpdateFileInput = () => {\n if (res === null) {\n try {\n const dataTransfer = new DataTransfer();\n dataTransfer.items.add(new File(['hello world'], 'This_Works.txt'));\n const el = document.createElement('input');\n el.setAttribute('type', 'file');\n el.files = dataTransfer.files;\n res = el.files.length === 1;\n } catch (err) {\n res = false;\n }\n }\n return res;\n};\n\nconst ITEM_ERROR = [\n ItemStatus.LOAD_ERROR,\n ItemStatus.PROCESSING_ERROR,\n ItemStatus.PROCESSING_REVERT_ERROR,\n];\nconst ITEM_BUSY = [\n ItemStatus.LOADING,\n ItemStatus.PROCESSING,\n ItemStatus.PROCESSING_QUEUED,\n ItemStatus.INIT,\n];\nconst ITEM_READY = [ItemStatus.PROCESSING_COMPLETE];\n\nconst isItemInErrorState = item => ITEM_ERROR.includes(item.status);\nconst isItemInBusyState = item => ITEM_BUSY.includes(item.status);\nconst isItemInReadyState = item => ITEM_READY.includes(item.status);\n\nconst isAsync = state =>\n isObject(state.options.server) &&\n (isObject(state.options.server.process) || isFunction(state.options.server.process));\n\nconst queries = state => ({\n GET_STATUS: () => {\n const items = getActiveItems(state.items);\n\n const { EMPTY, ERROR, BUSY, IDLE, READY } = Status;\n\n if (items.length === 0) return EMPTY;\n\n if (items.some(isItemInErrorState)) return ERROR;\n\n if (items.some(isItemInBusyState)) return BUSY;\n\n if (items.some(isItemInReadyState)) return READY;\n\n return IDLE;\n },\n\n GET_ITEM: query => getItemByQuery(state.items, query),\n\n GET_ACTIVE_ITEM: query => getItemByQuery(getActiveItems(state.items), query),\n\n GET_ACTIVE_ITEMS: () => getActiveItems(state.items),\n\n GET_ITEMS: () => state.items,\n\n GET_ITEM_NAME: query => {\n const item = getItemByQuery(state.items, query);\n return item ? item.filename : null;\n },\n\n GET_ITEM_SIZE: query => {\n const item = getItemByQuery(state.items, query);\n return item ? item.fileSize : null;\n },\n\n GET_STYLES: () =>\n Object.keys(state.options)\n .filter(key => /^style/.test(key))\n .map(option => ({\n name: option,\n value: state.options[option],\n })),\n\n GET_PANEL_ASPECT_RATIO: () => {\n const isShapeCircle = /circle/.test(state.options.stylePanelLayout);\n const aspectRatio = isShapeCircle\n ? 1\n : getNumericAspectRatioFromString(state.options.stylePanelAspectRatio);\n return aspectRatio;\n },\n\n GET_ITEM_PANEL_ASPECT_RATIO: () => state.options.styleItemPanelAspectRatio,\n\n GET_ITEMS_BY_STATUS: status =>\n getActiveItems(state.items).filter(item => item.status === status),\n\n GET_TOTAL_ITEMS: () => getActiveItems(state.items).length,\n\n SHOULD_UPDATE_FILE_INPUT: () =>\n state.options.storeAsFile && canUpdateFileInput() && !isAsync(state),\n\n IS_ASYNC: () => isAsync(state),\n\n GET_FILE_SIZE_LABELS: query => ({\n labelBytes: query('GET_LABEL_FILE_SIZE_BYTES') || undefined,\n labelKilobytes: query('GET_LABEL_FILE_SIZE_KILOBYTES') || undefined,\n labelMegabytes: query('GET_LABEL_FILE_SIZE_MEGABYTES') || undefined,\n labelGigabytes: query('GET_LABEL_FILE_SIZE_GIGABYTES') || undefined,\n }),\n});\n\nconst hasRoomForItem = state => {\n const count = getActiveItems(state.items).length;\n\n // if cannot have multiple items, to add one item it should currently not contain items\n if (!state.options.allowMultiple) {\n return count === 0;\n }\n\n // if allows multiple items, we check if a max item count has been set, if not, there's no limit\n const maxFileCount = state.options.maxFiles;\n if (maxFileCount === null) {\n return true;\n }\n\n // we check if the current count is smaller than the max count, if so, another file can still be added\n if (count < maxFileCount) {\n return true;\n }\n\n // no more room for another file\n return false;\n};\n\nconst limit = (value, min, max) => Math.max(Math.min(max, value), min);\n\nconst arrayInsert = (arr, index, item) => arr.splice(index, 0, item);\n\nconst insertItem = (items, item, index) => {\n if (isEmpty(item)) {\n return null;\n }\n\n // if index is undefined, append\n if (typeof index === 'undefined') {\n items.push(item);\n return item;\n }\n\n // limit the index to the size of the items array\n index = limit(index, 0, items.length);\n\n // add item to array\n arrayInsert(items, index, item);\n\n // expose\n return item;\n};\n\nconst isBase64DataURI = str =>\n /^\\s*data:([a-z]+\\/[a-z0-9-+.]+(;[a-z-]+=[a-z0-9-]+)?)?(;base64)?,([a-z0-9!$&',()*+;=\\-._~:@\\/?%\\s]*)\\s*$/i.test(\n str\n );\n\nconst getFilenameFromURL = url =>\n `${url}`\n .split('/')\n .pop()\n .split('?')\n .shift();\n\nconst getExtensionFromFilename = name => name.split('.').pop();\n\nconst guesstimateExtension = type => {\n // if no extension supplied, exit here\n if (typeof type !== 'string') {\n return '';\n }\n\n // get subtype\n const subtype = type.split('/').pop();\n\n // is svg subtype\n if (/svg/.test(subtype)) {\n return 'svg';\n }\n\n if (/zip|compressed/.test(subtype)) {\n return 'zip';\n }\n\n if (/plain/.test(subtype)) {\n return 'txt';\n }\n\n if (/msword/.test(subtype)) {\n return 'doc';\n }\n\n // if is valid subtype\n if (/[a-z]+/.test(subtype)) {\n // always use jpg extension\n if (subtype === 'jpeg') {\n return 'jpg';\n }\n\n // return subtype\n return subtype;\n }\n\n return '';\n};\n\nconst leftPad = (value, padding = '') => (padding + value).slice(-padding.length);\n\nconst getDateString = (date = new Date()) =>\n `${date.getFullYear()}-${leftPad(date.getMonth() + 1, '00')}-${leftPad(\n date.getDate(),\n '00'\n )}_${leftPad(date.getHours(), '00')}-${leftPad(date.getMinutes(), '00')}-${leftPad(\n date.getSeconds(),\n '00'\n )}`;\n\nconst getFileFromBlob = (blob, filename, type = null, extension = null) => {\n const file =\n typeof type === 'string'\n ? blob.slice(0, blob.size, type)\n : blob.slice(0, blob.size, blob.type);\n file.lastModifiedDate = new Date();\n\n // copy relative path\n if (blob._relativePath) file._relativePath = blob._relativePath;\n\n // if blob has name property, use as filename if no filename supplied\n if (!isString(filename)) {\n filename = getDateString();\n }\n\n // if filename supplied but no extension and filename has extension\n if (filename && extension === null && getExtensionFromFilename(filename)) {\n file.name = filename;\n } else {\n extension = extension || guesstimateExtension(file.type);\n file.name = filename + (extension ? '.' + extension : '');\n }\n\n return file;\n};\n\nconst getBlobBuilder = () => {\n return (window.BlobBuilder =\n window.BlobBuilder ||\n window.WebKitBlobBuilder ||\n window.MozBlobBuilder ||\n window.MSBlobBuilder);\n};\n\nconst createBlob = (arrayBuffer, mimeType) => {\n const BB = getBlobBuilder();\n\n if (BB) {\n const bb = new BB();\n bb.append(arrayBuffer);\n return bb.getBlob(mimeType);\n }\n\n return new Blob([arrayBuffer], {\n type: mimeType,\n });\n};\n\nconst getBlobFromByteStringWithMimeType = (byteString, mimeType) => {\n const ab = new ArrayBuffer(byteString.length);\n const ia = new Uint8Array(ab);\n\n for (let i = 0; i < byteString.length; i++) {\n ia[i] = byteString.charCodeAt(i);\n }\n\n return createBlob(ab, mimeType);\n};\n\nconst getMimeTypeFromBase64DataURI = dataURI => {\n return (/^data:(.+);/.exec(dataURI) || [])[1] || null;\n};\n\nconst getBase64DataFromBase64DataURI = dataURI => {\n // get data part of string (remove data:image/jpeg...,)\n const data = dataURI.split(',')[1];\n\n // remove any whitespace as that causes InvalidCharacterError in IE\n return data.replace(/\\s/g, '');\n};\n\nconst getByteStringFromBase64DataURI = dataURI => {\n return atob(getBase64DataFromBase64DataURI(dataURI));\n};\n\nconst getBlobFromBase64DataURI = dataURI => {\n const mimeType = getMimeTypeFromBase64DataURI(dataURI);\n const byteString = getByteStringFromBase64DataURI(dataURI);\n\n return getBlobFromByteStringWithMimeType(byteString, mimeType);\n};\n\nconst getFileFromBase64DataURI = (dataURI, filename, extension) => {\n return getFileFromBlob(getBlobFromBase64DataURI(dataURI), filename, null, extension);\n};\n\nconst getFileNameFromHeader = header => {\n // test if is content disposition header, if not exit\n if (!/^content-disposition:/i.test(header)) return null;\n\n // get filename parts\n const matches = header\n .split(/filename=|filename\\*=.+''/)\n .splice(1)\n .map(name => name.trim().replace(/^[\"']|[;\"']{0,2}$/g, ''))\n .filter(name => name.length);\n\n return matches.length ? decodeURI(matches[matches.length - 1]) : null;\n};\n\nconst getFileSizeFromHeader = header => {\n if (/content-length:/i.test(header)) {\n const size = header.match(/[0-9]+/)[0];\n return size ? parseInt(size, 10) : null;\n }\n return null;\n};\n\nconst getTranfserIdFromHeader = header => {\n if (/x-content-transfer-id:/i.test(header)) {\n const id = (header.split(':')[1] || '').trim();\n return id || null;\n }\n return null;\n};\n\nconst getFileInfoFromHeaders = headers => {\n const info = {\n source: null,\n name: null,\n size: null,\n };\n\n const rows = headers.split('\\n');\n for (let header of rows) {\n const name = getFileNameFromHeader(header);\n if (name) {\n info.name = name;\n continue;\n }\n\n const size = getFileSizeFromHeader(header);\n if (size) {\n info.size = size;\n continue;\n }\n\n const source = getTranfserIdFromHeader(header);\n if (source) {\n info.source = source;\n continue;\n }\n }\n\n return info;\n};\n\nconst createFileLoader = fetchFn => {\n const state = {\n source: null,\n complete: false,\n progress: 0,\n size: null,\n timestamp: null,\n duration: 0,\n request: null,\n };\n\n const getProgress = () => state.progress;\n const abort = () => {\n if (state.request && state.request.abort) {\n state.request.abort();\n }\n };\n\n // load source\n const load = () => {\n // get quick reference\n const source = state.source;\n\n api.fire('init', source);\n\n // Load Files\n if (source instanceof File) {\n api.fire('load', source);\n } else if (source instanceof Blob) {\n // Load blobs, set default name to current date\n api.fire('load', getFileFromBlob(source, source.name));\n } else if (isBase64DataURI(source)) {\n // Load base 64, set default name to current date\n api.fire('load', getFileFromBase64DataURI(source));\n } else {\n // Deal as if is external URL, let's load it!\n loadURL(source);\n }\n };\n\n // loads a url\n const loadURL = url => {\n // is remote url and no fetch method supplied\n if (!fetchFn) {\n api.fire('error', {\n type: 'error',\n body: \"Can't load URL\",\n code: 400,\n });\n return;\n }\n\n // set request start\n state.timestamp = Date.now();\n\n // load file\n state.request = fetchFn(\n url,\n response => {\n // update duration\n state.duration = Date.now() - state.timestamp;\n\n // done!\n state.complete = true;\n\n // turn blob response into a file\n if (response instanceof Blob) {\n response = getFileFromBlob(response, response.name || getFilenameFromURL(url));\n }\n\n api.fire(\n 'load',\n // if has received blob, we go with blob, if no response, we return null\n response instanceof Blob ? response : response ? response.body : null\n );\n },\n error => {\n api.fire(\n 'error',\n typeof error === 'string'\n ? {\n type: 'error',\n code: 0,\n body: error,\n }\n : error\n );\n },\n (computable, current, total) => {\n // collected some meta data already\n if (total) {\n state.size = total;\n }\n\n // update duration\n state.duration = Date.now() - state.timestamp;\n\n // if we can't compute progress, we're not going to fire progress events\n if (!computable) {\n state.progress = null;\n return;\n }\n\n // update progress percentage\n state.progress = current / total;\n\n // expose\n api.fire('progress', state.progress);\n },\n () => {\n api.fire('abort');\n },\n response => {\n const fileinfo = getFileInfoFromHeaders(\n typeof response === 'string' ? response : response.headers\n );\n api.fire('meta', {\n size: state.size || fileinfo.size,\n filename: fileinfo.name,\n source: fileinfo.source,\n });\n }\n );\n };\n\n const api = {\n ...on(),\n setSource: source => (state.source = source),\n getProgress, // file load progress\n abort, // abort file load\n load, // start load\n };\n\n return api;\n};\n\nconst isGet = method => /GET|HEAD/.test(method);\n\nconst sendRequest = (data, url, options) => {\n const api = {\n onheaders: () => {},\n onprogress: () => {},\n onload: () => {},\n ontimeout: () => {},\n onerror: () => {},\n onabort: () => {},\n abort: () => {\n aborted = true;\n xhr.abort();\n },\n };\n\n // timeout identifier, only used when timeout is defined\n let aborted = false;\n let headersReceived = false;\n\n // set default options\n options = {\n method: 'POST',\n headers: {},\n withCredentials: false,\n ...options,\n };\n\n // encode url\n url = encodeURI(url);\n\n // if method is GET, add any received data to url\n\n if (isGet(options.method) && data) {\n url = `${url}${encodeURIComponent(typeof data === 'string' ? data : JSON.stringify(data))}`;\n }\n\n // create request\n const xhr = new XMLHttpRequest();\n\n // progress of load\n const process = isGet(options.method) ? xhr : xhr.upload;\n process.onprogress = e => {\n // no progress event when aborted ( onprogress is called once after abort() )\n if (aborted) {\n return;\n }\n\n api.onprogress(e.lengthComputable, e.loaded, e.total);\n };\n\n // tries to get header info to the app as fast as possible\n xhr.onreadystatechange = () => {\n // not interesting in these states ('unsent' and 'openend' as they don't give us any additional info)\n if (xhr.readyState < 2) {\n return;\n }\n\n // no server response\n if (xhr.readyState === 4 && xhr.status === 0) {\n return;\n }\n\n if (headersReceived) {\n return;\n }\n\n headersReceived = true;\n\n // we've probably received some useful data in response headers\n api.onheaders(xhr);\n };\n\n // load successful\n xhr.onload = () => {\n // is classified as valid response\n if (xhr.status >= 200 && xhr.status < 300) {\n api.onload(xhr);\n } else {\n api.onerror(xhr);\n }\n };\n\n // error during load\n xhr.onerror = () => api.onerror(xhr);\n\n // request aborted\n xhr.onabort = () => {\n aborted = true;\n api.onabort();\n };\n\n // request timeout\n xhr.ontimeout = () => api.ontimeout(xhr);\n\n // open up open up!\n xhr.open(options.method, url, true);\n\n // set timeout if defined (do it after open so IE11 plays ball)\n if (isInt(options.timeout)) {\n xhr.timeout = options.timeout;\n }\n\n // add headers\n Object.keys(options.headers).forEach(key => {\n const value = unescape(encodeURIComponent(options.headers[key]));\n xhr.setRequestHeader(key, value);\n });\n\n // set type of response\n if (options.responseType) {\n xhr.responseType = options.responseType;\n }\n\n // set credentials\n if (options.withCredentials) {\n xhr.withCredentials = true;\n }\n\n // let's send our data\n xhr.send(data);\n\n return api;\n};\n\nconst createResponse = (type, code, body, headers) => ({\n type,\n code,\n body,\n headers,\n});\n\nconst createTimeoutResponse = cb => xhr => {\n cb(createResponse('error', 0, 'Timeout', xhr.getAllResponseHeaders()));\n};\n\nconst hasQS = str => /\\?/.test(str);\nconst buildURL = (...parts) => {\n let url = '';\n parts.forEach(part => {\n url += hasQS(url) && hasQS(part) ? part.replace(/\\?/, '&') : part;\n });\n return url;\n};\n\nconst createFetchFunction = (apiUrl = '', action) => {\n // custom handler (should also handle file, load, error, progress and abort)\n if (typeof action === 'function') {\n return action;\n }\n\n // no action supplied\n if (!action || !isString(action.url)) {\n return null;\n }\n\n // set onload hanlder\n const onload = action.onload || (res => res);\n const onerror = action.onerror || (res => null);\n\n // internal handler\n return (url, load, error, progress, abort, headers) => {\n // do local or remote request based on if the url is external\n const request = sendRequest(url, buildURL(apiUrl, action.url), {\n ...action,\n responseType: 'blob',\n });\n\n request.onload = xhr => {\n // get headers\n const headers = xhr.getAllResponseHeaders();\n\n // get filename\n const filename = getFileInfoFromHeaders(headers).name || getFilenameFromURL(url);\n\n // create response\n load(\n createResponse(\n 'load',\n xhr.status,\n action.method === 'HEAD'\n ? null\n : getFileFromBlob(onload(xhr.response), filename),\n headers\n )\n );\n };\n\n request.onerror = xhr => {\n error(\n createResponse(\n 'error',\n xhr.status,\n onerror(xhr.response) || xhr.statusText,\n xhr.getAllResponseHeaders()\n )\n );\n };\n\n request.onheaders = xhr => {\n headers(createResponse('headers', xhr.status, null, xhr.getAllResponseHeaders()));\n };\n\n request.ontimeout = createTimeoutResponse(error);\n request.onprogress = progress;\n request.onabort = abort;\n\n // should return request\n return request;\n };\n};\n\nconst ChunkStatus = {\n QUEUED: 0,\n COMPLETE: 1,\n PROCESSING: 2,\n ERROR: 3,\n WAITING: 4,\n};\n\n/*\nfunction signature:\n (file, metadata, load, error, progress, abort, transfer, options) => {\n return {\n abort:() => {}\n }\n}\n*/\n\n// apiUrl, action, name, file, metadata, load, error, progress, abort, transfer, options\nconst processFileChunked = (\n apiUrl,\n action,\n name,\n file,\n metadata,\n load,\n error,\n progress,\n abort,\n transfer,\n options\n) => {\n // all chunks\n const chunks = [];\n const { chunkTransferId, chunkServer, chunkSize, chunkRetryDelays } = options;\n\n // default state\n const state = {\n serverId: chunkTransferId,\n aborted: false,\n };\n\n // set onload handlers\n const ondata = action.ondata || (fd => fd);\n const onload =\n action.onload ||\n ((xhr, method) =>\n method === 'HEAD' ? xhr.getResponseHeader('Upload-Offset') : xhr.response);\n const onerror = action.onerror || (res => null);\n\n // create server hook\n const requestTransferId = cb => {\n const formData = new FormData();\n\n // add metadata under same name\n if (isObject(metadata)) formData.append(name, JSON.stringify(metadata));\n\n const headers =\n typeof action.headers === 'function'\n ? action.headers(file, metadata)\n : {\n ...action.headers,\n 'Upload-Length': file.size,\n };\n\n const requestParams = {\n ...action,\n headers,\n };\n\n // send request object\n const request = sendRequest(ondata(formData), buildURL(apiUrl, action.url), requestParams);\n\n request.onload = xhr => cb(onload(xhr, requestParams.method));\n\n request.onerror = xhr =>\n error(\n createResponse(\n 'error',\n xhr.status,\n onerror(xhr.response) || xhr.statusText,\n xhr.getAllResponseHeaders()\n )\n );\n\n request.ontimeout = createTimeoutResponse(error);\n };\n\n const requestTransferOffset = cb => {\n const requestUrl = buildURL(apiUrl, chunkServer.url, state.serverId);\n\n const headers =\n typeof action.headers === 'function'\n ? action.headers(state.serverId)\n : {\n ...action.headers,\n };\n\n const requestParams = {\n headers,\n method: 'HEAD',\n };\n\n const request = sendRequest(null, requestUrl, requestParams);\n\n request.onload = xhr => cb(onload(xhr, requestParams.method));\n\n request.onerror = xhr =>\n error(\n createResponse(\n 'error',\n xhr.status,\n onerror(xhr.response) || xhr.statusText,\n xhr.getAllResponseHeaders()\n )\n );\n\n request.ontimeout = createTimeoutResponse(error);\n };\n\n // create chunks\n const lastChunkIndex = Math.floor(file.size / chunkSize);\n for (let i = 0; i <= lastChunkIndex; i++) {\n const offset = i * chunkSize;\n const data = file.slice(offset, offset + chunkSize, 'application/offset+octet-stream');\n chunks[i] = {\n index: i,\n size: data.size,\n offset,\n data,\n file,\n progress: 0,\n retries: [...chunkRetryDelays],\n status: ChunkStatus.QUEUED,\n error: null,\n request: null,\n timeout: null,\n };\n }\n\n const completeProcessingChunks = () => load(state.serverId);\n\n const canProcessChunk = chunk =>\n chunk.status === ChunkStatus.QUEUED || chunk.status === ChunkStatus.ERROR;\n\n const processChunk = chunk => {\n // processing is paused, wait here\n if (state.aborted) return;\n\n // get next chunk to process\n chunk = chunk || chunks.find(canProcessChunk);\n\n // no more chunks to process\n if (!chunk) {\n // all done?\n if (chunks.every(chunk => chunk.status === ChunkStatus.COMPLETE)) {\n completeProcessingChunks();\n }\n\n // no chunk to handle\n return;\n }\n\n // now processing this chunk\n chunk.status = ChunkStatus.PROCESSING;\n chunk.progress = null;\n\n // allow parsing of formdata\n const ondata = chunkServer.ondata || (fd => fd);\n const onerror = chunkServer.onerror || (res => null);\n const onload = chunkServer.onload || (() => {});\n\n // send request object\n const requestUrl = buildURL(apiUrl, chunkServer.url, state.serverId);\n\n const headers =\n typeof chunkServer.headers === 'function'\n ? chunkServer.headers(chunk)\n : {\n ...chunkServer.headers,\n 'Content-Type': 'application/offset+octet-stream',\n 'Upload-Offset': chunk.offset,\n 'Upload-Length': file.size,\n 'Upload-Name': file.name,\n };\n\n const request = (chunk.request = sendRequest(ondata(chunk.data), requestUrl, {\n ...chunkServer,\n headers,\n }));\n\n request.onload = xhr => {\n // allow hooking into request result\n onload(xhr, chunk.index, chunks.length);\n\n // done!\n chunk.status = ChunkStatus.COMPLETE;\n\n // remove request reference\n chunk.request = null;\n\n // start processing more chunks\n processChunks();\n };\n\n request.onprogress = (lengthComputable, loaded, total) => {\n chunk.progress = lengthComputable ? loaded : null;\n updateTotalProgress();\n };\n\n request.onerror = xhr => {\n chunk.status = ChunkStatus.ERROR;\n chunk.request = null;\n chunk.error = onerror(xhr.response) || xhr.statusText;\n if (!retryProcessChunk(chunk)) {\n error(\n createResponse(\n 'error',\n xhr.status,\n onerror(xhr.response) || xhr.statusText,\n xhr.getAllResponseHeaders()\n )\n );\n }\n };\n\n request.ontimeout = xhr => {\n chunk.status = ChunkStatus.ERROR;\n chunk.request = null;\n if (!retryProcessChunk(chunk)) {\n createTimeoutResponse(error)(xhr);\n }\n };\n\n request.onabort = () => {\n chunk.status = ChunkStatus.QUEUED;\n chunk.request = null;\n abort();\n };\n };\n\n const retryProcessChunk = chunk => {\n // no more retries left\n if (chunk.retries.length === 0) return false;\n\n // new retry\n chunk.status = ChunkStatus.WAITING;\n clearTimeout(chunk.timeout);\n chunk.timeout = setTimeout(() => {\n processChunk(chunk);\n }, chunk.retries.shift());\n\n // we're going to retry\n return true;\n };\n\n const updateTotalProgress = () => {\n // calculate total progress fraction\n const totalBytesTransfered = chunks.reduce((p, chunk) => {\n if (p === null || chunk.progress === null) return null;\n return p + chunk.progress;\n }, 0);\n\n // can't compute progress\n if (totalBytesTransfered === null) return progress(false, 0, 0);\n\n // calculate progress values\n const totalSize = chunks.reduce((total, chunk) => total + chunk.size, 0);\n\n // can update progress indicator\n progress(true, totalBytesTransfered, totalSize);\n };\n\n // process new chunks\n const processChunks = () => {\n const totalProcessing = chunks.filter(chunk => chunk.status === ChunkStatus.PROCESSING)\n .length;\n if (totalProcessing >= 1) return;\n processChunk();\n };\n\n const abortChunks = () => {\n chunks.forEach(chunk => {\n clearTimeout(chunk.timeout);\n if (chunk.request) {\n chunk.request.abort();\n }\n });\n };\n\n // let's go!\n if (!state.serverId) {\n requestTransferId(serverId => {\n // stop here if aborted, might have happened in between request and callback\n if (state.aborted) return;\n\n // pass back to item so we can use it if something goes wrong\n transfer(serverId);\n\n // store internally\n state.serverId = serverId;\n processChunks();\n });\n } else {\n requestTransferOffset(offset => {\n // stop here if aborted, might have happened in between request and callback\n if (state.aborted) return;\n\n // mark chunks with lower offset as complete\n chunks\n .filter(chunk => chunk.offset < offset)\n .forEach(chunk => {\n chunk.status = ChunkStatus.COMPLETE;\n chunk.progress = chunk.size;\n });\n\n // continue processing\n processChunks();\n });\n }\n\n return {\n abort: () => {\n state.aborted = true;\n abortChunks();\n },\n };\n};\n\n/*\nfunction signature:\n (file, metadata, load, error, progress, abort) => {\n return {\n abort:() => {}\n }\n}\n*/\nconst createFileProcessorFunction = (apiUrl, action, name, options) => (\n file,\n metadata,\n load,\n error,\n progress,\n abort,\n transfer\n) => {\n // no file received\n if (!file) return;\n\n // if was passed a file, and we can chunk it, exit here\n const canChunkUpload = options.chunkUploads;\n const shouldChunkUpload = canChunkUpload && file.size > options.chunkSize;\n const willChunkUpload = canChunkUpload && (shouldChunkUpload || options.chunkForce);\n if (file instanceof Blob && willChunkUpload)\n return processFileChunked(\n apiUrl,\n action,\n name,\n file,\n metadata,\n load,\n error,\n progress,\n abort,\n transfer,\n options\n );\n\n // set handlers\n const ondata = action.ondata || (fd => fd);\n const onload = action.onload || (res => res);\n const onerror = action.onerror || (res => null);\n\n const headers =\n typeof action.headers === 'function'\n ? action.headers(file, metadata) || {}\n : {\n ...action.headers,\n };\n\n const requestParams = {\n ...action,\n headers,\n };\n\n // create formdata object\n var formData = new FormData();\n\n // add metadata under same name\n if (isObject(metadata)) {\n formData.append(name, JSON.stringify(metadata));\n }\n\n // Turn into an array of objects so no matter what the input, we can handle it the same way\n (file instanceof Blob ? [{ name: null, file }] : file).forEach(item => {\n formData.append(\n name,\n item.file,\n item.name === null ? item.file.name : `${item.name}${item.file.name}`\n );\n });\n\n // send request object\n const request = sendRequest(ondata(formData), buildURL(apiUrl, action.url), requestParams);\n request.onload = xhr => {\n load(createResponse('load', xhr.status, onload(xhr.response), xhr.getAllResponseHeaders()));\n };\n\n request.onerror = xhr => {\n error(\n createResponse(\n 'error',\n xhr.status,\n onerror(xhr.response) || xhr.statusText,\n xhr.getAllResponseHeaders()\n )\n );\n };\n\n request.ontimeout = createTimeoutResponse(error);\n request.onprogress = progress;\n request.onabort = abort;\n\n // should return request\n return request;\n};\n\nconst createProcessorFunction = (apiUrl = '', action, name, options) => {\n // custom handler (should also handle file, load, error, progress and abort)\n if (typeof action === 'function') return (...params) => action(name, ...params, options);\n\n // no action supplied\n if (!action || !isString(action.url)) return null;\n\n // internal handler\n return createFileProcessorFunction(apiUrl, action, name, options);\n};\n\n/*\n function signature:\n (uniqueFileId, load, error) => { }\n */\nconst createRevertFunction = (apiUrl = '', action) => {\n // is custom implementation\n if (typeof action === 'function') {\n return action;\n }\n\n // no action supplied, return stub function, interface will work, but file won't be removed\n if (!action || !isString(action.url)) {\n return (uniqueFileId, load) => load();\n }\n\n // set onload hanlder\n const onload = action.onload || (res => res);\n const onerror = action.onerror || (res => null);\n\n // internal implementation\n return (uniqueFileId, load, error) => {\n const request = sendRequest(\n uniqueFileId,\n apiUrl + action.url,\n action // contains method, headers and withCredentials properties\n );\n request.onload = xhr => {\n load(\n createResponse(\n 'load',\n xhr.status,\n onload(xhr.response),\n xhr.getAllResponseHeaders()\n )\n );\n };\n\n request.onerror = xhr => {\n error(\n createResponse(\n 'error',\n xhr.status,\n onerror(xhr.response) || xhr.statusText,\n xhr.getAllResponseHeaders()\n )\n );\n };\n\n request.ontimeout = createTimeoutResponse(error);\n\n return request;\n };\n};\n\nconst getRandomNumber = (min = 0, max = 1) => min + Math.random() * (max - min);\n\nconst createPerceivedPerformanceUpdater = (\n cb,\n duration = 1000,\n offset = 0,\n tickMin = 25,\n tickMax = 250\n) => {\n let timeout = null;\n const start = Date.now();\n\n const tick = () => {\n let runtime = Date.now() - start;\n let delay = getRandomNumber(tickMin, tickMax);\n\n if (runtime + delay > duration) {\n delay = runtime + delay - duration;\n }\n\n let progress = runtime / duration;\n if (progress >= 1 || document.hidden) {\n cb(1);\n return;\n }\n\n cb(progress);\n\n timeout = setTimeout(tick, delay);\n };\n\n if (duration > 0) tick();\n\n return {\n clear: () => {\n clearTimeout(timeout);\n },\n };\n};\n\nconst createFileProcessor = (processFn, options) => {\n const state = {\n complete: false,\n perceivedProgress: 0,\n perceivedPerformanceUpdater: null,\n progress: null,\n timestamp: null,\n perceivedDuration: 0,\n duration: 0,\n request: null,\n response: null,\n };\n\n const { allowMinimumUploadDuration } = options;\n\n const process = (file, metadata) => {\n const progressFn = () => {\n // we've not yet started the real download, stop here\n // the request might not go through, for instance, there might be some server trouble\n // if state.progress is null, the server does not allow computing progress and we show the spinner instead\n if (state.duration === 0 || state.progress === null) return;\n\n // as we're now processing, fire the progress event\n api.fire('progress', api.getProgress());\n };\n\n const completeFn = () => {\n state.complete = true;\n api.fire('load-perceived', state.response.body);\n };\n\n // let's start processing\n api.fire('start');\n\n // set request start\n state.timestamp = Date.now();\n\n // create perceived performance progress indicator\n state.perceivedPerformanceUpdater = createPerceivedPerformanceUpdater(\n progress => {\n state.perceivedProgress = progress;\n state.perceivedDuration = Date.now() - state.timestamp;\n\n progressFn();\n\n // if fake progress is done, and a response has been received,\n // and we've not yet called the complete method\n if (state.response && state.perceivedProgress === 1 && !state.complete) {\n // we done!\n completeFn();\n }\n },\n // random delay as in a list of files you start noticing\n // files uploading at the exact same speed\n allowMinimumUploadDuration ? getRandomNumber(750, 1500) : 0\n );\n\n // remember request so we can abort it later\n state.request = processFn(\n // the file to process\n file,\n\n // the metadata to send along\n metadata,\n\n // callbacks (load, error, progress, abort, transfer)\n // load expects the body to be a server id if\n // you want to make use of revert\n response => {\n // we put the response in state so we can access\n // it outside of this method\n state.response = isObject(response)\n ? response\n : {\n type: 'load',\n code: 200,\n body: `${response}`,\n headers: {},\n };\n\n // update duration\n state.duration = Date.now() - state.timestamp;\n\n // force progress to 1 as we're now done\n state.progress = 1;\n\n // actual load is done let's share results\n api.fire('load', state.response.body);\n\n // we are really done\n // if perceived progress is 1 ( wait for perceived progress to complete )\n // or if server does not support progress ( null )\n if (\n !allowMinimumUploadDuration ||\n (allowMinimumUploadDuration && state.perceivedProgress === 1)\n ) {\n completeFn();\n }\n },\n\n // error is expected to be an object with type, code, body\n error => {\n // cancel updater\n state.perceivedPerformanceUpdater.clear();\n\n // update others about this error\n api.fire(\n 'error',\n isObject(error)\n ? error\n : {\n type: 'error',\n code: 0,\n body: `${error}`,\n }\n );\n },\n\n // actual processing progress\n (computable, current, total) => {\n // update actual duration\n state.duration = Date.now() - state.timestamp;\n\n // update actual progress\n state.progress = computable ? current / total : null;\n\n progressFn();\n },\n\n // abort does not expect a value\n () => {\n // stop updater\n state.perceivedPerformanceUpdater.clear();\n\n // fire the abort event so we can switch visuals\n api.fire('abort', state.response ? state.response.body : null);\n },\n\n // register the id for this transfer\n transferId => {\n api.fire('transfer', transferId);\n }\n );\n };\n\n const abort = () => {\n // no request running, can't abort\n if (!state.request) return;\n\n // stop updater\n state.perceivedPerformanceUpdater.clear();\n\n // abort actual request\n if (state.request.abort) state.request.abort();\n\n // if has response object, we've completed the request\n state.complete = true;\n };\n\n const reset = () => {\n abort();\n state.complete = false;\n state.perceivedProgress = 0;\n state.progress = 0;\n state.timestamp = null;\n state.perceivedDuration = 0;\n state.duration = 0;\n state.request = null;\n state.response = null;\n };\n\n const getProgress = allowMinimumUploadDuration\n ? () => (state.progress ? Math.min(state.progress, state.perceivedProgress) : null)\n : () => state.progress || null;\n\n const getDuration = allowMinimumUploadDuration\n ? () => Math.min(state.duration, state.perceivedDuration)\n : () => state.duration;\n\n const api = {\n ...on(),\n process, // start processing file\n abort, // abort active process request\n getProgress,\n getDuration,\n reset,\n };\n\n return api;\n};\n\nconst getFilenameWithoutExtension = name => name.substring(0, name.lastIndexOf('.')) || name;\n\nconst createFileStub = source => {\n let data = [source.name, source.size, source.type];\n\n // is blob or base64, then we need to set the name\n if (source instanceof Blob || isBase64DataURI(source)) {\n data[0] = source.name || getDateString();\n } else if (isBase64DataURI(source)) {\n // if is base64 data uri we need to determine the average size and type\n data[1] = source.length;\n data[2] = getMimeTypeFromBase64DataURI(source);\n } else if (isString(source)) {\n // url\n data[0] = getFilenameFromURL(source);\n data[1] = 0;\n data[2] = 'application/octet-stream';\n }\n\n return {\n name: data[0],\n size: data[1],\n type: data[2],\n };\n};\n\nconst isFile = value => !!(value instanceof File || (value instanceof Blob && value.name));\n\nconst deepCloneObject = src => {\n if (!isObject(src)) return src;\n const target = isArray(src) ? [] : {};\n for (const key in src) {\n if (!src.hasOwnProperty(key)) continue;\n const v = src[key];\n target[key] = v && isObject(v) ? deepCloneObject(v) : v;\n }\n return target;\n};\n\nconst createItem = (origin = null, serverFileReference = null, file = null) => {\n // unique id for this item, is used to identify the item across views\n const id = getUniqueId();\n\n /**\n * Internal item state\n */\n const state = {\n // is archived\n archived: false,\n\n // if is frozen, no longer fires events\n frozen: false,\n\n // removed from view\n released: false,\n\n // original source\n source: null,\n\n // file model reference\n file,\n\n // id of file on server\n serverFileReference,\n\n // id of file transfer on server\n transferId: null,\n\n // is aborted\n processingAborted: false,\n\n // current item status\n status: serverFileReference ? ItemStatus.PROCESSING_COMPLETE : ItemStatus.INIT,\n\n // active processes\n activeLoader: null,\n activeProcessor: null,\n };\n\n // callback used when abort processing is called to link back to the resolve method\n let abortProcessingRequestComplete = null;\n\n /**\n * Externally added item metadata\n */\n const metadata = {};\n\n // item data\n const setStatus = status => (state.status = status);\n\n // fire event unless the item has been archived\n const fire = (event, ...params) => {\n if (state.released || state.frozen) return;\n api.fire(event, ...params);\n };\n\n // file data\n const getFileExtension = () => getExtensionFromFilename(state.file.name);\n const getFileType = () => state.file.type;\n const getFileSize = () => state.file.size;\n const getFile = () => state.file;\n\n //\n // logic to load a file\n //\n const load = (source, loader, onload) => {\n // remember the original item source\n state.source = source;\n\n // source is known\n api.fireSync('init');\n\n // file stub is already there\n if (state.file) {\n api.fireSync('load-skip');\n return;\n }\n\n // set a stub file object while loading the actual data\n state.file = createFileStub(source);\n\n // starts loading\n loader.on('init', () => {\n fire('load-init');\n });\n\n // we'eve received a size indication, let's update the stub\n loader.on('meta', meta => {\n // set size of file stub\n state.file.size = meta.size;\n\n // set name of file stub\n state.file.filename = meta.filename;\n\n // if has received source, we done\n if (meta.source) {\n origin = FileOrigin.LIMBO;\n state.serverFileReference = meta.source;\n state.status = ItemStatus.PROCESSING_COMPLETE;\n }\n\n // size has been updated\n fire('load-meta');\n });\n\n // the file is now loading we need to update the progress indicators\n loader.on('progress', progress => {\n setStatus(ItemStatus.LOADING);\n\n fire('load-progress', progress);\n });\n\n // an error was thrown while loading the file, we need to switch to error state\n loader.on('error', error => {\n setStatus(ItemStatus.LOAD_ERROR);\n\n fire('load-request-error', error);\n });\n\n // user or another process aborted the file load (cannot retry)\n loader.on('abort', () => {\n setStatus(ItemStatus.INIT);\n fire('load-abort');\n });\n\n // done loading\n loader.on('load', file => {\n // as we've now loaded the file the loader is no longer required\n state.activeLoader = null;\n\n // called when file has loaded succesfully\n const success = result => {\n // set (possibly) transformed file\n state.file = isFile(result) ? result : state.file;\n\n // file received\n if (origin === FileOrigin.LIMBO && state.serverFileReference) {\n setStatus(ItemStatus.PROCESSING_COMPLETE);\n } else {\n setStatus(ItemStatus.IDLE);\n }\n\n fire('load');\n };\n\n const error = result => {\n // set original file\n state.file = file;\n fire('load-meta');\n\n setStatus(ItemStatus.LOAD_ERROR);\n fire('load-file-error', result);\n };\n\n // if we already have a server file reference, we don't need to call the onload method\n if (state.serverFileReference) {\n success(file);\n return;\n }\n\n // no server id, let's give this file the full treatment\n onload(file, success, error);\n });\n\n // set loader source data\n loader.setSource(source);\n\n // set as active loader\n state.activeLoader = loader;\n\n // load the source data\n loader.load();\n };\n\n const retryLoad = () => {\n if (!state.activeLoader) {\n return;\n }\n state.activeLoader.load();\n };\n\n const abortLoad = () => {\n if (state.activeLoader) {\n state.activeLoader.abort();\n return;\n }\n setStatus(ItemStatus.INIT);\n fire('load-abort');\n };\n\n //\n // logic to process a file\n //\n const process = (processor, onprocess) => {\n // processing was aborted\n if (state.processingAborted) {\n state.processingAborted = false;\n return;\n }\n\n // now processing\n setStatus(ItemStatus.PROCESSING);\n\n // reset abort callback\n abortProcessingRequestComplete = null;\n\n // if no file loaded we'll wait for the load event\n if (!(state.file instanceof Blob)) {\n api.on('load', () => {\n process(processor, onprocess);\n });\n return;\n }\n\n // setup processor\n processor.on('load', serverFileReference => {\n // need this id to be able to revert the upload\n state.transferId = null;\n state.serverFileReference = serverFileReference;\n });\n\n // register transfer id\n processor.on('transfer', transferId => {\n // need this id to be able to revert the upload\n state.transferId = transferId;\n });\n\n processor.on('load-perceived', serverFileReference => {\n // no longer required\n state.activeProcessor = null;\n\n // need this id to be able to rever the upload\n state.transferId = null;\n state.serverFileReference = serverFileReference;\n\n setStatus(ItemStatus.PROCESSING_COMPLETE);\n fire('process-complete', serverFileReference);\n });\n\n processor.on('start', () => {\n fire('process-start');\n });\n\n processor.on('error', error => {\n state.activeProcessor = null;\n setStatus(ItemStatus.PROCESSING_ERROR);\n fire('process-error', error);\n });\n\n processor.on('abort', serverFileReference => {\n state.activeProcessor = null;\n\n // if file was uploaded but processing was cancelled during perceived processor time store file reference\n state.serverFileReference = serverFileReference;\n\n setStatus(ItemStatus.IDLE);\n fire('process-abort');\n\n // has timeout so doesn't interfere with remove action\n if (abortProcessingRequestComplete) {\n abortProcessingRequestComplete();\n }\n });\n\n processor.on('progress', progress => {\n fire('process-progress', progress);\n });\n\n // when successfully transformed\n const success = file => {\n // if was archived in the mean time, don't process\n if (state.archived) return;\n\n // process file!\n processor.process(file, { ...metadata });\n };\n\n // something went wrong during transform phase\n const error = console.error;\n\n // start processing the file\n onprocess(state.file, success, error);\n\n // set as active processor\n state.activeProcessor = processor;\n };\n\n const requestProcessing = () => {\n state.processingAborted = false;\n setStatus(ItemStatus.PROCESSING_QUEUED);\n };\n\n const abortProcessing = () =>\n new Promise(resolve => {\n if (!state.activeProcessor) {\n state.processingAborted = true;\n\n setStatus(ItemStatus.IDLE);\n fire('process-abort');\n\n resolve();\n return;\n }\n\n abortProcessingRequestComplete = () => {\n resolve();\n };\n\n state.activeProcessor.abort();\n });\n\n //\n // logic to revert a processed file\n //\n const revert = (revertFileUpload, forceRevert) =>\n new Promise((resolve, reject) => {\n // a completed upload will have a serverFileReference, a failed chunked upload where\n // getting a serverId succeeded but >=0 chunks have been uploaded will have transferId set\n const serverTransferId =\n state.serverFileReference !== null ? state.serverFileReference : state.transferId;\n\n // cannot revert without a server id for this process\n if (serverTransferId === null) {\n resolve();\n return;\n }\n\n // revert the upload (fire and forget)\n revertFileUpload(\n serverTransferId,\n () => {\n // reset file server id and transfer id as now it's not available on the server\n state.serverFileReference = null;\n state.transferId = null;\n resolve();\n },\n error => {\n // don't set error state when reverting is optional, it will always resolve\n if (!forceRevert) {\n resolve();\n return;\n }\n\n // oh no errors\n setStatus(ItemStatus.PROCESSING_REVERT_ERROR);\n fire('process-revert-error');\n reject(error);\n }\n );\n\n // fire event\n setStatus(ItemStatus.IDLE);\n fire('process-revert');\n });\n\n // exposed methods\n const setMetadata = (key, value, silent) => {\n const keys = key.split('.');\n const root = keys[0];\n const last = keys.pop();\n let data = metadata;\n keys.forEach(key => (data = data[key]));\n\n // compare old value against new value, if they're the same, we're not updating\n if (JSON.stringify(data[last]) === JSON.stringify(value)) return;\n\n // update value\n data[last] = value;\n\n // fire update\n fire('metadata-update', {\n key: root,\n value: metadata[root],\n silent,\n });\n };\n\n const getMetadata = key => deepCloneObject(key ? metadata[key] : metadata);\n\n const api = {\n id: { get: () => id },\n origin: { get: () => origin, set: value => (origin = value) },\n serverId: { get: () => state.serverFileReference },\n transferId: { get: () => state.transferId },\n status: { get: () => state.status },\n filename: { get: () => state.file.name },\n filenameWithoutExtension: { get: () => getFilenameWithoutExtension(state.file.name) },\n fileExtension: { get: getFileExtension },\n fileType: { get: getFileType },\n fileSize: { get: getFileSize },\n file: { get: getFile },\n relativePath: { get: () => state.file._relativePath },\n\n source: { get: () => state.source },\n\n getMetadata,\n setMetadata: (key, value, silent) => {\n if (isObject(key)) {\n const data = key;\n Object.keys(data).forEach(key => {\n setMetadata(key, data[key], value);\n });\n return key;\n }\n setMetadata(key, value, silent);\n return value;\n },\n\n extend: (name, handler) => (itemAPI[name] = handler),\n\n abortLoad,\n retryLoad,\n requestProcessing,\n abortProcessing,\n\n load,\n process,\n revert,\n\n ...on(),\n\n freeze: () => (state.frozen = true),\n\n release: () => (state.released = true),\n released: { get: () => state.released },\n\n archive: () => (state.archived = true),\n archived: { get: () => state.archived },\n\n // replace source and file object\n setFile: file => (state.file = file),\n };\n\n // create it here instead of returning it instantly so we can extend it later\n const itemAPI = createObject(api);\n\n return itemAPI;\n};\n\nconst getItemIndexByQuery = (items, query) => {\n // just return first index\n if (isEmpty(query)) {\n return 0;\n }\n\n // invalid queries\n if (!isString(query)) {\n return -1;\n }\n\n // return item by id (or -1 if not found)\n return items.findIndex(item => item.id === query);\n};\n\nconst getItemById = (items, itemId) => {\n const index = getItemIndexByQuery(items, itemId);\n if (index < 0) {\n return;\n }\n return items[index] || null;\n};\n\nconst fetchBlob = (url, load, error, progress, abort, headers) => {\n const request = sendRequest(null, url, {\n method: 'GET',\n responseType: 'blob',\n });\n\n request.onload = xhr => {\n // get headers\n const headers = xhr.getAllResponseHeaders();\n\n // get filename\n const filename = getFileInfoFromHeaders(headers).name || getFilenameFromURL(url);\n\n // create response\n load(createResponse('load', xhr.status, getFileFromBlob(xhr.response, filename), headers));\n };\n\n request.onerror = xhr => {\n error(createResponse('error', xhr.status, xhr.statusText, xhr.getAllResponseHeaders()));\n };\n\n request.onheaders = xhr => {\n headers(createResponse('headers', xhr.status, null, xhr.getAllResponseHeaders()));\n };\n\n request.ontimeout = createTimeoutResponse(error);\n request.onprogress = progress;\n request.onabort = abort;\n\n // should return request\n return request;\n};\n\nconst getDomainFromURL = url => {\n if (url.indexOf('//') === 0) {\n url = location.protocol + url;\n }\n return url\n .toLowerCase()\n .replace('blob:', '')\n .replace(/([a-z])?:\\/\\//, '$1')\n .split('/')[0];\n};\n\nconst isExternalURL = url =>\n (url.indexOf(':') > -1 || url.indexOf('//') > -1) &&\n getDomainFromURL(location.href) !== getDomainFromURL(url);\n\nconst dynamicLabel = label => (...params) => (isFunction(label) ? label(...params) : label);\n\nconst isMockItem = item => !isFile(item.file);\n\nconst listUpdated = (dispatch, state) => {\n clearTimeout(state.listUpdateTimeout);\n state.listUpdateTimeout = setTimeout(() => {\n dispatch('DID_UPDATE_ITEMS', { items: getActiveItems(state.items) });\n }, 0);\n};\n\nconst optionalPromise = (fn, ...params) =>\n new Promise(resolve => {\n if (!fn) {\n return resolve(true);\n }\n\n const result = fn(...params);\n\n if (result == null) {\n return resolve(true);\n }\n\n if (typeof result === 'boolean') {\n return resolve(result);\n }\n\n if (typeof result.then === 'function') {\n result.then(resolve);\n }\n });\n\nconst sortItems = (state, compare) => {\n state.items.sort((a, b) => compare(createItemAPI(a), createItemAPI(b)));\n};\n\n// returns item based on state\nconst getItemByQueryFromState = (state, itemHandler) => ({\n query,\n success = () => {},\n failure = () => {},\n ...options\n} = {}) => {\n const item = getItemByQuery(state.items, query);\n if (!item) {\n failure({\n error: createResponse('error', 0, 'Item not found'),\n file: null,\n });\n return;\n }\n itemHandler(item, success, failure, options || {});\n};\n\nconst actions = (dispatch, query, state) => ({\n /**\n * Aborts all ongoing processes\n */\n ABORT_ALL: () => {\n getActiveItems(state.items).forEach(item => {\n item.freeze();\n item.abortLoad();\n item.abortProcessing();\n });\n },\n\n /**\n * Sets initial files\n */\n DID_SET_FILES: ({ value = [] }) => {\n // map values to file objects\n const files = value.map(file => ({\n source: file.source ? file.source : file,\n options: file.options,\n }));\n\n // loop over files, if file is in list, leave it be, if not, remove\n // test if items should be moved\n let activeItems = getActiveItems(state.items);\n\n activeItems.forEach(item => {\n // if item not is in new value, remove\n if (!files.find(file => file.source === item.source || file.source === item.file)) {\n dispatch('REMOVE_ITEM', { query: item, remove: false });\n }\n });\n\n // add new files\n activeItems = getActiveItems(state.items);\n files.forEach((file, index) => {\n // if file is already in list\n if (activeItems.find(item => item.source === file.source || item.file === file.source))\n return;\n\n // not in list, add\n dispatch('ADD_ITEM', {\n ...file,\n interactionMethod: InteractionMethod.NONE,\n index,\n });\n });\n },\n\n DID_UPDATE_ITEM_METADATA: ({ id, action, change }) => {\n // don't do anything\n if (change.silent) return;\n\n // if is called multiple times in close succession we combined all calls together to save resources\n clearTimeout(state.itemUpdateTimeout);\n state.itemUpdateTimeout = setTimeout(() => {\n const item = getItemById(state.items, id);\n\n // only revert and attempt to upload when we're uploading to a server\n if (!query('IS_ASYNC')) {\n // should we update the output data\n applyFilterChain('SHOULD_PREPARE_OUTPUT', false, {\n item,\n query,\n action,\n change,\n }).then(shouldPrepareOutput => {\n // plugins determined the output data should be prepared (or not), can be adjusted with beforePrepareOutput hook\n const beforePrepareFile = query('GET_BEFORE_PREPARE_FILE');\n if (beforePrepareFile)\n shouldPrepareOutput = beforePrepareFile(item, shouldPrepareOutput);\n\n if (!shouldPrepareOutput) return;\n\n dispatch(\n 'REQUEST_PREPARE_OUTPUT',\n {\n query: id,\n item,\n success: file => {\n dispatch('DID_PREPARE_OUTPUT', { id, file });\n },\n },\n true\n );\n });\n\n return;\n }\n\n // if is local item we need to enable upload button so change can be propagated to server\n if (item.origin === FileOrigin.LOCAL) {\n dispatch('DID_LOAD_ITEM', {\n id: item.id,\n error: null,\n serverFileReference: item.source,\n });\n }\n\n // for async scenarios\n const upload = () => {\n // we push this forward a bit so the interface is updated correctly\n setTimeout(() => {\n dispatch('REQUEST_ITEM_PROCESSING', { query: id });\n }, 32);\n };\n\n const revert = doUpload => {\n item.revert(\n createRevertFunction(state.options.server.url, state.options.server.revert),\n query('GET_FORCE_REVERT')\n )\n .then(doUpload ? upload : () => {})\n .catch(() => {});\n };\n\n const abort = doUpload => {\n item.abortProcessing().then(doUpload ? upload : () => {});\n };\n\n // if we should re-upload the file immediately\n if (item.status === ItemStatus.PROCESSING_COMPLETE) {\n return revert(state.options.instantUpload);\n }\n\n // if currently uploading, cancel upload\n if (item.status === ItemStatus.PROCESSING) {\n return abort(state.options.instantUpload);\n }\n\n if (state.options.instantUpload) {\n upload();\n }\n }, 0);\n },\n\n MOVE_ITEM: ({ query, index }) => {\n const item = getItemByQuery(state.items, query);\n if (!item) return;\n const currentIndex = state.items.indexOf(item);\n index = limit(index, 0, state.items.length - 1);\n if (currentIndex === index) return;\n state.items.splice(index, 0, state.items.splice(currentIndex, 1)[0]);\n },\n\n SORT: ({ compare }) => {\n sortItems(state, compare);\n dispatch('DID_SORT_ITEMS', {\n items: query('GET_ACTIVE_ITEMS'),\n });\n },\n\n ADD_ITEMS: ({ items, index, interactionMethod, success = () => {}, failure = () => {} }) => {\n let currentIndex = index;\n\n if (index === -1 || typeof index === 'undefined') {\n const insertLocation = query('GET_ITEM_INSERT_LOCATION');\n const totalItems = query('GET_TOTAL_ITEMS');\n currentIndex = insertLocation === 'before' ? 0 : totalItems;\n }\n\n const ignoredFiles = query('GET_IGNORED_FILES');\n const isValidFile = source =>\n isFile(source) ? !ignoredFiles.includes(source.name.toLowerCase()) : !isEmpty(source);\n const validItems = items.filter(isValidFile);\n\n const promises = validItems.map(\n source =>\n new Promise((resolve, reject) => {\n dispatch('ADD_ITEM', {\n interactionMethod,\n source: source.source || source,\n success: resolve,\n failure: reject,\n index: currentIndex++,\n options: source.options || {},\n });\n })\n );\n\n Promise.all(promises)\n .then(success)\n .catch(failure);\n },\n\n /**\n * @param source\n * @param index\n * @param interactionMethod\n */\n ADD_ITEM: ({\n source,\n index = -1,\n interactionMethod,\n success = () => {},\n failure = () => {},\n options = {},\n }) => {\n // if no source supplied\n if (isEmpty(source)) {\n failure({\n error: createResponse('error', 0, 'No source'),\n file: null,\n });\n return;\n }\n\n // filter out invalid file items, used to filter dropped directory contents\n if (isFile(source) && state.options.ignoredFiles.includes(source.name.toLowerCase())) {\n // fail silently\n return;\n }\n\n // test if there's still room in the list of files\n if (!hasRoomForItem(state)) {\n // if multiple allowed, we can't replace\n // or if only a single item is allowed but we're not allowed to replace it we exit\n if (\n state.options.allowMultiple ||\n (!state.options.allowMultiple && !state.options.allowReplace)\n ) {\n const error = createResponse('warning', 0, 'Max files');\n\n dispatch('DID_THROW_MAX_FILES', {\n source,\n error,\n });\n\n failure({ error, file: null });\n\n return;\n }\n\n // let's replace the item\n // id of first item we're about to remove\n const item = getActiveItems(state.items)[0];\n\n // if has been processed remove it from the server as well\n if (\n item.status === ItemStatus.PROCESSING_COMPLETE ||\n item.status === ItemStatus.PROCESSING_REVERT_ERROR\n ) {\n const forceRevert = query('GET_FORCE_REVERT');\n item.revert(\n createRevertFunction(state.options.server.url, state.options.server.revert),\n forceRevert\n )\n .then(() => {\n if (!forceRevert) return;\n\n // try to add now\n dispatch('ADD_ITEM', {\n source,\n index,\n interactionMethod,\n success,\n failure,\n options,\n });\n })\n .catch(() => {}); // no need to handle this catch state for now\n\n if (forceRevert) return;\n }\n\n // remove first item as it will be replaced by this item\n dispatch('REMOVE_ITEM', { query: item.id });\n }\n\n // where did the file originate\n const origin =\n options.type === 'local'\n ? FileOrigin.LOCAL\n : options.type === 'limbo'\n ? FileOrigin.LIMBO\n : FileOrigin.INPUT;\n\n // create a new blank item\n const item = createItem(\n // where did this file come from\n origin,\n\n // an input file never has a server file reference\n origin === FileOrigin.INPUT ? null : source,\n\n // file mock data, if defined\n options.file\n );\n\n // set initial meta data\n Object.keys(options.metadata || {}).forEach(key => {\n item.setMetadata(key, options.metadata[key]);\n });\n\n // created the item, let plugins add methods\n applyFilters('DID_CREATE_ITEM', item, { query, dispatch });\n\n // where to insert new items\n const itemInsertLocation = query('GET_ITEM_INSERT_LOCATION');\n\n // adjust index if is not allowed to pick location\n if (!state.options.itemInsertLocationFreedom) {\n index = itemInsertLocation === 'before' ? -1 : state.items.length;\n }\n\n // add item to list\n insertItem(state.items, item, index);\n\n // sort items in list\n if (isFunction(itemInsertLocation) && source) {\n sortItems(state, itemInsertLocation);\n }\n\n // get a quick reference to the item id\n const id = item.id;\n\n // observe item events\n item.on('init', () => {\n dispatch('DID_INIT_ITEM', { id });\n });\n\n item.on('load-init', () => {\n dispatch('DID_START_ITEM_LOAD', { id });\n });\n\n item.on('load-meta', () => {\n dispatch('DID_UPDATE_ITEM_META', { id });\n });\n\n item.on('load-progress', progress => {\n dispatch('DID_UPDATE_ITEM_LOAD_PROGRESS', { id, progress });\n });\n\n item.on('load-request-error', error => {\n const mainStatus = dynamicLabel(state.options.labelFileLoadError)(error);\n\n // is client error, no way to recover\n if (error.code >= 400 && error.code < 500) {\n dispatch('DID_THROW_ITEM_INVALID', {\n id,\n error,\n status: {\n main: mainStatus,\n sub: `${error.code} (${error.body})`,\n },\n });\n\n // reject the file so can be dealt with through API\n failure({ error, file: createItemAPI(item) });\n return;\n }\n\n // is possible server error, so might be possible to retry\n dispatch('DID_THROW_ITEM_LOAD_ERROR', {\n id,\n error,\n status: {\n main: mainStatus,\n sub: state.options.labelTapToRetry,\n },\n });\n });\n\n item.on('load-file-error', error => {\n dispatch('DID_THROW_ITEM_INVALID', {\n id,\n error: error.status,\n status: error.status,\n });\n failure({ error: error.status, file: createItemAPI(item) });\n });\n\n item.on('load-abort', () => {\n dispatch('REMOVE_ITEM', { query: id });\n });\n\n item.on('load-skip', () => {\n item.on('metadata-update', change => {\n if (!isFile(item.file)) return;\n dispatch('DID_UPDATE_ITEM_METADATA', { id, change });\n });\n\n dispatch('COMPLETE_LOAD_ITEM', {\n query: id,\n item,\n data: {\n source,\n success,\n },\n });\n });\n\n item.on('load', () => {\n const handleAdd = shouldAdd => {\n // no should not add this file\n if (!shouldAdd) {\n dispatch('REMOVE_ITEM', {\n query: id,\n });\n return;\n }\n\n // now interested in metadata updates\n item.on('metadata-update', change => {\n dispatch('DID_UPDATE_ITEM_METADATA', { id, change });\n });\n\n // let plugins decide if the output data should be prepared at this point\n // means we'll do this and wait for idle state\n applyFilterChain('SHOULD_PREPARE_OUTPUT', false, { item, query }).then(\n shouldPrepareOutput => {\n // plugins determined the output data should be prepared (or not), can be adjusted with beforePrepareOutput hook\n const beforePrepareFile = query('GET_BEFORE_PREPARE_FILE');\n if (beforePrepareFile)\n shouldPrepareOutput = beforePrepareFile(item, shouldPrepareOutput);\n\n const loadComplete = () => {\n dispatch('COMPLETE_LOAD_ITEM', {\n query: id,\n item,\n data: {\n source,\n success,\n },\n });\n\n listUpdated(dispatch, state);\n };\n\n // exit\n if (shouldPrepareOutput) {\n // wait for idle state and then run PREPARE_OUTPUT\n dispatch(\n 'REQUEST_PREPARE_OUTPUT',\n {\n query: id,\n item,\n success: file => {\n dispatch('DID_PREPARE_OUTPUT', { id, file });\n loadComplete();\n },\n },\n true\n );\n\n return;\n }\n\n loadComplete();\n }\n );\n };\n\n // item loaded, allow plugins to\n // - read data (quickly)\n // - add metadata\n applyFilterChain('DID_LOAD_ITEM', item, { query, dispatch })\n .then(() => {\n optionalPromise(query('GET_BEFORE_ADD_FILE'), createItemAPI(item)).then(\n handleAdd\n );\n })\n .catch(e => {\n if (!e || !e.error || !e.status) return handleAdd(false);\n dispatch('DID_THROW_ITEM_INVALID', {\n id,\n error: e.error,\n status: e.status,\n });\n });\n });\n\n item.on('process-start', () => {\n dispatch('DID_START_ITEM_PROCESSING', { id });\n });\n\n item.on('process-progress', progress => {\n dispatch('DID_UPDATE_ITEM_PROCESS_PROGRESS', { id, progress });\n });\n\n item.on('process-error', error => {\n dispatch('DID_THROW_ITEM_PROCESSING_ERROR', {\n id,\n error,\n status: {\n main: dynamicLabel(state.options.labelFileProcessingError)(error),\n sub: state.options.labelTapToRetry,\n },\n });\n });\n\n item.on('process-revert-error', error => {\n dispatch('DID_THROW_ITEM_PROCESSING_REVERT_ERROR', {\n id,\n error,\n status: {\n main: dynamicLabel(state.options.labelFileProcessingRevertError)(error),\n sub: state.options.labelTapToRetry,\n },\n });\n });\n\n item.on('process-complete', serverFileReference => {\n dispatch('DID_COMPLETE_ITEM_PROCESSING', {\n id,\n error: null,\n serverFileReference,\n });\n dispatch('DID_DEFINE_VALUE', { id, value: serverFileReference });\n });\n\n item.on('process-abort', () => {\n dispatch('DID_ABORT_ITEM_PROCESSING', { id });\n });\n\n item.on('process-revert', () => {\n dispatch('DID_REVERT_ITEM_PROCESSING', { id });\n dispatch('DID_DEFINE_VALUE', { id, value: null });\n });\n\n // let view know the item has been inserted\n dispatch('DID_ADD_ITEM', { id, index, interactionMethod });\n\n listUpdated(dispatch, state);\n\n // start loading the source\n const { url, load, restore, fetch } = state.options.server || {};\n\n item.load(\n source,\n\n // this creates a function that loads the file based on the type of file (string, base64, blob, file) and location of file (local, remote, limbo)\n createFileLoader(\n origin === FileOrigin.INPUT\n ? // input, if is remote, see if should use custom fetch, else use default fetchBlob\n isString(source) && isExternalURL(source)\n ? fetch\n ? createFetchFunction(url, fetch)\n : fetchBlob // remote url\n : fetchBlob // try to fetch url\n : // limbo or local\n origin === FileOrigin.LIMBO\n ? createFetchFunction(url, restore) // limbo\n : createFetchFunction(url, load) // local\n ),\n\n // called when the file is loaded so it can be piped through the filters\n (file, success, error) => {\n // let's process the file\n applyFilterChain('LOAD_FILE', file, { query })\n .then(success)\n .catch(error);\n }\n );\n },\n\n REQUEST_PREPARE_OUTPUT: ({ item, success, failure = () => {} }) => {\n // error response if item archived\n const err = {\n error: createResponse('error', 0, 'Item not found'),\n file: null,\n };\n\n // don't handle archived items, an item could have been archived (load aborted) while waiting to be prepared\n if (item.archived) return failure(err);\n\n // allow plugins to alter the file data\n applyFilterChain('PREPARE_OUTPUT', item.file, { query, item }).then(result => {\n applyFilterChain('COMPLETE_PREPARE_OUTPUT', result, { query, item }).then(result => {\n // don't handle archived items, an item could have been archived (load aborted) while being prepared\n if (item.archived) return failure(err);\n\n // we done!\n success(result);\n });\n });\n },\n\n COMPLETE_LOAD_ITEM: ({ item, data }) => {\n const { success, source } = data;\n\n // sort items in list\n const itemInsertLocation = query('GET_ITEM_INSERT_LOCATION');\n if (isFunction(itemInsertLocation) && source) {\n sortItems(state, itemInsertLocation);\n }\n\n // let interface know the item has loaded\n dispatch('DID_LOAD_ITEM', {\n id: item.id,\n error: null,\n serverFileReference: item.origin === FileOrigin.INPUT ? null : source,\n });\n\n // item has been successfully loaded and added to the\n // list of items so can now be safely returned for use\n success(createItemAPI(item));\n\n // if this is a local server file we need to show a different state\n if (item.origin === FileOrigin.LOCAL) {\n dispatch('DID_LOAD_LOCAL_ITEM', { id: item.id });\n return;\n }\n\n // if is a temp server file we prevent async upload call here (as the file is already on the server)\n if (item.origin === FileOrigin.LIMBO) {\n dispatch('DID_COMPLETE_ITEM_PROCESSING', {\n id: item.id,\n error: null,\n serverFileReference: source,\n });\n\n dispatch('DID_DEFINE_VALUE', {\n id: item.id,\n value: item.serverId || source,\n });\n return;\n }\n\n // id we are allowed to upload the file immediately, lets do it\n if (query('IS_ASYNC') && state.options.instantUpload) {\n dispatch('REQUEST_ITEM_PROCESSING', { query: item.id });\n }\n },\n\n RETRY_ITEM_LOAD: getItemByQueryFromState(state, item => {\n // try loading the source one more time\n item.retryLoad();\n }),\n\n REQUEST_ITEM_PREPARE: getItemByQueryFromState(state, (item, success, failure) => {\n dispatch(\n 'REQUEST_PREPARE_OUTPUT',\n {\n query: item.id,\n item,\n success: file => {\n dispatch('DID_PREPARE_OUTPUT', { id: item.id, file });\n success({\n file: item,\n output: file,\n });\n },\n failure,\n },\n true\n );\n }),\n\n REQUEST_ITEM_PROCESSING: getItemByQueryFromState(state, (item, success, failure) => {\n // cannot be queued (or is already queued)\n const itemCanBeQueuedForProcessing =\n // waiting for something\n item.status === ItemStatus.IDLE ||\n // processing went wrong earlier\n item.status === ItemStatus.PROCESSING_ERROR;\n\n // not ready to be processed\n if (!itemCanBeQueuedForProcessing) {\n const processNow = () =>\n dispatch('REQUEST_ITEM_PROCESSING', { query: item, success, failure });\n\n const process = () => (document.hidden ? processNow() : setTimeout(processNow, 32));\n\n // if already done processing or tried to revert but didn't work, try again\n if (\n item.status === ItemStatus.PROCESSING_COMPLETE ||\n item.status === ItemStatus.PROCESSING_REVERT_ERROR\n ) {\n item.revert(\n createRevertFunction(state.options.server.url, state.options.server.revert),\n query('GET_FORCE_REVERT')\n )\n .then(process)\n .catch(() => {}); // don't continue with processing if something went wrong\n } else if (item.status === ItemStatus.PROCESSING) {\n item.abortProcessing().then(process);\n }\n\n return;\n }\n\n // already queued for processing\n if (item.status === ItemStatus.PROCESSING_QUEUED) return;\n\n item.requestProcessing();\n\n dispatch('DID_REQUEST_ITEM_PROCESSING', { id: item.id });\n\n dispatch('PROCESS_ITEM', { query: item, success, failure }, true);\n }),\n\n PROCESS_ITEM: getItemByQueryFromState(state, (item, success, failure) => {\n const maxParallelUploads = query('GET_MAX_PARALLEL_UPLOADS');\n const totalCurrentUploads = query('GET_ITEMS_BY_STATUS', ItemStatus.PROCESSING).length;\n\n // queue and wait till queue is freed up\n if (totalCurrentUploads === maxParallelUploads) {\n // queue for later processing\n state.processingQueue.push({\n id: item.id,\n success,\n failure,\n });\n\n // stop it!\n return;\n }\n\n // if was not queued or is already processing exit here\n if (item.status === ItemStatus.PROCESSING) return;\n\n const processNext = () => {\n // process queueud items\n const queueEntry = state.processingQueue.shift();\n\n // no items left\n if (!queueEntry) return;\n\n // get item reference\n const { id, success, failure } = queueEntry;\n const itemReference = getItemByQuery(state.items, id);\n\n // if item was archived while in queue, jump to next\n if (!itemReference || itemReference.archived) {\n processNext();\n return;\n }\n\n // process queued item\n dispatch('PROCESS_ITEM', { query: id, success, failure }, true);\n };\n\n // we done function\n item.onOnce('process-complete', () => {\n success(createItemAPI(item));\n processNext();\n\n // if origin is local, and we're instant uploading, trigger remove of original\n // as revert will remove file from list\n const server = state.options.server;\n const instantUpload = state.options.instantUpload;\n if (instantUpload && item.origin === FileOrigin.LOCAL && isFunction(server.remove)) {\n const noop = () => {};\n item.origin = FileOrigin.LIMBO;\n state.options.server.remove(item.source, noop, noop);\n }\n\n // All items processed? No errors?\n const allItemsProcessed =\n query('GET_ITEMS_BY_STATUS', ItemStatus.PROCESSING_COMPLETE).length ===\n state.items.length;\n if (allItemsProcessed) {\n dispatch('DID_COMPLETE_ITEM_PROCESSING_ALL');\n }\n });\n\n // we error function\n item.onOnce('process-error', error => {\n failure({ error, file: createItemAPI(item) });\n processNext();\n });\n\n // abort function\n item.onOnce('process-abort', () => {\n processNext();\n });\n\n // start file processing\n const options = state.options;\n item.process(\n createFileProcessor(\n createProcessorFunction(options.server.url, options.server.process, options.name, {\n chunkTransferId: item.transferId,\n chunkServer: options.server.patch,\n chunkUploads: options.chunkUploads,\n chunkForce: options.chunkForce,\n chunkSize: options.chunkSize,\n chunkRetryDelays: options.chunkRetryDelays,\n }),\n {\n allowMinimumUploadDuration: query('GET_ALLOW_MINIMUM_UPLOAD_DURATION'),\n }\n ),\n // called when the file is about to be processed so it can be piped through the transform filters\n (file, success, error) => {\n // allow plugins to alter the file data\n applyFilterChain('PREPARE_OUTPUT', file, { query, item })\n .then(file => {\n dispatch('DID_PREPARE_OUTPUT', { id: item.id, file });\n\n success(file);\n })\n .catch(error);\n }\n );\n }),\n\n RETRY_ITEM_PROCESSING: getItemByQueryFromState(state, item => {\n dispatch('REQUEST_ITEM_PROCESSING', { query: item });\n }),\n\n REQUEST_REMOVE_ITEM: getItemByQueryFromState(state, item => {\n optionalPromise(query('GET_BEFORE_REMOVE_FILE'), createItemAPI(item)).then(shouldRemove => {\n if (!shouldRemove) {\n return;\n }\n dispatch('REMOVE_ITEM', { query: item });\n });\n }),\n\n RELEASE_ITEM: getItemByQueryFromState(state, item => {\n item.release();\n }),\n\n REMOVE_ITEM: getItemByQueryFromState(state, (item, success, failure, options) => {\n const removeFromView = () => {\n // get id reference\n const id = item.id;\n\n // archive the item, this does not remove it from the list\n getItemById(state.items, id).archive();\n\n // tell the view the item has been removed\n dispatch('DID_REMOVE_ITEM', { error: null, id, item });\n\n // now the list has been modified\n listUpdated(dispatch, state);\n\n // correctly removed\n success(createItemAPI(item));\n };\n\n // if this is a local file and the `server.remove` function has been configured,\n // send source there so dev can remove file from server\n const server = state.options.server;\n if (\n item.origin === FileOrigin.LOCAL &&\n server &&\n isFunction(server.remove) &&\n options.remove !== false\n ) {\n dispatch('DID_START_ITEM_REMOVE', { id: item.id });\n\n server.remove(\n item.source,\n () => removeFromView(),\n status => {\n dispatch('DID_THROW_ITEM_REMOVE_ERROR', {\n id: item.id,\n error: createResponse('error', 0, status, null),\n status: {\n main: dynamicLabel(state.options.labelFileRemoveError)(status),\n sub: state.options.labelTapToRetry,\n },\n });\n }\n );\n } else {\n // if is requesting revert and can revert need to call revert handler (not calling request_ because that would also trigger beforeRemoveHook)\n if (\n (options.revert && item.origin !== FileOrigin.LOCAL && item.serverId !== null) ||\n // if chunked uploads are enabled and we're uploading in chunks for this specific file\n // or if the file isn't big enough for chunked uploads but chunkForce is set then call\n // revert before removing from the view...\n (state.options.chunkUploads && item.file.size > state.options.chunkSize) ||\n (state.options.chunkUploads && state.options.chunkForce)\n ) {\n item.revert(\n createRevertFunction(state.options.server.url, state.options.server.revert),\n query('GET_FORCE_REVERT')\n );\n }\n\n // can now safely remove from view\n removeFromView();\n }\n }),\n\n ABORT_ITEM_LOAD: getItemByQueryFromState(state, item => {\n item.abortLoad();\n }),\n\n ABORT_ITEM_PROCESSING: getItemByQueryFromState(state, item => {\n // test if is already processed\n if (item.serverId) {\n dispatch('REVERT_ITEM_PROCESSING', { id: item.id });\n return;\n }\n\n // abort\n item.abortProcessing().then(() => {\n const shouldRemove = state.options.instantUpload;\n if (shouldRemove) {\n dispatch('REMOVE_ITEM', { query: item.id });\n }\n });\n }),\n\n REQUEST_REVERT_ITEM_PROCESSING: getItemByQueryFromState(state, item => {\n // not instant uploading, revert immediately\n if (!state.options.instantUpload) {\n dispatch('REVERT_ITEM_PROCESSING', { query: item });\n return;\n }\n\n // if we're instant uploading the file will also be removed if we revert,\n // so if a before remove file hook is defined we need to run it now\n const handleRevert = shouldRevert => {\n if (!shouldRevert) return;\n dispatch('REVERT_ITEM_PROCESSING', { query: item });\n };\n\n const fn = query('GET_BEFORE_REMOVE_FILE');\n if (!fn) {\n return handleRevert(true);\n }\n\n const requestRemoveResult = fn(createItemAPI(item));\n if (requestRemoveResult == null) {\n // undefined or null\n return handleRevert(true);\n }\n\n if (typeof requestRemoveResult === 'boolean') {\n return handleRevert(requestRemoveResult);\n }\n\n if (typeof requestRemoveResult.then === 'function') {\n requestRemoveResult.then(handleRevert);\n }\n }),\n\n REVERT_ITEM_PROCESSING: getItemByQueryFromState(state, item => {\n item.revert(\n createRevertFunction(state.options.server.url, state.options.server.revert),\n query('GET_FORCE_REVERT')\n )\n .then(() => {\n const shouldRemove = state.options.instantUpload || isMockItem(item);\n if (shouldRemove) {\n dispatch('REMOVE_ITEM', { query: item.id });\n }\n })\n .catch(() => {});\n }),\n\n SET_OPTIONS: ({ options }) => {\n // get all keys passed\n const optionKeys = Object.keys(options);\n\n // get prioritized keyed to include (remove once not in options object)\n const prioritizedOptionKeys = PrioritizedOptions.filter(key => optionKeys.includes(key));\n\n // order the keys, prioritized first, then rest\n const orderedOptionKeys = [\n // add prioritized first if passed to options, else remove\n ...prioritizedOptionKeys,\n\n // prevent duplicate keys\n ...Object.keys(options).filter(key => !prioritizedOptionKeys.includes(key)),\n ];\n\n // dispatch set event for each option\n orderedOptionKeys.forEach(key => {\n dispatch(`SET_${fromCamels(key, '_').toUpperCase()}`, {\n value: options[key],\n });\n });\n },\n});\n\nconst PrioritizedOptions = [\n 'server', // must be processed before \"files\"\n];\n\nconst formatFilename = name => name;\n\nconst createElement$1 = tagName => {\n return document.createElement(tagName);\n};\n\nconst text = (node, value) => {\n let textNode = node.childNodes[0];\n if (!textNode) {\n textNode = document.createTextNode(value);\n node.appendChild(textNode);\n } else if (value !== textNode.nodeValue) {\n textNode.nodeValue = value;\n }\n};\n\nconst polarToCartesian = (centerX, centerY, radius, angleInDegrees) => {\n const angleInRadians = (((angleInDegrees % 360) - 90) * Math.PI) / 180.0;\n return {\n x: centerX + radius * Math.cos(angleInRadians),\n y: centerY + radius * Math.sin(angleInRadians),\n };\n};\n\nconst describeArc = (x, y, radius, startAngle, endAngle, arcSweep) => {\n const start = polarToCartesian(x, y, radius, endAngle);\n const end = polarToCartesian(x, y, radius, startAngle);\n return ['M', start.x, start.y, 'A', radius, radius, 0, arcSweep, 0, end.x, end.y].join(' ');\n};\n\nconst percentageArc = (x, y, radius, from, to) => {\n let arcSweep = 1;\n if (to > from && to - from <= 0.5) {\n arcSweep = 0;\n }\n if (from > to && from - to >= 0.5) {\n arcSweep = 0;\n }\n return describeArc(\n x,\n y,\n radius,\n Math.min(0.9999, from) * 360,\n Math.min(0.9999, to) * 360,\n arcSweep\n );\n};\n\nconst create = ({ root, props }) => {\n // start at 0\n props.spin = false;\n props.progress = 0;\n props.opacity = 0;\n\n // svg\n const svg = createElement('svg');\n root.ref.path = createElement('path', {\n 'stroke-width': 2,\n 'stroke-linecap': 'round',\n });\n svg.appendChild(root.ref.path);\n\n root.ref.svg = svg;\n\n root.appendChild(svg);\n};\n\nconst write = ({ root, props }) => {\n if (props.opacity === 0) {\n return;\n }\n\n if (props.align) {\n root.element.dataset.align = props.align;\n }\n\n // get width of stroke\n const ringStrokeWidth = parseInt(attr(root.ref.path, 'stroke-width'), 10);\n\n // calculate size of ring\n const size = root.rect.element.width * 0.5;\n\n // ring state\n let ringFrom = 0;\n let ringTo = 0;\n\n // now in busy mode\n if (props.spin) {\n ringFrom = 0;\n ringTo = 0.5;\n } else {\n ringFrom = 0;\n ringTo = props.progress;\n }\n\n // get arc path\n const coordinates = percentageArc(size, size, size - ringStrokeWidth, ringFrom, ringTo);\n\n // update progress bar\n attr(root.ref.path, 'd', coordinates);\n\n // hide while contains 0 value\n attr(root.ref.path, 'stroke-opacity', props.spin || props.progress > 0 ? 1 : 0);\n};\n\nconst progressIndicator = createView({\n tag: 'div',\n name: 'progress-indicator',\n ignoreRectUpdate: true,\n ignoreRect: true,\n create,\n write,\n mixins: {\n apis: ['progress', 'spin', 'align'],\n styles: ['opacity'],\n animations: {\n opacity: { type: 'tween', duration: 500 },\n progress: {\n type: 'spring',\n stiffness: 0.95,\n damping: 0.65,\n mass: 10,\n },\n },\n },\n});\n\nconst create$1 = ({ root, props }) => {\n root.element.innerHTML = (props.icon || '') + `<span>${props.label}</span>`;\n\n props.isDisabled = false;\n};\n\nconst write$1 = ({ root, props }) => {\n const { isDisabled } = props;\n const shouldDisable = root.query('GET_DISABLED') || props.opacity === 0;\n\n if (shouldDisable && !isDisabled) {\n props.isDisabled = true;\n attr(root.element, 'disabled', 'disabled');\n } else if (!shouldDisable && isDisabled) {\n props.isDisabled = false;\n root.element.removeAttribute('disabled');\n }\n};\n\nconst fileActionButton = createView({\n tag: 'button',\n attributes: {\n type: 'button',\n },\n ignoreRect: true,\n ignoreRectUpdate: true,\n name: 'file-action-button',\n mixins: {\n apis: ['label'],\n styles: ['translateX', 'translateY', 'scaleX', 'scaleY', 'opacity'],\n animations: {\n scaleX: 'spring',\n scaleY: 'spring',\n translateX: 'spring',\n translateY: 'spring',\n opacity: { type: 'tween', duration: 250 },\n },\n listeners: true,\n },\n create: create$1,\n write: write$1,\n});\n\nconst toNaturalFileSize = (bytes, decimalSeparator = '.', base = 1000, options = {}) => {\n const {\n labelBytes = 'bytes',\n labelKilobytes = 'KB',\n labelMegabytes = 'MB',\n labelGigabytes = 'GB',\n } = options;\n\n // no negative byte sizes\n bytes = Math.round(Math.abs(bytes));\n\n const KB = base;\n const MB = base * base;\n const GB = base * base * base;\n\n // just bytes\n if (bytes < KB) {\n return `${bytes} ${labelBytes}`;\n }\n\n // kilobytes\n if (bytes < MB) {\n return `${Math.floor(bytes / KB)} ${labelKilobytes}`;\n }\n\n // megabytes\n if (bytes < GB) {\n return `${removeDecimalsWhenZero(bytes / MB, 1, decimalSeparator)} ${labelMegabytes}`;\n }\n\n // gigabytes\n return `${removeDecimalsWhenZero(bytes / GB, 2, decimalSeparator)} ${labelGigabytes}`;\n};\n\nconst removeDecimalsWhenZero = (value, decimalCount, separator) => {\n return value\n .toFixed(decimalCount)\n .split('.')\n .filter(part => part !== '0')\n .join(separator);\n};\n\nconst create$2 = ({ root, props }) => {\n // filename\n const fileName = createElement$1('span');\n fileName.className = 'filepond--file-info-main';\n // hide for screenreaders\n // the file is contained in a fieldset with legend that contains the filename\n // no need to read it twice\n attr(fileName, 'aria-hidden', 'true');\n root.appendChild(fileName);\n root.ref.fileName = fileName;\n\n // filesize\n const fileSize = createElement$1('span');\n fileSize.className = 'filepond--file-info-sub';\n root.appendChild(fileSize);\n root.ref.fileSize = fileSize;\n\n // set initial values\n text(fileSize, root.query('GET_LABEL_FILE_WAITING_FOR_SIZE'));\n text(fileName, formatFilename(root.query('GET_ITEM_NAME', props.id)));\n};\n\nconst updateFile = ({ root, props }) => {\n text(\n root.ref.fileSize,\n toNaturalFileSize(\n root.query('GET_ITEM_SIZE', props.id),\n '.',\n root.query('GET_FILE_SIZE_BASE'),\n root.query('GET_FILE_SIZE_LABELS', root.query)\n )\n );\n text(root.ref.fileName, formatFilename(root.query('GET_ITEM_NAME', props.id)));\n};\n\nconst updateFileSizeOnError = ({ root, props }) => {\n // if size is available don't fallback to unknown size message\n if (isInt(root.query('GET_ITEM_SIZE', props.id))) {\n updateFile({ root, props });\n return;\n }\n\n text(root.ref.fileSize, root.query('GET_LABEL_FILE_SIZE_NOT_AVAILABLE'));\n};\n\nconst fileInfo = createView({\n name: 'file-info',\n ignoreRect: true,\n ignoreRectUpdate: true,\n write: createRoute({\n DID_LOAD_ITEM: updateFile,\n DID_UPDATE_ITEM_META: updateFile,\n DID_THROW_ITEM_LOAD_ERROR: updateFileSizeOnError,\n DID_THROW_ITEM_INVALID: updateFileSizeOnError,\n }),\n didCreateView: root => {\n applyFilters('CREATE_VIEW', { ...root, view: root });\n },\n create: create$2,\n mixins: {\n styles: ['translateX', 'translateY'],\n animations: {\n translateX: 'spring',\n translateY: 'spring',\n },\n },\n});\n\nconst toPercentage = value => Math.round(value * 100);\n\nconst create$3 = ({ root }) => {\n // main status\n const main = createElement$1('span');\n main.className = 'filepond--file-status-main';\n root.appendChild(main);\n root.ref.main = main;\n\n // sub status\n const sub = createElement$1('span');\n sub.className = 'filepond--file-status-sub';\n root.appendChild(sub);\n root.ref.sub = sub;\n\n didSetItemLoadProgress({ root, action: { progress: null } });\n};\n\nconst didSetItemLoadProgress = ({ root, action }) => {\n const title =\n action.progress === null\n ? root.query('GET_LABEL_FILE_LOADING')\n : `${root.query('GET_LABEL_FILE_LOADING')} ${toPercentage(action.progress)}%`;\n text(root.ref.main, title);\n text(root.ref.sub, root.query('GET_LABEL_TAP_TO_CANCEL'));\n};\n\nconst didSetItemProcessProgress = ({ root, action }) => {\n const title =\n action.progress === null\n ? root.query('GET_LABEL_FILE_PROCESSING')\n : `${root.query('GET_LABEL_FILE_PROCESSING')} ${toPercentage(action.progress)}%`;\n text(root.ref.main, title);\n text(root.ref.sub, root.query('GET_LABEL_TAP_TO_CANCEL'));\n};\n\nconst didRequestItemProcessing = ({ root }) => {\n text(root.ref.main, root.query('GET_LABEL_FILE_PROCESSING'));\n text(root.ref.sub, root.query('GET_LABEL_TAP_TO_CANCEL'));\n};\n\nconst didAbortItemProcessing = ({ root }) => {\n text(root.ref.main, root.query('GET_LABEL_FILE_PROCESSING_ABORTED'));\n text(root.ref.sub, root.query('GET_LABEL_TAP_TO_RETRY'));\n};\n\nconst didCompleteItemProcessing = ({ root }) => {\n text(root.ref.main, root.query('GET_LABEL_FILE_PROCESSING_COMPLETE'));\n text(root.ref.sub, root.query('GET_LABEL_TAP_TO_UNDO'));\n};\n\nconst clear = ({ root }) => {\n text(root.ref.main, '');\n text(root.ref.sub, '');\n};\n\nconst error = ({ root, action }) => {\n text(root.ref.main, action.status.main);\n text(root.ref.sub, action.status.sub);\n};\n\nconst fileStatus = createView({\n name: 'file-status',\n ignoreRect: true,\n ignoreRectUpdate: true,\n write: createRoute({\n DID_LOAD_ITEM: clear,\n DID_REVERT_ITEM_PROCESSING: clear,\n DID_REQUEST_ITEM_PROCESSING: didRequestItemProcessing,\n DID_ABORT_ITEM_PROCESSING: didAbortItemProcessing,\n DID_COMPLETE_ITEM_PROCESSING: didCompleteItemProcessing,\n DID_UPDATE_ITEM_PROCESS_PROGRESS: didSetItemProcessProgress,\n DID_UPDATE_ITEM_LOAD_PROGRESS: didSetItemLoadProgress,\n DID_THROW_ITEM_LOAD_ERROR: error,\n DID_THROW_ITEM_INVALID: error,\n DID_THROW_ITEM_PROCESSING_ERROR: error,\n DID_THROW_ITEM_PROCESSING_REVERT_ERROR: error,\n DID_THROW_ITEM_REMOVE_ERROR: error,\n }),\n didCreateView: root => {\n applyFilters('CREATE_VIEW', { ...root, view: root });\n },\n create: create$3,\n mixins: {\n styles: ['translateX', 'translateY', 'opacity'],\n animations: {\n opacity: { type: 'tween', duration: 250 },\n translateX: 'spring',\n translateY: 'spring',\n },\n },\n});\n\n/**\n * Button definitions for the file view\n */\n\nconst Buttons = {\n AbortItemLoad: {\n label: 'GET_LABEL_BUTTON_ABORT_ITEM_LOAD',\n action: 'ABORT_ITEM_LOAD',\n className: 'filepond--action-abort-item-load',\n align: 'LOAD_INDICATOR_POSITION', // right\n },\n RetryItemLoad: {\n label: 'GET_LABEL_BUTTON_RETRY_ITEM_LOAD',\n action: 'RETRY_ITEM_LOAD',\n icon: 'GET_ICON_RETRY',\n className: 'filepond--action-retry-item-load',\n align: 'BUTTON_PROCESS_ITEM_POSITION', // right\n },\n RemoveItem: {\n label: 'GET_LABEL_BUTTON_REMOVE_ITEM',\n action: 'REQUEST_REMOVE_ITEM',\n icon: 'GET_ICON_REMOVE',\n className: 'filepond--action-remove-item',\n align: 'BUTTON_REMOVE_ITEM_POSITION', // left\n },\n ProcessItem: {\n label: 'GET_LABEL_BUTTON_PROCESS_ITEM',\n action: 'REQUEST_ITEM_PROCESSING',\n icon: 'GET_ICON_PROCESS',\n className: 'filepond--action-process-item',\n align: 'BUTTON_PROCESS_ITEM_POSITION', // right\n },\n AbortItemProcessing: {\n label: 'GET_LABEL_BUTTON_ABORT_ITEM_PROCESSING',\n action: 'ABORT_ITEM_PROCESSING',\n className: 'filepond--action-abort-item-processing',\n align: 'BUTTON_PROCESS_ITEM_POSITION', // right\n },\n RetryItemProcessing: {\n label: 'GET_LABEL_BUTTON_RETRY_ITEM_PROCESSING',\n action: 'RETRY_ITEM_PROCESSING',\n icon: 'GET_ICON_RETRY',\n className: 'filepond--action-retry-item-processing',\n align: 'BUTTON_PROCESS_ITEM_POSITION', // right\n },\n RevertItemProcessing: {\n label: 'GET_LABEL_BUTTON_UNDO_ITEM_PROCESSING',\n action: 'REQUEST_REVERT_ITEM_PROCESSING',\n icon: 'GET_ICON_UNDO',\n className: 'filepond--action-revert-item-processing',\n align: 'BUTTON_PROCESS_ITEM_POSITION', // right\n },\n};\n\n// make a list of buttons, we can then remove buttons from this list if they're disabled\nconst ButtonKeys = [];\nforin(Buttons, key => {\n ButtonKeys.push(key);\n});\n\nconst calculateFileInfoOffset = root => {\n if (getRemoveIndicatorAligment(root) === 'right') return 0;\n const buttonRect = root.ref.buttonRemoveItem.rect.element;\n return buttonRect.hidden ? null : buttonRect.width + buttonRect.left;\n};\n\nconst calculateButtonWidth = root => {\n const buttonRect = root.ref.buttonAbortItemLoad.rect.element;\n return buttonRect.width;\n};\n\n// Force on full pixels so text stays crips\nconst calculateFileVerticalCenterOffset = root =>\n Math.floor(root.ref.buttonRemoveItem.rect.element.height / 4);\nconst calculateFileHorizontalCenterOffset = root =>\n Math.floor(root.ref.buttonRemoveItem.rect.element.left / 2);\n\nconst getLoadIndicatorAlignment = root => root.query('GET_STYLE_LOAD_INDICATOR_POSITION');\nconst getProcessIndicatorAlignment = root => root.query('GET_STYLE_PROGRESS_INDICATOR_POSITION');\nconst getRemoveIndicatorAligment = root => root.query('GET_STYLE_BUTTON_REMOVE_ITEM_POSITION');\n\nconst DefaultStyle = {\n buttonAbortItemLoad: { opacity: 0 },\n buttonRetryItemLoad: { opacity: 0 },\n buttonRemoveItem: { opacity: 0 },\n buttonProcessItem: { opacity: 0 },\n buttonAbortItemProcessing: { opacity: 0 },\n buttonRetryItemProcessing: { opacity: 0 },\n buttonRevertItemProcessing: { opacity: 0 },\n loadProgressIndicator: { opacity: 0, align: getLoadIndicatorAlignment },\n processProgressIndicator: { opacity: 0, align: getProcessIndicatorAlignment },\n processingCompleteIndicator: { opacity: 0, scaleX: 0.75, scaleY: 0.75 },\n info: { translateX: 0, translateY: 0, opacity: 0 },\n status: { translateX: 0, translateY: 0, opacity: 0 },\n};\n\nconst IdleStyle = {\n buttonRemoveItem: { opacity: 1 },\n buttonProcessItem: { opacity: 1 },\n info: { translateX: calculateFileInfoOffset },\n status: { translateX: calculateFileInfoOffset },\n};\n\nconst ProcessingStyle = {\n buttonAbortItemProcessing: { opacity: 1 },\n processProgressIndicator: { opacity: 1 },\n status: { opacity: 1 },\n};\n\nconst StyleMap = {\n DID_THROW_ITEM_INVALID: {\n buttonRemoveItem: { opacity: 1 },\n info: { translateX: calculateFileInfoOffset },\n status: { translateX: calculateFileInfoOffset, opacity: 1 },\n },\n DID_START_ITEM_LOAD: {\n buttonAbortItemLoad: { opacity: 1 },\n loadProgressIndicator: { opacity: 1 },\n status: { opacity: 1 },\n },\n DID_THROW_ITEM_LOAD_ERROR: {\n buttonRetryItemLoad: { opacity: 1 },\n buttonRemoveItem: { opacity: 1 },\n info: { translateX: calculateFileInfoOffset },\n status: { opacity: 1 },\n },\n DID_START_ITEM_REMOVE: {\n processProgressIndicator: { opacity: 1, align: getRemoveIndicatorAligment },\n info: { translateX: calculateFileInfoOffset },\n status: { opacity: 0 },\n },\n DID_THROW_ITEM_REMOVE_ERROR: {\n processProgressIndicator: { opacity: 0, align: getRemoveIndicatorAligment },\n buttonRemoveItem: { opacity: 1 },\n info: { translateX: calculateFileInfoOffset },\n status: { opacity: 1, translateX: calculateFileInfoOffset },\n },\n DID_LOAD_ITEM: IdleStyle,\n DID_LOAD_LOCAL_ITEM: {\n buttonRemoveItem: { opacity: 1 },\n info: { translateX: calculateFileInfoOffset },\n status: { translateX: calculateFileInfoOffset },\n },\n DID_START_ITEM_PROCESSING: ProcessingStyle,\n DID_REQUEST_ITEM_PROCESSING: ProcessingStyle,\n DID_UPDATE_ITEM_PROCESS_PROGRESS: ProcessingStyle,\n DID_COMPLETE_ITEM_PROCESSING: {\n buttonRevertItemProcessing: { opacity: 1 },\n info: { opacity: 1 },\n status: { opacity: 1 },\n },\n DID_THROW_ITEM_PROCESSING_ERROR: {\n buttonRemoveItem: { opacity: 1 },\n buttonRetryItemProcessing: { opacity: 1 },\n status: { opacity: 1 },\n info: { translateX: calculateFileInfoOffset },\n },\n DID_THROW_ITEM_PROCESSING_REVERT_ERROR: {\n buttonRevertItemProcessing: { opacity: 1 },\n status: { opacity: 1 },\n info: { opacity: 1 },\n },\n DID_ABORT_ITEM_PROCESSING: {\n buttonRemoveItem: { opacity: 1 },\n buttonProcessItem: { opacity: 1 },\n info: { translateX: calculateFileInfoOffset },\n status: { opacity: 1 },\n },\n DID_REVERT_ITEM_PROCESSING: IdleStyle,\n};\n\n// complete indicator view\nconst processingCompleteIndicatorView = createView({\n create: ({ root }) => {\n root.element.innerHTML = root.query('GET_ICON_DONE');\n },\n name: 'processing-complete-indicator',\n ignoreRect: true,\n mixins: {\n styles: ['scaleX', 'scaleY', 'opacity'],\n animations: {\n scaleX: 'spring',\n scaleY: 'spring',\n opacity: { type: 'tween', duration: 250 },\n },\n },\n});\n\n/**\n * Creates the file view\n */\nconst create$4 = ({ root, props }) => {\n // copy Buttons object\n const LocalButtons = Object.keys(Buttons).reduce((prev, curr) => {\n prev[curr] = { ...Buttons[curr] };\n return prev;\n }, {});\n\n const { id } = props;\n\n // allow reverting upload\n const allowRevert = root.query('GET_ALLOW_REVERT');\n\n // allow remove file\n const allowRemove = root.query('GET_ALLOW_REMOVE');\n\n // allow processing upload\n const allowProcess = root.query('GET_ALLOW_PROCESS');\n\n // is instant uploading, need this to determine the icon of the undo button\n const instantUpload = root.query('GET_INSTANT_UPLOAD');\n\n // is async set up\n const isAsync = root.query('IS_ASYNC');\n\n // should align remove item buttons\n const alignRemoveItemButton = root.query('GET_STYLE_BUTTON_REMOVE_ITEM_ALIGN');\n\n // enabled buttons array\n let buttonFilter;\n if (isAsync) {\n if (allowProcess && !allowRevert) {\n // only remove revert button\n buttonFilter = key => !/RevertItemProcessing/.test(key);\n } else if (!allowProcess && allowRevert) {\n // only remove process button\n buttonFilter = key => !/ProcessItem|RetryItemProcessing|AbortItemProcessing/.test(key);\n } else if (!allowProcess && !allowRevert) {\n // remove all process buttons\n buttonFilter = key => !/Process/.test(key);\n }\n } else {\n // no process controls available\n buttonFilter = key => !/Process/.test(key);\n }\n\n const enabledButtons = buttonFilter ? ButtonKeys.filter(buttonFilter) : ButtonKeys.concat();\n\n // update icon and label for revert button when instant uploading\n if (instantUpload && allowRevert) {\n LocalButtons['RevertItemProcessing'].label = 'GET_LABEL_BUTTON_REMOVE_ITEM';\n LocalButtons['RevertItemProcessing'].icon = 'GET_ICON_REMOVE';\n }\n\n // remove last button (revert) if not allowed\n if (isAsync && !allowRevert) {\n const map = StyleMap['DID_COMPLETE_ITEM_PROCESSING'];\n map.info.translateX = calculateFileHorizontalCenterOffset;\n map.info.translateY = calculateFileVerticalCenterOffset;\n map.status.translateY = calculateFileVerticalCenterOffset;\n map.processingCompleteIndicator = { opacity: 1, scaleX: 1, scaleY: 1 };\n }\n\n // should align center\n if (isAsync && !allowProcess) {\n [\n 'DID_START_ITEM_PROCESSING',\n 'DID_REQUEST_ITEM_PROCESSING',\n 'DID_UPDATE_ITEM_PROCESS_PROGRESS',\n 'DID_THROW_ITEM_PROCESSING_ERROR',\n ].forEach(key => {\n StyleMap[key].status.translateY = calculateFileVerticalCenterOffset;\n });\n StyleMap['DID_THROW_ITEM_PROCESSING_ERROR'].status.translateX = calculateButtonWidth;\n }\n\n // move remove button to right\n if (alignRemoveItemButton && allowRevert) {\n LocalButtons['RevertItemProcessing'].align = 'BUTTON_REMOVE_ITEM_POSITION';\n const map = StyleMap['DID_COMPLETE_ITEM_PROCESSING'];\n map.info.translateX = calculateFileInfoOffset;\n map.status.translateY = calculateFileVerticalCenterOffset;\n map.processingCompleteIndicator = { opacity: 1, scaleX: 1, scaleY: 1 };\n }\n\n // show/hide RemoveItem button\n if (!allowRemove) {\n LocalButtons['RemoveItem'].disabled = true;\n }\n\n // create the button views\n forin(LocalButtons, (key, definition) => {\n // create button\n const buttonView = root.createChildView(fileActionButton, {\n label: root.query(definition.label),\n icon: root.query(definition.icon),\n opacity: 0,\n });\n\n // should be appended?\n if (enabledButtons.includes(key)) {\n root.appendChildView(buttonView);\n }\n\n // toggle\n if (definition.disabled) {\n buttonView.element.setAttribute('disabled', 'disabled');\n buttonView.element.setAttribute('hidden', 'hidden');\n }\n\n // add position attribute\n buttonView.element.dataset.align = root.query(`GET_STYLE_${definition.align}`);\n\n // add class\n buttonView.element.classList.add(definition.className);\n\n // handle interactions\n buttonView.on('click', e => {\n e.stopPropagation();\n if (definition.disabled) return;\n root.dispatch(definition.action, { query: id });\n });\n\n // set reference\n root.ref[`button${key}`] = buttonView;\n });\n\n // checkmark\n root.ref.processingCompleteIndicator = root.appendChildView(\n root.createChildView(processingCompleteIndicatorView)\n );\n root.ref.processingCompleteIndicator.element.dataset.align = root.query(\n `GET_STYLE_BUTTON_PROCESS_ITEM_POSITION`\n );\n\n // create file info view\n root.ref.info = root.appendChildView(root.createChildView(fileInfo, { id }));\n\n // create file status view\n root.ref.status = root.appendChildView(root.createChildView(fileStatus, { id }));\n\n // add progress indicators\n const loadIndicatorView = root.appendChildView(\n root.createChildView(progressIndicator, {\n opacity: 0,\n align: root.query(`GET_STYLE_LOAD_INDICATOR_POSITION`),\n })\n );\n loadIndicatorView.element.classList.add('filepond--load-indicator');\n root.ref.loadProgressIndicator = loadIndicatorView;\n\n const progressIndicatorView = root.appendChildView(\n root.createChildView(progressIndicator, {\n opacity: 0,\n align: root.query(`GET_STYLE_PROGRESS_INDICATOR_POSITION`),\n })\n );\n progressIndicatorView.element.classList.add('filepond--process-indicator');\n root.ref.processProgressIndicator = progressIndicatorView;\n\n // current active styles\n root.ref.activeStyles = [];\n};\n\nconst write$2 = ({ root, actions, props }) => {\n // route actions\n route({ root, actions, props });\n\n // select last state change action\n let action = actions\n .concat()\n .filter(action => /^DID_/.test(action.type))\n .reverse()\n .find(action => StyleMap[action.type]);\n\n // a new action happened, let's get the matching styles\n if (action) {\n // define new active styles\n root.ref.activeStyles = [];\n\n const stylesToApply = StyleMap[action.type];\n forin(DefaultStyle, (name, defaultStyles) => {\n // get reference to control\n const control = root.ref[name];\n\n // loop over all styles for this control\n forin(defaultStyles, (key, defaultValue) => {\n const value =\n stylesToApply[name] && typeof stylesToApply[name][key] !== 'undefined'\n ? stylesToApply[name][key]\n : defaultValue;\n root.ref.activeStyles.push({ control, key, value });\n });\n });\n }\n\n // apply active styles to element\n root.ref.activeStyles.forEach(({ control, key, value }) => {\n control[key] = typeof value === 'function' ? value(root) : value;\n });\n};\n\nconst route = createRoute({\n DID_SET_LABEL_BUTTON_ABORT_ITEM_PROCESSING: ({ root, action }) => {\n root.ref.buttonAbortItemProcessing.label = action.value;\n },\n DID_SET_LABEL_BUTTON_ABORT_ITEM_LOAD: ({ root, action }) => {\n root.ref.buttonAbortItemLoad.label = action.value;\n },\n DID_SET_LABEL_BUTTON_ABORT_ITEM_REMOVAL: ({ root, action }) => {\n root.ref.buttonAbortItemRemoval.label = action.value;\n },\n DID_REQUEST_ITEM_PROCESSING: ({ root }) => {\n root.ref.processProgressIndicator.spin = true;\n root.ref.processProgressIndicator.progress = 0;\n },\n DID_START_ITEM_LOAD: ({ root }) => {\n root.ref.loadProgressIndicator.spin = true;\n root.ref.loadProgressIndicator.progress = 0;\n },\n DID_START_ITEM_REMOVE: ({ root }) => {\n root.ref.processProgressIndicator.spin = true;\n root.ref.processProgressIndicator.progress = 0;\n },\n DID_UPDATE_ITEM_LOAD_PROGRESS: ({ root, action }) => {\n root.ref.loadProgressIndicator.spin = false;\n root.ref.loadProgressIndicator.progress = action.progress;\n },\n DID_UPDATE_ITEM_PROCESS_PROGRESS: ({ root, action }) => {\n root.ref.processProgressIndicator.spin = false;\n root.ref.processProgressIndicator.progress = action.progress;\n },\n});\n\nconst file = createView({\n create: create$4,\n write: write$2,\n didCreateView: root => {\n applyFilters('CREATE_VIEW', { ...root, view: root });\n },\n name: 'file',\n});\n\n/**\n * Creates the file view\n */\nconst create$5 = ({ root, props }) => {\n // filename\n root.ref.fileName = createElement$1('legend');\n root.appendChild(root.ref.fileName);\n\n // file appended\n root.ref.file = root.appendChildView(root.createChildView(file, { id: props.id }));\n\n // data has moved to data.js\n root.ref.data = false;\n};\n\n/**\n * Data storage\n */\nconst didLoadItem = ({ root, props }) => {\n // updates the legend of the fieldset so screenreaders can better group buttons\n text(root.ref.fileName, formatFilename(root.query('GET_ITEM_NAME', props.id)));\n};\n\nconst fileWrapper = createView({\n create: create$5,\n ignoreRect: true,\n write: createRoute({\n DID_LOAD_ITEM: didLoadItem,\n }),\n didCreateView: root => {\n applyFilters('CREATE_VIEW', { ...root, view: root });\n },\n tag: 'fieldset',\n name: 'file-wrapper',\n});\n\nconst PANEL_SPRING_PROPS = { type: 'spring', damping: 0.6, mass: 7 };\n\nconst create$6 = ({ root, props }) => {\n [\n {\n name: 'top',\n },\n {\n name: 'center',\n props: {\n translateY: null,\n scaleY: null,\n },\n mixins: {\n animations: {\n scaleY: PANEL_SPRING_PROPS,\n },\n styles: ['translateY', 'scaleY'],\n },\n },\n {\n name: 'bottom',\n props: {\n translateY: null,\n },\n mixins: {\n animations: {\n translateY: PANEL_SPRING_PROPS,\n },\n styles: ['translateY'],\n },\n },\n ].forEach(section => {\n createSection(root, section, props.name);\n });\n\n root.element.classList.add(`filepond--${props.name}`);\n\n root.ref.scalable = null;\n};\n\nconst createSection = (root, section, className) => {\n const viewConstructor = createView({\n name: `panel-${section.name} filepond--${className}`,\n mixins: section.mixins,\n ignoreRectUpdate: true,\n });\n\n const view = root.createChildView(viewConstructor, section.props);\n\n root.ref[section.name] = root.appendChildView(view);\n};\n\nconst write$3 = ({ root, props }) => {\n // update scalable state\n if (root.ref.scalable === null || props.scalable !== root.ref.scalable) {\n root.ref.scalable = isBoolean(props.scalable) ? props.scalable : true;\n root.element.dataset.scalable = root.ref.scalable;\n }\n\n // no height, can't set\n if (!props.height) return;\n\n // get child rects\n const topRect = root.ref.top.rect.element;\n const bottomRect = root.ref.bottom.rect.element;\n\n // make sure height never is smaller than bottom and top seciton heights combined (will probably never happen, but who knows)\n const height = Math.max(topRect.height + bottomRect.height, props.height);\n\n // offset center part\n root.ref.center.translateY = topRect.height;\n\n // scale center part\n // use math ceil to prevent transparent lines because of rounding errors\n root.ref.center.scaleY = (height - topRect.height - bottomRect.height) / 100;\n\n // offset bottom part\n root.ref.bottom.translateY = height - bottomRect.height;\n};\n\nconst panel = createView({\n name: 'panel',\n read: ({ root, props }) => (props.heightCurrent = root.ref.bottom.translateY),\n write: write$3,\n create: create$6,\n ignoreRect: true,\n mixins: {\n apis: ['height', 'heightCurrent', 'scalable'],\n },\n});\n\nconst createDragHelper = items => {\n const itemIds = items.map(item => item.id);\n let prevIndex = undefined;\n return {\n setIndex: index => {\n prevIndex = index;\n },\n getIndex: () => prevIndex,\n getItemIndex: item => itemIds.indexOf(item.id),\n };\n};\n\nconst ITEM_TRANSLATE_SPRING = {\n type: 'spring',\n stiffness: 0.75,\n damping: 0.45,\n mass: 10,\n};\n\nconst ITEM_SCALE_SPRING = 'spring';\n\nconst StateMap = {\n DID_START_ITEM_LOAD: 'busy',\n DID_UPDATE_ITEM_LOAD_PROGRESS: 'loading',\n DID_THROW_ITEM_INVALID: 'load-invalid',\n DID_THROW_ITEM_LOAD_ERROR: 'load-error',\n DID_LOAD_ITEM: 'idle',\n DID_THROW_ITEM_REMOVE_ERROR: 'remove-error',\n DID_START_ITEM_REMOVE: 'busy',\n DID_START_ITEM_PROCESSING: 'busy processing',\n DID_REQUEST_ITEM_PROCESSING: 'busy processing',\n DID_UPDATE_ITEM_PROCESS_PROGRESS: 'processing',\n DID_COMPLETE_ITEM_PROCESSING: 'processing-complete',\n DID_THROW_ITEM_PROCESSING_ERROR: 'processing-error',\n DID_THROW_ITEM_PROCESSING_REVERT_ERROR: 'processing-revert-error',\n DID_ABORT_ITEM_PROCESSING: 'cancelled',\n DID_REVERT_ITEM_PROCESSING: 'idle',\n};\n\n/**\n * Creates the file view\n */\nconst create$7 = ({ root, props }) => {\n // select\n root.ref.handleClick = e => root.dispatch('DID_ACTIVATE_ITEM', { id: props.id });\n\n // set id\n root.element.id = `filepond--item-${props.id}`;\n root.element.addEventListener('click', root.ref.handleClick);\n\n // file view\n root.ref.container = root.appendChildView(root.createChildView(fileWrapper, { id: props.id }));\n\n // file panel\n root.ref.panel = root.appendChildView(root.createChildView(panel, { name: 'item-panel' }));\n\n // default start height\n root.ref.panel.height = null;\n\n // by default not marked for removal\n props.markedForRemoval = false;\n\n // if not allowed to reorder file items, exit here\n if (!root.query('GET_ALLOW_REORDER')) return;\n\n // set to idle so shows grab cursor\n root.element.dataset.dragState = 'idle';\n\n const grab = e => {\n if (!e.isPrimary) return;\n\n let removedActivateListener = false;\n\n const origin = {\n x: e.pageX,\n y: e.pageY,\n };\n\n props.dragOrigin = {\n x: root.translateX,\n y: root.translateY,\n };\n\n props.dragCenter = {\n x: e.offsetX,\n y: e.offsetY,\n };\n\n const dragState = createDragHelper(root.query('GET_ACTIVE_ITEMS'));\n\n root.dispatch('DID_GRAB_ITEM', { id: props.id, dragState });\n\n const drag = e => {\n if (!e.isPrimary) return;\n\n e.stopPropagation();\n e.preventDefault();\n\n props.dragOffset = {\n x: e.pageX - origin.x,\n y: e.pageY - origin.y,\n };\n\n // if dragged stop listening to clicks, will re-add when done dragging\n const dist =\n props.dragOffset.x * props.dragOffset.x + props.dragOffset.y * props.dragOffset.y;\n if (dist > 16 && !removedActivateListener) {\n removedActivateListener = true;\n root.element.removeEventListener('click', root.ref.handleClick);\n }\n\n root.dispatch('DID_DRAG_ITEM', { id: props.id, dragState });\n };\n\n const drop = e => {\n if (!e.isPrimary) return;\n\n props.dragOffset = {\n x: e.pageX - origin.x,\n y: e.pageY - origin.y,\n };\n\n reset();\n };\n\n const cancel = () => {\n reset();\n };\n\n const reset = () => {\n document.removeEventListener('pointercancel', cancel);\n document.removeEventListener('pointermove', drag);\n document.removeEventListener('pointerup', drop);\n\n root.dispatch('DID_DROP_ITEM', { id: props.id, dragState });\n\n // start listening to clicks again\n if (removedActivateListener) {\n setTimeout(() => root.element.addEventListener('click', root.ref.handleClick), 0);\n }\n };\n\n document.addEventListener('pointercancel', cancel);\n document.addEventListener('pointermove', drag);\n document.addEventListener('pointerup', drop);\n };\n\n root.element.addEventListener('pointerdown', grab);\n};\n\nconst route$1 = createRoute({\n DID_UPDATE_PANEL_HEIGHT: ({ root, action }) => {\n root.height = action.height;\n },\n});\n\nconst write$4 = createRoute(\n {\n DID_GRAB_ITEM: ({ root, props }) => {\n props.dragOrigin = {\n x: root.translateX,\n y: root.translateY,\n };\n },\n DID_DRAG_ITEM: ({ root }) => {\n root.element.dataset.dragState = 'drag';\n },\n DID_DROP_ITEM: ({ root, props }) => {\n props.dragOffset = null;\n props.dragOrigin = null;\n root.element.dataset.dragState = 'drop';\n },\n },\n ({ root, actions, props, shouldOptimize }) => {\n if (root.element.dataset.dragState === 'drop') {\n if (root.scaleX <= 1) {\n root.element.dataset.dragState = 'idle';\n }\n }\n\n // select last state change action\n let action = actions\n .concat()\n .filter(action => /^DID_/.test(action.type))\n .reverse()\n .find(action => StateMap[action.type]);\n\n // no need to set same state twice\n if (action && action.type !== props.currentState) {\n // set current state\n props.currentState = action.type;\n\n // set state\n root.element.dataset.filepondItemState = StateMap[props.currentState] || '';\n }\n\n // route actions\n const aspectRatio =\n root.query('GET_ITEM_PANEL_ASPECT_RATIO') || root.query('GET_PANEL_ASPECT_RATIO');\n if (!aspectRatio) {\n route$1({ root, actions, props });\n if (!root.height && root.ref.container.rect.element.height > 0) {\n root.height = root.ref.container.rect.element.height;\n }\n } else if (!shouldOptimize) {\n root.height = root.rect.element.width * aspectRatio;\n }\n\n // sync panel height with item height\n if (shouldOptimize) {\n root.ref.panel.height = null;\n }\n\n root.ref.panel.height = root.height;\n }\n);\n\nconst item = createView({\n create: create$7,\n write: write$4,\n destroy: ({ root, props }) => {\n root.element.removeEventListener('click', root.ref.handleClick);\n root.dispatch('RELEASE_ITEM', { query: props.id });\n },\n tag: 'li',\n name: 'item',\n mixins: {\n apis: [\n 'id',\n 'interactionMethod',\n 'markedForRemoval',\n 'spawnDate',\n 'dragCenter',\n 'dragOrigin',\n 'dragOffset',\n ],\n styles: ['translateX', 'translateY', 'scaleX', 'scaleY', 'opacity', 'height'],\n animations: {\n scaleX: ITEM_SCALE_SPRING,\n scaleY: ITEM_SCALE_SPRING,\n translateX: ITEM_TRANSLATE_SPRING,\n translateY: ITEM_TRANSLATE_SPRING,\n opacity: { type: 'tween', duration: 150 },\n },\n },\n});\n\nvar getItemsPerRow = (horizontalSpace, itemWidth) => {\n // add one pixel leeway, when using percentages for item width total items can be 1.99 per row\n\n return Math.max(1, Math.floor((horizontalSpace + 1) / itemWidth));\n};\n\nconst getItemIndexByPosition = (view, children, positionInView) => {\n if (!positionInView) return;\n\n const horizontalSpace = view.rect.element.width;\n // const children = view.childViews;\n const l = children.length;\n let last = null;\n\n // -1, don't move items to accomodate (either add to top or bottom)\n if (l === 0 || positionInView.top < children[0].rect.element.top) return -1;\n\n // let's get the item width\n const item = children[0];\n const itemRect = item.rect.element;\n const itemHorizontalMargin = itemRect.marginLeft + itemRect.marginRight;\n const itemWidth = itemRect.width + itemHorizontalMargin;\n const itemsPerRow = getItemsPerRow(horizontalSpace, itemWidth);\n\n // stack\n if (itemsPerRow === 1) {\n for (let index = 0; index < l; index++) {\n const child = children[index];\n const childMid = child.rect.outer.top + child.rect.element.height * 0.5;\n if (positionInView.top < childMid) {\n return index;\n }\n }\n return l;\n }\n\n // grid\n const itemVerticalMargin = itemRect.marginTop + itemRect.marginBottom;\n const itemHeight = itemRect.height + itemVerticalMargin;\n for (let index = 0; index < l; index++) {\n const indexX = index % itemsPerRow;\n const indexY = Math.floor(index / itemsPerRow);\n\n const offsetX = indexX * itemWidth;\n const offsetY = indexY * itemHeight;\n\n const itemTop = offsetY - itemRect.marginTop;\n const itemRight = offsetX + itemWidth;\n const itemBottom = offsetY + itemHeight + itemRect.marginBottom;\n\n if (positionInView.top < itemBottom && positionInView.top > itemTop) {\n if (positionInView.left < itemRight) {\n return index;\n } else if (index !== l - 1) {\n last = index;\n } else {\n last = null;\n }\n }\n }\n\n if (last !== null) {\n return last;\n }\n\n return l;\n};\n\nconst dropAreaDimensions = {\n height: 0,\n width: 0,\n get getHeight() {\n return this.height;\n },\n set setHeight(val) {\n if (this.height === 0 || val === 0) this.height = val;\n },\n get getWidth() {\n return this.width;\n },\n set setWidth(val) {\n if (this.width === 0 || val === 0) this.width = val;\n },\n setDimensions: function(height, width) {\n if (this.height === 0 || height === 0) this.height = height;\n if (this.width === 0 || width === 0) this.width = width;\n },\n};\n\nconst create$8 = ({ root }) => {\n // need to set role to list as otherwise it won't be read as a list by VoiceOver\n attr(root.element, 'role', 'list');\n\n root.ref.lastItemSpanwDate = Date.now();\n};\n\n/**\n * Inserts a new item\n * @param root\n * @param action\n */\nconst addItemView = ({ root, action }) => {\n const { id, index, interactionMethod } = action;\n\n root.ref.addIndex = index;\n\n const now = Date.now();\n let spawnDate = now;\n let opacity = 1;\n\n if (interactionMethod !== InteractionMethod.NONE) {\n opacity = 0;\n const cooldown = root.query('GET_ITEM_INSERT_INTERVAL');\n const dist = now - root.ref.lastItemSpanwDate;\n spawnDate = dist < cooldown ? now + (cooldown - dist) : now;\n }\n\n root.ref.lastItemSpanwDate = spawnDate;\n\n root.appendChildView(\n root.createChildView(\n // view type\n item,\n\n // props\n {\n spawnDate,\n id,\n opacity,\n interactionMethod,\n }\n ),\n index\n );\n};\n\nconst moveItem = (item, x, y, vx = 0, vy = 1) => {\n // set to null to remove animation while dragging\n if (item.dragOffset) {\n item.translateX = null;\n item.translateY = null;\n item.translateX = item.dragOrigin.x + item.dragOffset.x;\n item.translateY = item.dragOrigin.y + item.dragOffset.y;\n item.scaleX = 1.025;\n item.scaleY = 1.025;\n } else {\n item.translateX = x;\n item.translateY = y;\n\n if (Date.now() > item.spawnDate) {\n // reveal element\n if (item.opacity === 0) {\n introItemView(item, x, y, vx, vy);\n }\n\n // make sure is default scale every frame\n item.scaleX = 1;\n item.scaleY = 1;\n item.opacity = 1;\n }\n }\n};\n\nconst introItemView = (item, x, y, vx, vy) => {\n if (item.interactionMethod === InteractionMethod.NONE) {\n item.translateX = null;\n item.translateX = x;\n item.translateY = null;\n item.translateY = y;\n } else if (item.interactionMethod === InteractionMethod.DROP) {\n item.translateX = null;\n item.translateX = x - vx * 20;\n\n item.translateY = null;\n item.translateY = y - vy * 10;\n\n item.scaleX = 0.8;\n item.scaleY = 0.8;\n } else if (item.interactionMethod === InteractionMethod.BROWSE) {\n item.translateY = null;\n item.translateY = y - 30;\n } else if (item.interactionMethod === InteractionMethod.API) {\n item.translateX = null;\n item.translateX = x - 30;\n item.translateY = null;\n }\n};\n\n/**\n * Removes an existing item\n * @param root\n * @param action\n */\nconst removeItemView = ({ root, action }) => {\n const { id } = action;\n\n // get the view matching the given id\n const view = root.childViews.find(child => child.id === id);\n\n // if no view found, exit\n if (!view) {\n return;\n }\n\n // animate view out of view\n view.scaleX = 0.9;\n view.scaleY = 0.9;\n view.opacity = 0;\n\n // mark for removal\n view.markedForRemoval = true;\n};\n\nconst getItemHeight = child =>\n child.rect.element.height + child.rect.element.marginBottom + child.rect.element.marginTop;\nconst getItemWidth = child =>\n child.rect.element.width +\n child.rect.element.marginLeft * 0.5 +\n child.rect.element.marginRight * 0.5;\n\nconst dragItem = ({ root, action }) => {\n const { id, dragState } = action;\n\n // reference to item\n const item = root.query('GET_ITEM', { id });\n\n // get the view matching the given id\n const view = root.childViews.find(child => child.id === id);\n\n const numItems = root.childViews.length;\n const oldIndex = dragState.getItemIndex(item);\n\n // if no view found, exit\n if (!view) return;\n\n const dragPosition = {\n x: view.dragOrigin.x + view.dragOffset.x + view.dragCenter.x,\n y: view.dragOrigin.y + view.dragOffset.y + view.dragCenter.y,\n };\n\n // get drag area dimensions\n const dragHeight = getItemHeight(view);\n const dragWidth = getItemWidth(view);\n\n // get rows and columns (There will always be at least one row and one column if a file is present)\n let cols = Math.floor(root.rect.outer.width / dragWidth);\n if (cols > numItems) cols = numItems;\n\n // rows are used to find when we have left the preview area bounding box\n const rows = Math.floor(numItems / cols + 1);\n\n dropAreaDimensions.setHeight = dragHeight * rows;\n dropAreaDimensions.setWidth = dragWidth * cols;\n\n // get new index of dragged item\n var location = {\n y: Math.floor(dragPosition.y / dragHeight),\n x: Math.floor(dragPosition.x / dragWidth),\n getGridIndex: function getGridIndex() {\n if (\n dragPosition.y > dropAreaDimensions.getHeight ||\n dragPosition.y < 0 ||\n dragPosition.x > dropAreaDimensions.getWidth ||\n dragPosition.x < 0\n )\n return oldIndex;\n return this.y * cols + this.x;\n },\n getColIndex: function getColIndex() {\n const items = root.query('GET_ACTIVE_ITEMS');\n const visibleChildren = root.childViews.filter(child => child.rect.element.height);\n const children = items.map(item =>\n visibleChildren.find(childView => childView.id === item.id)\n );\n const currentIndex = children.findIndex(child => child === view);\n const dragHeight = getItemHeight(view);\n const l = children.length;\n let idx = l;\n let childHeight = 0;\n let childBottom = 0;\n let childTop = 0;\n for (let i = 0; i < l; i++) {\n childHeight = getItemHeight(children[i]);\n childTop = childBottom;\n childBottom = childTop + childHeight;\n if (dragPosition.y < childBottom) {\n if (currentIndex > i) {\n if (dragPosition.y < childTop + dragHeight) {\n idx = i;\n break;\n }\n continue;\n }\n idx = i;\n break;\n }\n }\n return idx;\n },\n };\n\n // get new index\n const index = cols > 1 ? location.getGridIndex() : location.getColIndex();\n root.dispatch('MOVE_ITEM', { query: view, index });\n\n // if the index of the item changed, dispatch reorder action\n const currentIndex = dragState.getIndex();\n\n if (currentIndex === undefined || currentIndex !== index) {\n dragState.setIndex(index);\n\n if (currentIndex === undefined) return;\n\n root.dispatch('DID_REORDER_ITEMS', {\n items: root.query('GET_ACTIVE_ITEMS'),\n origin: oldIndex,\n target: index,\n });\n }\n};\n\n/**\n * Setup action routes\n */\nconst route$2 = createRoute({\n DID_ADD_ITEM: addItemView,\n DID_REMOVE_ITEM: removeItemView,\n DID_DRAG_ITEM: dragItem,\n});\n\n/**\n * Write to view\n * @param root\n * @param actions\n * @param props\n */\nconst write$5 = ({ root, props, actions, shouldOptimize }) => {\n // route actions\n route$2({ root, props, actions });\n\n const { dragCoordinates } = props;\n\n // available space on horizontal axis\n const horizontalSpace = root.rect.element.width;\n\n // only draw children that have dimensions\n const visibleChildren = root.childViews.filter(child => child.rect.element.height);\n\n // sort based on current active items\n const children = root\n .query('GET_ACTIVE_ITEMS')\n .map(item => visibleChildren.find(child => child.id === item.id))\n .filter(item => item);\n\n // get index\n const dragIndex = dragCoordinates\n ? getItemIndexByPosition(root, children, dragCoordinates)\n : null;\n\n // add index is used to reserve the dropped/added item index till the actual item is rendered\n const addIndex = root.ref.addIndex || null;\n\n // add index no longer needed till possibly next draw\n root.ref.addIndex = null;\n\n let dragIndexOffset = 0;\n let removeIndexOffset = 0;\n let addIndexOffset = 0;\n\n if (children.length === 0) return;\n\n const childRect = children[0].rect.element;\n const itemVerticalMargin = childRect.marginTop + childRect.marginBottom;\n const itemHorizontalMargin = childRect.marginLeft + childRect.marginRight;\n const itemWidth = childRect.width + itemHorizontalMargin;\n const itemHeight = childRect.height + itemVerticalMargin;\n const itemsPerRow = getItemsPerRow(horizontalSpace, itemWidth);\n\n // stack\n if (itemsPerRow === 1) {\n let offsetY = 0;\n let dragOffset = 0;\n\n children.forEach((child, index) => {\n if (dragIndex) {\n let dist = index - dragIndex;\n if (dist === -2) {\n dragOffset = -itemVerticalMargin * 0.25;\n } else if (dist === -1) {\n dragOffset = -itemVerticalMargin * 0.75;\n } else if (dist === 0) {\n dragOffset = itemVerticalMargin * 0.75;\n } else if (dist === 1) {\n dragOffset = itemVerticalMargin * 0.25;\n } else {\n dragOffset = 0;\n }\n }\n\n if (shouldOptimize) {\n child.translateX = null;\n child.translateY = null;\n }\n\n if (!child.markedForRemoval) {\n moveItem(child, 0, offsetY + dragOffset);\n }\n\n let itemHeight = child.rect.element.height + itemVerticalMargin;\n\n let visualHeight = itemHeight * (child.markedForRemoval ? child.opacity : 1);\n\n offsetY += visualHeight;\n });\n }\n // grid\n else {\n let prevX = 0;\n let prevY = 0;\n\n children.forEach((child, index) => {\n if (index === dragIndex) {\n dragIndexOffset = 1;\n }\n\n if (index === addIndex) {\n addIndexOffset += 1;\n }\n\n if (child.markedForRemoval && child.opacity < 0.5) {\n removeIndexOffset -= 1;\n }\n\n const visualIndex = index + addIndexOffset + dragIndexOffset + removeIndexOffset;\n\n const indexX = visualIndex % itemsPerRow;\n const indexY = Math.floor(visualIndex / itemsPerRow);\n\n const offsetX = indexX * itemWidth;\n const offsetY = indexY * itemHeight;\n\n const vectorX = Math.sign(offsetX - prevX);\n const vectorY = Math.sign(offsetY - prevY);\n\n prevX = offsetX;\n prevY = offsetY;\n\n if (child.markedForRemoval) return;\n\n if (shouldOptimize) {\n child.translateX = null;\n child.translateY = null;\n }\n\n moveItem(child, offsetX, offsetY, vectorX, vectorY);\n });\n }\n};\n\n/**\n * Filters actions that are meant specifically for a certain child of the list\n * @param child\n * @param actions\n */\nconst filterSetItemActions = (child, actions) =>\n actions.filter(action => {\n // if action has an id, filter out actions that don't have this child id\n if (action.data && action.data.id) {\n return child.id === action.data.id;\n }\n\n // allow all other actions\n return true;\n });\n\nconst list = createView({\n create: create$8,\n write: write$5,\n tag: 'ul',\n name: 'list',\n didWriteView: ({ root }) => {\n root.childViews\n .filter(view => view.markedForRemoval && view.opacity === 0 && view.resting)\n .forEach(view => {\n view._destroy();\n root.removeChildView(view);\n });\n },\n filterFrameActionsForChild: filterSetItemActions,\n mixins: {\n apis: ['dragCoordinates'],\n },\n});\n\nconst create$9 = ({ root, props }) => {\n root.ref.list = root.appendChildView(root.createChildView(list));\n props.dragCoordinates = null;\n props.overflowing = false;\n};\n\nconst storeDragCoordinates = ({ root, props, action }) => {\n if (!root.query('GET_ITEM_INSERT_LOCATION_FREEDOM')) return;\n props.dragCoordinates = {\n left: action.position.scopeLeft - root.ref.list.rect.element.left,\n top:\n action.position.scopeTop -\n (root.rect.outer.top + root.rect.element.marginTop + root.rect.element.scrollTop),\n };\n};\n\nconst clearDragCoordinates = ({ props }) => {\n props.dragCoordinates = null;\n};\n\nconst route$3 = createRoute({\n DID_DRAG: storeDragCoordinates,\n DID_END_DRAG: clearDragCoordinates,\n});\n\nconst write$6 = ({ root, props, actions }) => {\n // route actions\n route$3({ root, props, actions });\n\n // current drag position\n root.ref.list.dragCoordinates = props.dragCoordinates;\n\n // if currently overflowing but no longer received overflow\n if (props.overflowing && !props.overflow) {\n props.overflowing = false;\n\n // reset overflow state\n root.element.dataset.state = '';\n root.height = null;\n }\n\n // if is not overflowing currently but does receive overflow value\n if (props.overflow) {\n const newHeight = Math.round(props.overflow);\n if (newHeight !== root.height) {\n props.overflowing = true;\n root.element.dataset.state = 'overflow';\n root.height = newHeight;\n }\n }\n};\n\nconst listScroller = createView({\n create: create$9,\n write: write$6,\n name: 'list-scroller',\n mixins: {\n apis: ['overflow', 'dragCoordinates'],\n styles: ['height', 'translateY'],\n animations: {\n translateY: 'spring',\n },\n },\n});\n\nconst attrToggle = (element, name, state, enabledValue = '') => {\n if (state) {\n attr(element, name, enabledValue);\n } else {\n element.removeAttribute(name);\n }\n};\n\nconst resetFileInput = input => {\n // no value, no need to reset\n if (!input || input.value === '') {\n return;\n }\n\n try {\n // for modern browsers\n input.value = '';\n } catch (err) {}\n\n // for IE10\n if (input.value) {\n // quickly append input to temp form and reset form\n const form = createElement$1('form');\n const parentNode = input.parentNode;\n const ref = input.nextSibling;\n form.appendChild(input);\n form.reset();\n\n // re-inject input where it originally was\n if (ref) {\n parentNode.insertBefore(input, ref);\n } else {\n parentNode.appendChild(input);\n }\n }\n};\n\nconst create$a = ({ root, props }) => {\n // set id so can be referenced from outside labels\n root.element.id = `filepond--browser-${props.id}`;\n\n // set name of element (is removed when a value is set)\n attr(root.element, 'name', root.query('GET_NAME'));\n\n // we have to link this element to the status element\n attr(root.element, 'aria-controls', `filepond--assistant-${props.id}`);\n\n // set label, we use labelled by as otherwise the screenreader does not read the \"browse\" text in the label (as it has tabindex: 0)\n attr(root.element, 'aria-labelledby', `filepond--drop-label-${props.id}`);\n\n // set configurable props\n setAcceptedFileTypes({ root, action: { value: root.query('GET_ACCEPTED_FILE_TYPES') } });\n toggleAllowMultiple({ root, action: { value: root.query('GET_ALLOW_MULTIPLE') } });\n toggleDirectoryFilter({ root, action: { value: root.query('GET_ALLOW_DIRECTORIES_ONLY') } });\n toggleDisabled({ root });\n toggleRequired({ root, action: { value: root.query('GET_REQUIRED') } });\n setCaptureMethod({ root, action: { value: root.query('GET_CAPTURE_METHOD') } });\n\n // handle changes to the input field\n root.ref.handleChange = e => {\n if (!root.element.value) {\n return;\n }\n\n // extract files and move value of webkitRelativePath path to _relativePath\n const files = Array.from(root.element.files).map(file => {\n file._relativePath = file.webkitRelativePath;\n return file;\n });\n\n // we add a little delay so the OS file select window can move out of the way before we add our file\n setTimeout(() => {\n // load files\n props.onload(files);\n\n // reset input, it's just for exposing a method to drop files, should not retain any state\n resetFileInput(root.element);\n }, 250);\n };\n\n root.element.addEventListener('change', root.ref.handleChange);\n};\n\nconst setAcceptedFileTypes = ({ root, action }) => {\n if (!root.query('GET_ALLOW_SYNC_ACCEPT_ATTRIBUTE')) return;\n attrToggle(root.element, 'accept', !!action.value, action.value ? action.value.join(',') : '');\n};\n\nconst toggleAllowMultiple = ({ root, action }) => {\n attrToggle(root.element, 'multiple', action.value);\n};\n\nconst toggleDirectoryFilter = ({ root, action }) => {\n attrToggle(root.element, 'webkitdirectory', action.value);\n};\n\nconst toggleDisabled = ({ root }) => {\n const isDisabled = root.query('GET_DISABLED');\n const doesAllowBrowse = root.query('GET_ALLOW_BROWSE');\n const disableField = isDisabled || !doesAllowBrowse;\n attrToggle(root.element, 'disabled', disableField);\n};\n\nconst toggleRequired = ({ root, action }) => {\n // want to remove required, always possible\n if (!action.value) {\n attrToggle(root.element, 'required', false);\n }\n // if want to make required, only possible when zero items\n else if (root.query('GET_TOTAL_ITEMS') === 0) {\n attrToggle(root.element, 'required', true);\n }\n};\n\nconst setCaptureMethod = ({ root, action }) => {\n attrToggle(root.element, 'capture', !!action.value, action.value === true ? '' : action.value);\n};\n\nconst updateRequiredStatus = ({ root }) => {\n const { element } = root;\n // always remove the required attribute when more than zero items\n if (root.query('GET_TOTAL_ITEMS') > 0) {\n attrToggle(element, 'required', false);\n attrToggle(element, 'name', false);\n\n // still has items\n const activeItems = root.query('GET_ACTIVE_ITEMS');\n let hasInvalidField = false;\n for (let i = 0; i < activeItems.length; i++) {\n if (activeItems[i].status === ItemStatus.LOAD_ERROR) {\n hasInvalidField = true;\n }\n }\n // set validity status\n root.element.setCustomValidity(\n hasInvalidField ? root.query('GET_LABEL_INVALID_FIELD') : ''\n );\n } else {\n // add name attribute\n attrToggle(element, 'name', true, root.query('GET_NAME'));\n\n // remove any validation messages\n const shouldCheckValidity = root.query('GET_CHECK_VALIDITY');\n if (shouldCheckValidity) {\n element.setCustomValidity('');\n }\n\n // we only add required if the field has been deemed required\n if (root.query('GET_REQUIRED')) {\n attrToggle(element, 'required', true);\n }\n }\n};\n\nconst updateFieldValidityStatus = ({ root }) => {\n const shouldCheckValidity = root.query('GET_CHECK_VALIDITY');\n if (!shouldCheckValidity) return;\n root.element.setCustomValidity(root.query('GET_LABEL_INVALID_FIELD'));\n};\n\nconst browser = createView({\n tag: 'input',\n name: 'browser',\n ignoreRect: true,\n ignoreRectUpdate: true,\n attributes: {\n type: 'file',\n },\n create: create$a,\n destroy: ({ root }) => {\n root.element.removeEventListener('change', root.ref.handleChange);\n },\n write: createRoute({\n DID_LOAD_ITEM: updateRequiredStatus,\n DID_REMOVE_ITEM: updateRequiredStatus,\n DID_THROW_ITEM_INVALID: updateFieldValidityStatus,\n\n DID_SET_DISABLED: toggleDisabled,\n DID_SET_ALLOW_BROWSE: toggleDisabled,\n DID_SET_ALLOW_DIRECTORIES_ONLY: toggleDirectoryFilter,\n DID_SET_ALLOW_MULTIPLE: toggleAllowMultiple,\n DID_SET_ACCEPTED_FILE_TYPES: setAcceptedFileTypes,\n DID_SET_CAPTURE_METHOD: setCaptureMethod,\n DID_SET_REQUIRED: toggleRequired,\n }),\n});\n\nconst Key = {\n ENTER: 13,\n SPACE: 32,\n};\n\nconst create$b = ({ root, props }) => {\n // create the label and link it to the file browser\n const label = createElement$1('label');\n attr(label, 'for', `filepond--browser-${props.id}`);\n\n // use for labeling file input (aria-labelledby on file input)\n attr(label, 'id', `filepond--drop-label-${props.id}`);\n\n // handle keys\n root.ref.handleKeyDown = e => {\n const isActivationKey = e.keyCode === Key.ENTER || e.keyCode === Key.SPACE;\n if (!isActivationKey) return;\n // stops from triggering the element a second time\n e.preventDefault();\n\n // click link (will then in turn activate file input)\n root.ref.label.click();\n };\n\n root.ref.handleClick = e => {\n const isLabelClick = e.target === label || label.contains(e.target);\n\n // don't want to click twice\n if (isLabelClick) return;\n\n // click link (will then in turn activate file input)\n root.ref.label.click();\n };\n\n // attach events\n label.addEventListener('keydown', root.ref.handleKeyDown);\n root.element.addEventListener('click', root.ref.handleClick);\n\n // update\n updateLabelValue(label, props.caption);\n\n // add!\n root.appendChild(label);\n root.ref.label = label;\n};\n\nconst updateLabelValue = (label, value) => {\n label.innerHTML = value;\n const clickable = label.querySelector('.filepond--label-action');\n if (clickable) {\n attr(clickable, 'tabindex', '0');\n }\n return value;\n};\n\nconst dropLabel = createView({\n name: 'drop-label',\n ignoreRect: true,\n create: create$b,\n destroy: ({ root }) => {\n root.ref.label.addEventListener('keydown', root.ref.handleKeyDown);\n root.element.removeEventListener('click', root.ref.handleClick);\n },\n write: createRoute({\n DID_SET_LABEL_IDLE: ({ root, action }) => {\n updateLabelValue(root.ref.label, action.value);\n },\n }),\n mixins: {\n styles: ['opacity', 'translateX', 'translateY'],\n animations: {\n opacity: { type: 'tween', duration: 150 },\n translateX: 'spring',\n translateY: 'spring',\n },\n },\n});\n\nconst blob = createView({\n name: 'drip-blob',\n ignoreRect: true,\n mixins: {\n styles: ['translateX', 'translateY', 'scaleX', 'scaleY', 'opacity'],\n animations: {\n scaleX: 'spring',\n scaleY: 'spring',\n translateX: 'spring',\n translateY: 'spring',\n opacity: { type: 'tween', duration: 250 },\n },\n },\n});\n\nconst addBlob = ({ root }) => {\n const centerX = root.rect.element.width * 0.5;\n const centerY = root.rect.element.height * 0.5;\n\n root.ref.blob = root.appendChildView(\n root.createChildView(blob, {\n opacity: 0,\n scaleX: 2.5,\n scaleY: 2.5,\n translateX: centerX,\n translateY: centerY,\n })\n );\n};\n\nconst moveBlob = ({ root, action }) => {\n if (!root.ref.blob) {\n addBlob({ root });\n return;\n }\n\n root.ref.blob.translateX = action.position.scopeLeft;\n root.ref.blob.translateY = action.position.scopeTop;\n root.ref.blob.scaleX = 1;\n root.ref.blob.scaleY = 1;\n root.ref.blob.opacity = 1;\n};\n\nconst hideBlob = ({ root }) => {\n if (!root.ref.blob) {\n return;\n }\n root.ref.blob.opacity = 0;\n};\n\nconst explodeBlob = ({ root }) => {\n if (!root.ref.blob) {\n return;\n }\n root.ref.blob.scaleX = 2.5;\n root.ref.blob.scaleY = 2.5;\n root.ref.blob.opacity = 0;\n};\n\nconst write$7 = ({ root, props, actions }) => {\n route$4({ root, props, actions });\n\n const { blob } = root.ref;\n\n if (actions.length === 0 && blob && blob.opacity === 0) {\n root.removeChildView(blob);\n root.ref.blob = null;\n }\n};\n\nconst route$4 = createRoute({\n DID_DRAG: moveBlob,\n DID_DROP: explodeBlob,\n DID_END_DRAG: hideBlob,\n});\n\nconst drip = createView({\n ignoreRect: true,\n ignoreRectUpdate: true,\n name: 'drip',\n write: write$7,\n});\n\nconst setInputFiles = (element, files) => {\n try {\n // Create a DataTransfer instance and add a newly created file\n const dataTransfer = new DataTransfer();\n files.forEach(file => {\n if (file instanceof File) {\n dataTransfer.items.add(file);\n } else {\n dataTransfer.items.add(\n new File([file], file.name, {\n type: file.type,\n })\n );\n }\n });\n\n // Assign the DataTransfer files list to the file input\n element.files = dataTransfer.files;\n } catch (err) {\n return false;\n }\n return true;\n};\n\nconst create$c = ({ root }) => {\n root.ref.fields = {};\n const legend = document.createElement('legend');\n legend.textContent = 'Files';\n root.element.appendChild(legend);\n};\n\nconst getField = (root, id) => root.ref.fields[id];\n\nconst syncFieldPositionsWithItems = root => {\n root.query('GET_ACTIVE_ITEMS').forEach(item => {\n if (!root.ref.fields[item.id]) return;\n root.element.appendChild(root.ref.fields[item.id]);\n });\n};\n\nconst didReorderItems = ({ root }) => syncFieldPositionsWithItems(root);\n\nconst didAddItem = ({ root, action }) => {\n const fileItem = root.query('GET_ITEM', action.id);\n const isLocalFile = fileItem.origin === FileOrigin.LOCAL;\n const shouldUseFileInput = !isLocalFile && root.query('SHOULD_UPDATE_FILE_INPUT');\n const dataContainer = createElement$1('input');\n dataContainer.type = shouldUseFileInput ? 'file' : 'hidden';\n dataContainer.name = root.query('GET_NAME');\n root.ref.fields[action.id] = dataContainer;\n syncFieldPositionsWithItems(root);\n};\n\nconst didLoadItem$1 = ({ root, action }) => {\n const field = getField(root, action.id);\n if (!field) return;\n\n // store server ref in hidden input\n if (action.serverFileReference !== null) field.value = action.serverFileReference;\n\n // store file item in file input\n if (!root.query('SHOULD_UPDATE_FILE_INPUT')) return;\n\n const fileItem = root.query('GET_ITEM', action.id);\n setInputFiles(field, [fileItem.file]);\n};\n\nconst didPrepareOutput = ({ root, action }) => {\n // this timeout pushes the handler after 'load'\n if (!root.query('SHOULD_UPDATE_FILE_INPUT')) return;\n setTimeout(() => {\n const field = getField(root, action.id);\n if (!field) return;\n setInputFiles(field, [action.file]);\n }, 0);\n};\n\nconst didSetDisabled = ({ root }) => {\n root.element.disabled = root.query('GET_DISABLED');\n};\n\nconst didRemoveItem = ({ root, action }) => {\n const field = getField(root, action.id);\n if (!field) return;\n if (field.parentNode) field.parentNode.removeChild(field);\n delete root.ref.fields[action.id];\n};\n\n// only runs for server files. will refuse to update the value if the field\n// is a file field\nconst didDefineValue = ({ root, action }) => {\n const field = getField(root, action.id);\n if (!field) return;\n if (action.value === null) {\n // clear field value\n field.removeAttribute('value');\n } else {\n // set field value\n if (field.type != 'file') {\n field.value = action.value;\n }\n }\n syncFieldPositionsWithItems(root);\n};\n\nconst write$8 = createRoute({\n DID_SET_DISABLED: didSetDisabled,\n DID_ADD_ITEM: didAddItem,\n DID_LOAD_ITEM: didLoadItem$1,\n DID_REMOVE_ITEM: didRemoveItem,\n DID_DEFINE_VALUE: didDefineValue,\n DID_PREPARE_OUTPUT: didPrepareOutput,\n DID_REORDER_ITEMS: didReorderItems,\n DID_SORT_ITEMS: didReorderItems,\n});\n\nconst data = createView({\n tag: 'fieldset',\n name: 'data',\n create: create$c,\n write: write$8,\n ignoreRect: true,\n});\n\nconst getRootNode = element => ('getRootNode' in element ? element.getRootNode() : document);\n\nconst images = ['jpg', 'jpeg', 'png', 'gif', 'bmp', 'webp', 'svg', 'tiff'];\nconst text$1 = ['css', 'csv', 'html', 'txt'];\nconst map = {\n zip: 'zip|compressed',\n epub: 'application/epub+zip',\n};\n\nconst guesstimateMimeType = (extension = '') => {\n extension = extension.toLowerCase();\n if (images.includes(extension)) {\n return (\n 'image/' + (extension === 'jpg' ? 'jpeg' : extension === 'svg' ? 'svg+xml' : extension)\n );\n }\n if (text$1.includes(extension)) {\n return 'text/' + extension;\n }\n\n return map[extension] || '';\n};\n\nconst requestDataTransferItems = dataTransfer =>\n new Promise((resolve, reject) => {\n // try to get links from transfer, if found we'll exit immediately (unless a file is in the dataTransfer as well, this is because Firefox could represent the file as a URL and a file object at the same time)\n const links = getLinks(dataTransfer);\n if (links.length && !hasFiles(dataTransfer)) {\n return resolve(links);\n }\n // try to get files from the transfer\n getFiles(dataTransfer).then(resolve);\n });\n\n/**\n * Test if datatransfer has files\n */\nconst hasFiles = dataTransfer => {\n if (dataTransfer.files) return dataTransfer.files.length > 0;\n return false;\n};\n\n/**\n * Extracts files from a DataTransfer object\n */\nconst getFiles = dataTransfer =>\n new Promise((resolve, reject) => {\n // get the transfer items as promises\n const promisedFiles = (dataTransfer.items ? Array.from(dataTransfer.items) : [])\n\n // only keep file system items (files and directories)\n .filter(item => isFileSystemItem(item))\n\n // map each item to promise\n .map(item => getFilesFromItem(item));\n\n // if is empty, see if we can extract some info from the files property as a fallback\n if (!promisedFiles.length) {\n // TODO: test for directories (should not be allowed)\n // Use FileReader, problem is that the files property gets lost in the process\n resolve(dataTransfer.files ? Array.from(dataTransfer.files) : []);\n return;\n }\n\n // done!\n Promise.all(promisedFiles)\n .then(returnedFileGroups => {\n // flatten groups\n const files = [];\n returnedFileGroups.forEach(group => {\n files.push.apply(files, group);\n });\n\n // done (filter out empty files)!\n resolve(\n files\n .filter(file => file)\n .map(file => {\n if (!file._relativePath) file._relativePath = file.webkitRelativePath;\n return file;\n })\n );\n })\n .catch(console.error);\n });\n\nconst isFileSystemItem = item => {\n if (isEntry(item)) {\n const entry = getAsEntry(item);\n if (entry) {\n return entry.isFile || entry.isDirectory;\n }\n }\n return item.kind === 'file';\n};\n\nconst getFilesFromItem = item =>\n new Promise((resolve, reject) => {\n if (isDirectoryEntry(item)) {\n getFilesInDirectory(getAsEntry(item))\n .then(resolve)\n .catch(reject);\n return;\n }\n\n resolve([item.getAsFile()]);\n });\n\nconst getFilesInDirectory = entry =>\n new Promise((resolve, reject) => {\n const files = [];\n\n // the total entries to read\n let dirCounter = 0;\n let fileCounter = 0;\n\n const resolveIfDone = () => {\n if (fileCounter === 0 && dirCounter === 0) {\n resolve(files);\n }\n };\n\n // the recursive function\n const readEntries = dirEntry => {\n dirCounter++;\n\n const directoryReader = dirEntry.createReader();\n\n // directories are returned in batches, we need to process all batches before we're done\n const readBatch = () => {\n directoryReader.readEntries(entries => {\n if (entries.length === 0) {\n dirCounter--;\n resolveIfDone();\n return;\n }\n\n entries.forEach(entry => {\n // recursively read more directories\n if (entry.isDirectory) {\n readEntries(entry);\n } else {\n // read as file\n fileCounter++;\n\n entry.file(file => {\n const correctedFile = correctMissingFileType(file);\n if (entry.fullPath) correctedFile._relativePath = entry.fullPath;\n files.push(correctedFile);\n fileCounter--;\n resolveIfDone();\n });\n }\n });\n\n // try to get next batch of files\n readBatch();\n }, reject);\n };\n\n // read first batch of files\n readBatch();\n };\n\n // go!\n readEntries(entry);\n });\n\nconst correctMissingFileType = file => {\n if (file.type.length) return file;\n const date = file.lastModifiedDate;\n const name = file.name;\n const type = guesstimateMimeType(getExtensionFromFilename(file.name));\n if (!type.length) return file;\n file = file.slice(0, file.size, type);\n file.name = name;\n file.lastModifiedDate = date;\n return file;\n};\n\nconst isDirectoryEntry = item => isEntry(item) && (getAsEntry(item) || {}).isDirectory;\n\nconst isEntry = item => 'webkitGetAsEntry' in item;\n\nconst getAsEntry = item => item.webkitGetAsEntry();\n\n/**\n * Extracts links from a DataTransfer object\n */\nconst getLinks = dataTransfer => {\n let links = [];\n try {\n // look in meta data property\n links = getLinksFromTransferMetaData(dataTransfer);\n if (links.length) {\n return links;\n }\n links = getLinksFromTransferURLData(dataTransfer);\n } catch (e) {\n // nope nope nope (probably IE trouble)\n }\n return links;\n};\n\nconst getLinksFromTransferURLData = dataTransfer => {\n let data = dataTransfer.getData('url');\n if (typeof data === 'string' && data.length) {\n return [data];\n }\n return [];\n};\n\nconst getLinksFromTransferMetaData = dataTransfer => {\n let data = dataTransfer.getData('text/html');\n if (typeof data === 'string' && data.length) {\n const matches = data.match(/src\\s*=\\s*\"(.+?)\"/);\n if (matches) {\n return [matches[1]];\n }\n }\n return [];\n};\n\nconst dragNDropObservers = [];\n\nconst eventPosition = e => ({\n pageLeft: e.pageX,\n pageTop: e.pageY,\n scopeLeft: e.offsetX || e.layerX,\n scopeTop: e.offsetY || e.layerY,\n});\n\nconst createDragNDropClient = (element, scopeToObserve, filterElement) => {\n const observer = getDragNDropObserver(scopeToObserve);\n\n const client = {\n element,\n filterElement,\n state: null,\n ondrop: () => {},\n onenter: () => {},\n ondrag: () => {},\n onexit: () => {},\n onload: () => {},\n allowdrop: () => {},\n };\n\n client.destroy = observer.addListener(client);\n\n return client;\n};\n\nconst getDragNDropObserver = element => {\n // see if already exists, if so, return\n const observer = dragNDropObservers.find(item => item.element === element);\n if (observer) {\n return observer;\n }\n\n // create new observer, does not yet exist for this element\n const newObserver = createDragNDropObserver(element);\n dragNDropObservers.push(newObserver);\n return newObserver;\n};\n\nconst createDragNDropObserver = element => {\n const clients = [];\n\n const routes = {\n dragenter,\n dragover,\n dragleave,\n drop,\n };\n\n const handlers = {};\n\n forin(routes, (event, createHandler) => {\n handlers[event] = createHandler(element, clients);\n element.addEventListener(event, handlers[event], false);\n });\n\n const observer = {\n element,\n addListener: client => {\n // add as client\n clients.push(client);\n\n // return removeListener function\n return () => {\n // remove client\n clients.splice(clients.indexOf(client), 1);\n\n // if no more clients, clean up observer\n if (clients.length === 0) {\n dragNDropObservers.splice(dragNDropObservers.indexOf(observer), 1);\n\n forin(routes, event => {\n element.removeEventListener(event, handlers[event], false);\n });\n }\n };\n },\n };\n\n return observer;\n};\n\nconst elementFromPoint = (root, point) => {\n if (!('elementFromPoint' in root)) {\n root = document;\n }\n return root.elementFromPoint(point.x, point.y);\n};\n\nconst isEventTarget = (e, target) => {\n // get root\n const root = getRootNode(target);\n\n // get element at position\n // if root is not actual shadow DOM and does not have elementFromPoint method, use the one on document\n const elementAtPosition = elementFromPoint(root, {\n x: e.pageX - window.pageXOffset,\n y: e.pageY - window.pageYOffset,\n });\n\n // test if target is the element or if one of its children is\n return elementAtPosition === target || target.contains(elementAtPosition);\n};\n\nlet initialTarget = null;\n\nconst setDropEffect = (dataTransfer, effect) => {\n // is in try catch as IE11 will throw error if not\n try {\n dataTransfer.dropEffect = effect;\n } catch (e) {}\n};\n\nconst dragenter = (root, clients) => e => {\n e.preventDefault();\n\n initialTarget = e.target;\n\n clients.forEach(client => {\n const { element, onenter } = client;\n\n if (isEventTarget(e, element)) {\n client.state = 'enter';\n\n // fire enter event\n onenter(eventPosition(e));\n }\n });\n};\n\nconst dragover = (root, clients) => e => {\n e.preventDefault();\n\n const dataTransfer = e.dataTransfer;\n\n requestDataTransferItems(dataTransfer).then(items => {\n let overDropTarget = false;\n\n clients.some(client => {\n const { filterElement, element, onenter, onexit, ondrag, allowdrop } = client;\n\n // by default we can drop\n setDropEffect(dataTransfer, 'copy');\n\n // allow transfer of these items\n const allowsTransfer = allowdrop(items);\n\n // only used when can be dropped on page\n if (!allowsTransfer) {\n setDropEffect(dataTransfer, 'none');\n return;\n }\n\n // targetting this client\n if (isEventTarget(e, element)) {\n overDropTarget = true;\n\n // had no previous state, means we are entering this client\n if (client.state === null) {\n client.state = 'enter';\n onenter(eventPosition(e));\n return;\n }\n\n // now over element (no matter if it allows the drop or not)\n client.state = 'over';\n\n // needs to allow transfer\n if (filterElement && !allowsTransfer) {\n setDropEffect(dataTransfer, 'none');\n return;\n }\n\n // dragging\n ondrag(eventPosition(e));\n } else {\n // should be over an element to drop\n if (filterElement && !overDropTarget) {\n setDropEffect(dataTransfer, 'none');\n }\n\n // might have just left this client?\n if (client.state) {\n client.state = null;\n onexit(eventPosition(e));\n }\n }\n });\n });\n};\n\nconst drop = (root, clients) => e => {\n e.preventDefault();\n\n const dataTransfer = e.dataTransfer;\n\n requestDataTransferItems(dataTransfer).then(items => {\n clients.forEach(client => {\n const { filterElement, element, ondrop, onexit, allowdrop } = client;\n\n client.state = null;\n\n // if we're filtering on element we need to be over the element to drop\n if (filterElement && !isEventTarget(e, element)) return;\n\n // no transfer for this client\n if (!allowdrop(items)) return onexit(eventPosition(e));\n\n // we can drop these items on this client\n ondrop(eventPosition(e), items);\n });\n });\n};\n\nconst dragleave = (root, clients) => e => {\n if (initialTarget !== e.target) {\n return;\n }\n\n clients.forEach(client => {\n const { onexit } = client;\n\n client.state = null;\n\n onexit(eventPosition(e));\n });\n};\n\nconst createHopper = (scope, validateItems, options) => {\n // is now hopper scope\n scope.classList.add('filepond--hopper');\n\n // shortcuts\n const { catchesDropsOnPage, requiresDropOnElement, filterItems = items => items } = options;\n\n // create a dnd client\n const client = createDragNDropClient(\n scope,\n catchesDropsOnPage ? document.documentElement : scope,\n requiresDropOnElement\n );\n\n // current client state\n let lastState = '';\n let currentState = '';\n\n // determines if a file may be dropped\n client.allowdrop = items => {\n // TODO: if we can, throw error to indicate the items cannot by dropped\n\n return validateItems(filterItems(items));\n };\n\n client.ondrop = (position, items) => {\n const filteredItems = filterItems(items);\n\n if (!validateItems(filteredItems)) {\n api.ondragend(position);\n return;\n }\n\n currentState = 'drag-drop';\n\n api.onload(filteredItems, position);\n };\n\n client.ondrag = position => {\n api.ondrag(position);\n };\n\n client.onenter = position => {\n currentState = 'drag-over';\n\n api.ondragstart(position);\n };\n\n client.onexit = position => {\n currentState = 'drag-exit';\n\n api.ondragend(position);\n };\n\n const api = {\n updateHopperState: () => {\n if (lastState !== currentState) {\n scope.dataset.hopperState = currentState;\n lastState = currentState;\n }\n },\n onload: () => {},\n ondragstart: () => {},\n ondrag: () => {},\n ondragend: () => {},\n destroy: () => {\n // destroy client\n client.destroy();\n },\n };\n\n return api;\n};\n\nlet listening = false;\nconst listeners$1 = [];\n\nconst handlePaste = e => {\n // if is pasting in input or textarea and the target is outside of a filepond scope, ignore\n const activeEl = document.activeElement;\n const isActiveElementEditable =\n activeEl &&\n (/textarea|input/i.test(activeEl.nodeName) ||\n activeEl.getAttribute('contenteditable') === 'true' ||\n activeEl.getAttribute('contenteditable') === '');\n\n if (isActiveElementEditable) {\n // test textarea or input is contained in filepond root\n let inScope = false;\n let element = activeEl;\n while (element !== document.body) {\n if (element.classList.contains('filepond--root')) {\n inScope = true;\n break;\n }\n element = element.parentNode;\n }\n\n if (!inScope) return;\n }\n\n requestDataTransferItems(e.clipboardData).then(files => {\n // no files received\n if (!files.length) {\n return;\n }\n\n // notify listeners of received files\n listeners$1.forEach(listener => listener(files));\n });\n};\n\nconst listen = cb => {\n // can't add twice\n if (listeners$1.includes(cb)) {\n return;\n }\n\n // add initial listener\n listeners$1.push(cb);\n\n // setup paste listener for entire page\n if (listening) {\n return;\n }\n\n listening = true;\n document.addEventListener('paste', handlePaste);\n};\n\nconst unlisten = listener => {\n arrayRemove(listeners$1, listeners$1.indexOf(listener));\n\n // clean up\n if (listeners$1.length === 0) {\n document.removeEventListener('paste', handlePaste);\n listening = false;\n }\n};\n\nconst createPaster = () => {\n const cb = files => {\n api.onload(files);\n };\n\n const api = {\n destroy: () => {\n unlisten(cb);\n },\n onload: () => {},\n };\n\n listen(cb);\n\n return api;\n};\n\n/**\n * Creates the file view\n */\nconst create$d = ({ root, props }) => {\n root.element.id = `filepond--assistant-${props.id}`;\n attr(root.element, 'role', 'alert');\n attr(root.element, 'aria-live', 'polite');\n attr(root.element, 'aria-relevant', 'additions');\n};\n\nlet addFilesNotificationTimeout = null;\nlet notificationClearTimeout = null;\n\nconst filenames = [];\n\nconst assist = (root, message) => {\n root.element.textContent = message;\n};\n\nconst clear$1 = root => {\n root.element.textContent = '';\n};\n\nconst listModified = (root, filename, label) => {\n const total = root.query('GET_TOTAL_ITEMS');\n assist(\n root,\n `${label} ${filename}, ${total} ${\n total === 1\n ? root.query('GET_LABEL_FILE_COUNT_SINGULAR')\n : root.query('GET_LABEL_FILE_COUNT_PLURAL')\n }`\n );\n\n // clear group after set amount of time so the status is not read twice\n clearTimeout(notificationClearTimeout);\n notificationClearTimeout = setTimeout(() => {\n clear$1(root);\n }, 1500);\n};\n\nconst isUsingFilePond = root => root.element.parentNode.contains(document.activeElement);\n\nconst itemAdded = ({ root, action }) => {\n if (!isUsingFilePond(root)) {\n return;\n }\n\n root.element.textContent = '';\n const item = root.query('GET_ITEM', action.id);\n filenames.push(item.filename);\n\n clearTimeout(addFilesNotificationTimeout);\n addFilesNotificationTimeout = setTimeout(() => {\n listModified(root, filenames.join(', '), root.query('GET_LABEL_FILE_ADDED'));\n filenames.length = 0;\n }, 750);\n};\n\nconst itemRemoved = ({ root, action }) => {\n if (!isUsingFilePond(root)) {\n return;\n }\n\n const item = action.item;\n listModified(root, item.filename, root.query('GET_LABEL_FILE_REMOVED'));\n};\n\nconst itemProcessed = ({ root, action }) => {\n // will also notify the user when FilePond is not being used, as the user might be occupied with other activities while uploading a file\n\n const item = root.query('GET_ITEM', action.id);\n const filename = item.filename;\n const label = root.query('GET_LABEL_FILE_PROCESSING_COMPLETE');\n\n assist(root, `${filename} ${label}`);\n};\n\nconst itemProcessedUndo = ({ root, action }) => {\n const item = root.query('GET_ITEM', action.id);\n const filename = item.filename;\n const label = root.query('GET_LABEL_FILE_PROCESSING_ABORTED');\n\n assist(root, `${filename} ${label}`);\n};\n\nconst itemError = ({ root, action }) => {\n const item = root.query('GET_ITEM', action.id);\n const filename = item.filename;\n\n // will also notify the user when FilePond is not being used, as the user might be occupied with other activities while uploading a file\n\n assist(root, `${action.status.main} ${filename} ${action.status.sub}`);\n};\n\nconst assistant = createView({\n create: create$d,\n ignoreRect: true,\n ignoreRectUpdate: true,\n write: createRoute({\n DID_LOAD_ITEM: itemAdded,\n DID_REMOVE_ITEM: itemRemoved,\n DID_COMPLETE_ITEM_PROCESSING: itemProcessed,\n\n DID_ABORT_ITEM_PROCESSING: itemProcessedUndo,\n DID_REVERT_ITEM_PROCESSING: itemProcessedUndo,\n\n DID_THROW_ITEM_REMOVE_ERROR: itemError,\n DID_THROW_ITEM_LOAD_ERROR: itemError,\n DID_THROW_ITEM_INVALID: itemError,\n DID_THROW_ITEM_PROCESSING_ERROR: itemError,\n }),\n tag: 'span',\n name: 'assistant',\n});\n\nconst toCamels = (string, separator = '-') =>\n string.replace(new RegExp(`${separator}.`, 'g'), sub => sub.charAt(1).toUpperCase());\n\nconst debounce = (func, interval = 16, immidiateOnly = true) => {\n let last = Date.now();\n let timeout = null;\n\n return (...args) => {\n clearTimeout(timeout);\n\n const dist = Date.now() - last;\n\n const fn = () => {\n last = Date.now();\n func(...args);\n };\n\n if (dist < interval) {\n // we need to delay by the difference between interval and dist\n // for example: if distance is 10 ms and interval is 16 ms,\n // we need to wait an additional 6ms before calling the function)\n if (!immidiateOnly) {\n timeout = setTimeout(fn, interval - dist);\n }\n } else {\n // go!\n fn();\n }\n };\n};\n\nconst MAX_FILES_LIMIT = 1000000;\n\nconst prevent = e => e.preventDefault();\n\nconst create$e = ({ root, props }) => {\n // Add id\n const id = root.query('GET_ID');\n if (id) {\n root.element.id = id;\n }\n\n // Add className\n const className = root.query('GET_CLASS_NAME');\n if (className) {\n className\n .split(' ')\n .filter(name => name.length)\n .forEach(name => {\n root.element.classList.add(name);\n });\n }\n\n // Field label\n root.ref.label = root.appendChildView(\n root.createChildView(dropLabel, {\n ...props,\n translateY: null,\n caption: root.query('GET_LABEL_IDLE'),\n })\n );\n\n // List of items\n root.ref.list = root.appendChildView(root.createChildView(listScroller, { translateY: null }));\n\n // Background panel\n root.ref.panel = root.appendChildView(root.createChildView(panel, { name: 'panel-root' }));\n\n // Assistant notifies assistive tech when content changes\n root.ref.assistant = root.appendChildView(root.createChildView(assistant, { ...props }));\n\n // Data\n root.ref.data = root.appendChildView(root.createChildView(data, { ...props }));\n\n // Measure (tests if fixed height was set)\n // DOCTYPE needs to be set for this to work\n root.ref.measure = createElement$1('div');\n root.ref.measure.style.height = '100%';\n root.element.appendChild(root.ref.measure);\n\n // information on the root height or fixed height status\n root.ref.bounds = null;\n\n // apply initial style properties\n root.query('GET_STYLES')\n .filter(style => !isEmpty(style.value))\n .map(({ name, value }) => {\n root.element.dataset[name] = value;\n });\n\n // determine if width changed\n root.ref.widthPrevious = null;\n root.ref.widthUpdated = debounce(() => {\n root.ref.updateHistory = [];\n root.dispatch('DID_RESIZE_ROOT');\n }, 250);\n\n // history of updates\n root.ref.previousAspectRatio = null;\n root.ref.updateHistory = [];\n\n // prevent scrolling and zooming on iOS (only if supports pointer events, for then we can enable reorder)\n const canHover = window.matchMedia('(pointer: fine) and (hover: hover)').matches;\n const hasPointerEvents = 'PointerEvent' in window;\n if (root.query('GET_ALLOW_REORDER') && hasPointerEvents && !canHover) {\n root.element.addEventListener('touchmove', prevent, { passive: false });\n root.element.addEventListener('gesturestart', prevent);\n }\n\n // add credits\n const credits = root.query('GET_CREDITS');\n const hasCredits = credits.length === 2;\n if (hasCredits) {\n const frag = document.createElement('a');\n frag.className = 'filepond--credits';\n frag.href = credits[0];\n frag.tabIndex = -1;\n frag.target = '_blank';\n frag.rel = 'noopener noreferrer nofollow';\n frag.textContent = credits[1];\n root.element.appendChild(frag);\n root.ref.credits = frag;\n }\n};\n\nconst write$9 = ({ root, props, actions }) => {\n // route actions\n route$5({ root, props, actions });\n\n // apply style properties\n actions\n .filter(action => /^DID_SET_STYLE_/.test(action.type))\n .filter(action => !isEmpty(action.data.value))\n .map(({ type, data }) => {\n const name = toCamels(type.substring(8).toLowerCase(), '_');\n root.element.dataset[name] = data.value;\n root.invalidateLayout();\n });\n\n if (root.rect.element.hidden) return;\n\n if (root.rect.element.width !== root.ref.widthPrevious) {\n root.ref.widthPrevious = root.rect.element.width;\n root.ref.widthUpdated();\n }\n\n // get box bounds, we do this only once\n let bounds = root.ref.bounds;\n if (!bounds) {\n bounds = root.ref.bounds = calculateRootBoundingBoxHeight(root);\n\n // destroy measure element\n root.element.removeChild(root.ref.measure);\n root.ref.measure = null;\n }\n\n // get quick references to various high level parts of the upload tool\n const { hopper, label, list, panel } = root.ref;\n\n // sets correct state to hopper scope\n if (hopper) {\n hopper.updateHopperState();\n }\n\n // bool to indicate if we're full or not\n const aspectRatio = root.query('GET_PANEL_ASPECT_RATIO');\n const isMultiItem = root.query('GET_ALLOW_MULTIPLE');\n const totalItems = root.query('GET_TOTAL_ITEMS');\n const maxItems = isMultiItem ? root.query('GET_MAX_FILES') || MAX_FILES_LIMIT : 1;\n const atMaxCapacity = totalItems === maxItems;\n\n // action used to add item\n const addAction = actions.find(action => action.type === 'DID_ADD_ITEM');\n\n // if reached max capacity and we've just reached it\n if (atMaxCapacity && addAction) {\n // get interaction type\n const interactionMethod = addAction.data.interactionMethod;\n\n // hide label\n label.opacity = 0;\n\n if (isMultiItem) {\n label.translateY = -40;\n } else {\n if (interactionMethod === InteractionMethod.API) {\n label.translateX = 40;\n } else if (interactionMethod === InteractionMethod.BROWSE) {\n label.translateY = 40;\n } else {\n label.translateY = 30;\n }\n }\n } else if (!atMaxCapacity) {\n label.opacity = 1;\n label.translateX = 0;\n label.translateY = 0;\n }\n\n const listItemMargin = calculateListItemMargin(root);\n\n const listHeight = calculateListHeight(root);\n\n const labelHeight = label.rect.element.height;\n const currentLabelHeight = !isMultiItem || atMaxCapacity ? 0 : labelHeight;\n\n const listMarginTop = atMaxCapacity ? list.rect.element.marginTop : 0;\n const listMarginBottom = totalItems === 0 ? 0 : list.rect.element.marginBottom;\n\n const visualHeight = currentLabelHeight + listMarginTop + listHeight.visual + listMarginBottom;\n const boundsHeight = currentLabelHeight + listMarginTop + listHeight.bounds + listMarginBottom;\n\n // link list to label bottom position\n list.translateY =\n Math.max(0, currentLabelHeight - list.rect.element.marginTop) - listItemMargin.top;\n\n if (aspectRatio) {\n // fixed aspect ratio\n\n // calculate height based on width\n const width = root.rect.element.width;\n const height = width * aspectRatio;\n\n // clear history if aspect ratio has changed\n if (aspectRatio !== root.ref.previousAspectRatio) {\n root.ref.previousAspectRatio = aspectRatio;\n root.ref.updateHistory = [];\n }\n\n // remember this width\n const history = root.ref.updateHistory;\n history.push(width);\n\n const MAX_BOUNCES = 2;\n if (history.length > MAX_BOUNCES * 2) {\n const l = history.length;\n const bottom = l - 10;\n let bounces = 0;\n for (let i = l; i >= bottom; i--) {\n if (history[i] === history[i - 2]) {\n bounces++;\n }\n\n if (bounces >= MAX_BOUNCES) {\n // dont adjust height\n return;\n }\n }\n }\n\n // fix height of panel so it adheres to aspect ratio\n panel.scalable = false;\n panel.height = height;\n\n // available height for list\n const listAvailableHeight =\n // the height of the panel minus the label height\n height -\n currentLabelHeight -\n // the room we leave open between the end of the list and the panel bottom\n (listMarginBottom - listItemMargin.bottom) -\n // if we're full we need to leave some room between the top of the panel and the list\n (atMaxCapacity ? listMarginTop : 0);\n\n if (listHeight.visual > listAvailableHeight) {\n list.overflow = listAvailableHeight;\n } else {\n list.overflow = null;\n }\n\n // set container bounds (so pushes siblings downwards)\n root.height = height;\n } else if (bounds.fixedHeight) {\n // fixed height\n\n // fix height of panel\n panel.scalable = false;\n\n // available height for list\n const listAvailableHeight =\n // the height of the panel minus the label height\n bounds.fixedHeight -\n currentLabelHeight -\n // the room we leave open between the end of the list and the panel bottom\n (listMarginBottom - listItemMargin.bottom) -\n // if we're full we need to leave some room between the top of the panel and the list\n (atMaxCapacity ? listMarginTop : 0);\n\n // set list height\n if (listHeight.visual > listAvailableHeight) {\n list.overflow = listAvailableHeight;\n } else {\n list.overflow = null;\n }\n\n // no need to set container bounds as these are handles by CSS fixed height\n } else if (bounds.cappedHeight) {\n // max-height\n\n // not a fixed height panel\n const isCappedHeight = visualHeight >= bounds.cappedHeight;\n const panelHeight = Math.min(bounds.cappedHeight, visualHeight);\n panel.scalable = true;\n panel.height = isCappedHeight\n ? panelHeight\n : panelHeight - listItemMargin.top - listItemMargin.bottom;\n\n // available height for list\n const listAvailableHeight =\n // the height of the panel minus the label height\n panelHeight -\n currentLabelHeight -\n // the room we leave open between the end of the list and the panel bottom\n (listMarginBottom - listItemMargin.bottom) -\n // if we're full we need to leave some room between the top of the panel and the list\n (atMaxCapacity ? listMarginTop : 0);\n\n // set list height (if is overflowing)\n if (visualHeight > bounds.cappedHeight && listHeight.visual > listAvailableHeight) {\n list.overflow = listAvailableHeight;\n } else {\n list.overflow = null;\n }\n\n // set container bounds (so pushes siblings downwards)\n root.height = Math.min(\n bounds.cappedHeight,\n boundsHeight - listItemMargin.top - listItemMargin.bottom\n );\n } else {\n // flexible height\n\n // not a fixed height panel\n const itemMargin = totalItems > 0 ? listItemMargin.top + listItemMargin.bottom : 0;\n panel.scalable = true;\n panel.height = Math.max(labelHeight, visualHeight - itemMargin);\n\n // set container bounds (so pushes siblings downwards)\n root.height = Math.max(labelHeight, boundsHeight - itemMargin);\n }\n\n // move credits to bottom\n if (root.ref.credits && panel.heightCurrent)\n root.ref.credits.style.transform = `translateY(${panel.heightCurrent}px)`;\n};\n\nconst calculateListItemMargin = root => {\n const item = root.ref.list.childViews[0].childViews[0];\n return item\n ? {\n top: item.rect.element.marginTop,\n bottom: item.rect.element.marginBottom,\n }\n : {\n top: 0,\n bottom: 0,\n };\n};\n\nconst calculateListHeight = root => {\n let visual = 0;\n let bounds = 0;\n\n // get file list reference\n const scrollList = root.ref.list;\n const itemList = scrollList.childViews[0];\n const visibleChildren = itemList.childViews.filter(child => child.rect.element.height);\n const children = root\n .query('GET_ACTIVE_ITEMS')\n .map(item => visibleChildren.find(child => child.id === item.id))\n .filter(item => item);\n\n // no children, done!\n if (children.length === 0) return { visual, bounds };\n\n const horizontalSpace = itemList.rect.element.width;\n const dragIndex = getItemIndexByPosition(itemList, children, scrollList.dragCoordinates);\n\n const childRect = children[0].rect.element;\n\n const itemVerticalMargin = childRect.marginTop + childRect.marginBottom;\n const itemHorizontalMargin = childRect.marginLeft + childRect.marginRight;\n\n const itemWidth = childRect.width + itemHorizontalMargin;\n const itemHeight = childRect.height + itemVerticalMargin;\n\n const newItem = typeof dragIndex !== 'undefined' && dragIndex >= 0 ? 1 : 0;\n const removedItem = children.find(child => child.markedForRemoval && child.opacity < 0.45)\n ? -1\n : 0;\n const verticalItemCount = children.length + newItem + removedItem;\n const itemsPerRow = getItemsPerRow(horizontalSpace, itemWidth);\n\n // stack\n if (itemsPerRow === 1) {\n children.forEach(item => {\n const height = item.rect.element.height + itemVerticalMargin;\n bounds += height;\n visual += height * item.opacity;\n });\n }\n // grid\n else {\n bounds = Math.ceil(verticalItemCount / itemsPerRow) * itemHeight;\n visual = bounds;\n }\n\n return { visual, bounds };\n};\n\nconst calculateRootBoundingBoxHeight = root => {\n const height = root.ref.measureHeight || null;\n const cappedHeight = parseInt(root.style.maxHeight, 10) || null;\n const fixedHeight = height === 0 ? null : height;\n\n return {\n cappedHeight,\n fixedHeight,\n };\n};\n\nconst exceedsMaxFiles = (root, items) => {\n const allowReplace = root.query('GET_ALLOW_REPLACE');\n const allowMultiple = root.query('GET_ALLOW_MULTIPLE');\n const totalItems = root.query('GET_TOTAL_ITEMS');\n let maxItems = root.query('GET_MAX_FILES');\n\n // total amount of items being dragged\n const totalBrowseItems = items.length;\n\n // if does not allow multiple items and dragging more than one item\n if (!allowMultiple && totalBrowseItems > 1) {\n root.dispatch('DID_THROW_MAX_FILES', {\n source: items,\n error: createResponse('warning', 0, 'Max files'),\n });\n return true;\n }\n\n // limit max items to one if not allowed to drop multiple items\n maxItems = allowMultiple ? maxItems : 1;\n\n if (!allowMultiple && allowReplace) {\n // There is only one item, so there is room to replace or add an item\n return false;\n }\n\n // no more room?\n const hasMaxItems = isInt(maxItems);\n if (hasMaxItems && totalItems + totalBrowseItems > maxItems) {\n root.dispatch('DID_THROW_MAX_FILES', {\n source: items,\n error: createResponse('warning', 0, 'Max files'),\n });\n return true;\n }\n\n return false;\n};\n\nconst getDragIndex = (list, children, position) => {\n const itemList = list.childViews[0];\n return getItemIndexByPosition(itemList, children, {\n left: position.scopeLeft - itemList.rect.element.left,\n top:\n position.scopeTop -\n (list.rect.outer.top + list.rect.element.marginTop + list.rect.element.scrollTop),\n });\n};\n\n/**\n * Enable or disable file drop functionality\n */\nconst toggleDrop = root => {\n const isAllowed = root.query('GET_ALLOW_DROP');\n const isDisabled = root.query('GET_DISABLED');\n const enabled = isAllowed && !isDisabled;\n if (enabled && !root.ref.hopper) {\n const hopper = createHopper(\n root.element,\n items => {\n // allow quick validation of dropped items\n const beforeDropFile = root.query('GET_BEFORE_DROP_FILE') || (() => true);\n\n // all items should be validated by all filters as valid\n const dropValidation = root.query('GET_DROP_VALIDATION');\n return dropValidation\n ? items.every(\n item =>\n applyFilters('ALLOW_HOPPER_ITEM', item, {\n query: root.query,\n }).every(result => result === true) && beforeDropFile(item)\n )\n : true;\n },\n {\n filterItems: items => {\n const ignoredFiles = root.query('GET_IGNORED_FILES');\n return items.filter(item => {\n if (isFile(item)) {\n return !ignoredFiles.includes(item.name.toLowerCase());\n }\n return true;\n });\n },\n catchesDropsOnPage: root.query('GET_DROP_ON_PAGE'),\n requiresDropOnElement: root.query('GET_DROP_ON_ELEMENT'),\n }\n );\n\n hopper.onload = (items, position) => {\n // get item children elements and sort based on list sort\n const list = root.ref.list.childViews[0];\n const visibleChildren = list.childViews.filter(child => child.rect.element.height);\n const children = root\n .query('GET_ACTIVE_ITEMS')\n .map(item => visibleChildren.find(child => child.id === item.id))\n .filter(item => item);\n\n applyFilterChain('ADD_ITEMS', items, { dispatch: root.dispatch }).then(queue => {\n // these files don't fit so stop here\n if (exceedsMaxFiles(root, queue)) return false;\n\n // go\n root.dispatch('ADD_ITEMS', {\n items: queue,\n index: getDragIndex(root.ref.list, children, position),\n interactionMethod: InteractionMethod.DROP,\n });\n });\n\n root.dispatch('DID_DROP', { position });\n\n root.dispatch('DID_END_DRAG', { position });\n };\n\n hopper.ondragstart = position => {\n root.dispatch('DID_START_DRAG', { position });\n };\n\n hopper.ondrag = debounce(position => {\n root.dispatch('DID_DRAG', { position });\n });\n\n hopper.ondragend = position => {\n root.dispatch('DID_END_DRAG', { position });\n };\n\n root.ref.hopper = hopper;\n\n root.ref.drip = root.appendChildView(root.createChildView(drip));\n } else if (!enabled && root.ref.hopper) {\n root.ref.hopper.destroy();\n root.ref.hopper = null;\n root.removeChildView(root.ref.drip);\n }\n};\n\n/**\n * Enable or disable browse functionality\n */\nconst toggleBrowse = (root, props) => {\n const isAllowed = root.query('GET_ALLOW_BROWSE');\n const isDisabled = root.query('GET_DISABLED');\n const enabled = isAllowed && !isDisabled;\n if (enabled && !root.ref.browser) {\n root.ref.browser = root.appendChildView(\n root.createChildView(browser, {\n ...props,\n onload: items => {\n applyFilterChain('ADD_ITEMS', items, {\n dispatch: root.dispatch,\n }).then(queue => {\n // these files don't fit so stop here\n if (exceedsMaxFiles(root, queue)) return false;\n\n // add items!\n root.dispatch('ADD_ITEMS', {\n items: queue,\n index: -1,\n interactionMethod: InteractionMethod.BROWSE,\n });\n });\n },\n }),\n 0\n );\n } else if (!enabled && root.ref.browser) {\n root.removeChildView(root.ref.browser);\n root.ref.browser = null;\n }\n};\n\n/**\n * Enable or disable paste functionality\n */\nconst togglePaste = root => {\n const isAllowed = root.query('GET_ALLOW_PASTE');\n const isDisabled = root.query('GET_DISABLED');\n const enabled = isAllowed && !isDisabled;\n if (enabled && !root.ref.paster) {\n root.ref.paster = createPaster();\n root.ref.paster.onload = items => {\n applyFilterChain('ADD_ITEMS', items, { dispatch: root.dispatch }).then(queue => {\n // these files don't fit so stop here\n if (exceedsMaxFiles(root, queue)) return false;\n\n // add items!\n root.dispatch('ADD_ITEMS', {\n items: queue,\n index: -1,\n interactionMethod: InteractionMethod.PASTE,\n });\n });\n };\n } else if (!enabled && root.ref.paster) {\n root.ref.paster.destroy();\n root.ref.paster = null;\n }\n};\n\n/**\n * Route actions\n */\nconst route$5 = createRoute({\n DID_SET_ALLOW_BROWSE: ({ root, props }) => {\n toggleBrowse(root, props);\n },\n DID_SET_ALLOW_DROP: ({ root }) => {\n toggleDrop(root);\n },\n DID_SET_ALLOW_PASTE: ({ root }) => {\n togglePaste(root);\n },\n DID_SET_DISABLED: ({ root, props }) => {\n toggleDrop(root);\n togglePaste(root);\n toggleBrowse(root, props);\n const isDisabled = root.query('GET_DISABLED');\n if (isDisabled) {\n root.element.dataset.disabled = 'disabled';\n } else {\n // delete root.element.dataset.disabled; <= this does not work on iOS 10\n root.element.removeAttribute('data-disabled');\n }\n },\n});\n\nconst root = createView({\n name: 'root',\n read: ({ root }) => {\n if (root.ref.measure) {\n root.ref.measureHeight = root.ref.measure.offsetHeight;\n }\n },\n create: create$e,\n write: write$9,\n destroy: ({ root }) => {\n if (root.ref.paster) {\n root.ref.paster.destroy();\n }\n if (root.ref.hopper) {\n root.ref.hopper.destroy();\n }\n root.element.removeEventListener('touchmove', prevent);\n root.element.removeEventListener('gesturestart', prevent);\n },\n mixins: {\n styles: ['height'],\n },\n});\n\n// creates the app\nconst createApp = (initialOptions = {}) => {\n // let element\n let originalElement = null;\n\n // get default options\n const defaultOptions = getOptions();\n\n // create the data store, this will contain all our app info\n const store = createStore(\n // initial state (should be serializable)\n createInitialState(defaultOptions),\n\n // queries\n [queries, createOptionQueries(defaultOptions)],\n\n // action handlers\n [actions, createOptionActions(defaultOptions)]\n );\n\n // set initial options\n store.dispatch('SET_OPTIONS', { options: initialOptions });\n\n // kick thread if visibility changes\n const visibilityHandler = () => {\n if (document.hidden) return;\n store.dispatch('KICK');\n };\n document.addEventListener('visibilitychange', visibilityHandler);\n\n // re-render on window resize start and finish\n let resizeDoneTimer = null;\n let isResizing = false;\n let isResizingHorizontally = false;\n let initialWindowWidth = null;\n let currentWindowWidth = null;\n const resizeHandler = () => {\n if (!isResizing) {\n isResizing = true;\n }\n clearTimeout(resizeDoneTimer);\n resizeDoneTimer = setTimeout(() => {\n isResizing = false;\n initialWindowWidth = null;\n currentWindowWidth = null;\n if (isResizingHorizontally) {\n isResizingHorizontally = false;\n store.dispatch('DID_STOP_RESIZE');\n }\n }, 500);\n };\n window.addEventListener('resize', resizeHandler);\n\n // render initial view\n const view = root(store, { id: getUniqueId() });\n\n //\n // PRIVATE API -------------------------------------------------------------------------------------\n //\n let isResting = false;\n let isHidden = false;\n\n const readWriteApi = {\n // necessary for update loop\n\n /**\n * Reads from dom (never call manually)\n * @private\n */\n _read: () => {\n // test if we're resizing horizontally\n // TODO: see if we can optimize this by measuring root rect\n if (isResizing) {\n currentWindowWidth = window.innerWidth;\n if (!initialWindowWidth) {\n initialWindowWidth = currentWindowWidth;\n }\n\n if (!isResizingHorizontally && currentWindowWidth !== initialWindowWidth) {\n store.dispatch('DID_START_RESIZE');\n isResizingHorizontally = true;\n }\n }\n\n if (isHidden && isResting) {\n // test if is no longer hidden\n isResting = view.element.offsetParent === null;\n }\n\n // if resting, no need to read as numbers will still all be correct\n if (isResting) return;\n\n // read view data\n view._read();\n\n // if is hidden we need to know so we exit rest mode when revealed\n isHidden = view.rect.element.hidden;\n },\n\n /**\n * Writes to dom (never call manually)\n * @private\n */\n _write: ts => {\n // get all actions from store\n const actions = store\n .processActionQueue()\n\n // filter out set actions (these will automatically trigger DID_SET)\n .filter(action => !/^SET_/.test(action.type));\n\n // if was idling and no actions stop here\n if (isResting && !actions.length) return;\n\n // some actions might trigger events\n routeActionsToEvents(actions);\n\n // update the view\n isResting = view._write(ts, actions, isResizingHorizontally);\n\n // will clean up all archived items\n removeReleasedItems(store.query('GET_ITEMS'));\n\n // now idling\n if (isResting) {\n store.processDispatchQueue();\n }\n },\n };\n\n //\n // EXPOSE EVENTS -------------------------------------------------------------------------------------\n //\n const createEvent = name => data => {\n // create default event\n const event = {\n type: name,\n };\n\n // no data to add\n if (!data) {\n return event;\n }\n\n // copy relevant props\n if (data.hasOwnProperty('error')) {\n event.error = data.error ? { ...data.error } : null;\n }\n\n if (data.status) {\n event.status = { ...data.status };\n }\n\n if (data.file) {\n event.output = data.file;\n }\n\n // only source is available, else add item if possible\n if (data.source) {\n event.file = data.source;\n } else if (data.item || data.id) {\n const item = data.item ? data.item : store.query('GET_ITEM', data.id);\n event.file = item ? createItemAPI(item) : null;\n }\n\n // map all items in a possible items array\n if (data.items) {\n event.items = data.items.map(createItemAPI);\n }\n\n // if this is a progress event add the progress amount\n if (/progress/.test(name)) {\n event.progress = data.progress;\n }\n\n // copy relevant props\n if (data.hasOwnProperty('origin') && data.hasOwnProperty('target')) {\n event.origin = data.origin;\n event.target = data.target;\n }\n\n return event;\n };\n\n const eventRoutes = {\n DID_DESTROY: createEvent('destroy'),\n\n DID_INIT: createEvent('init'),\n\n DID_THROW_MAX_FILES: createEvent('warning'),\n\n DID_INIT_ITEM: createEvent('initfile'),\n DID_START_ITEM_LOAD: createEvent('addfilestart'),\n DID_UPDATE_ITEM_LOAD_PROGRESS: createEvent('addfileprogress'),\n DID_LOAD_ITEM: createEvent('addfile'),\n\n DID_THROW_ITEM_INVALID: [createEvent('error'), createEvent('addfile')],\n\n DID_THROW_ITEM_LOAD_ERROR: [createEvent('error'), createEvent('addfile')],\n\n DID_THROW_ITEM_REMOVE_ERROR: [createEvent('error'), createEvent('removefile')],\n\n DID_PREPARE_OUTPUT: createEvent('preparefile'),\n\n DID_START_ITEM_PROCESSING: createEvent('processfilestart'),\n DID_UPDATE_ITEM_PROCESS_PROGRESS: createEvent('processfileprogress'),\n DID_ABORT_ITEM_PROCESSING: createEvent('processfileabort'),\n DID_COMPLETE_ITEM_PROCESSING: createEvent('processfile'),\n DID_COMPLETE_ITEM_PROCESSING_ALL: createEvent('processfiles'),\n DID_REVERT_ITEM_PROCESSING: createEvent('processfilerevert'),\n\n DID_THROW_ITEM_PROCESSING_ERROR: [createEvent('error'), createEvent('processfile')],\n\n DID_REMOVE_ITEM: createEvent('removefile'),\n\n DID_UPDATE_ITEMS: createEvent('updatefiles'),\n\n DID_ACTIVATE_ITEM: createEvent('activatefile'),\n\n DID_REORDER_ITEMS: createEvent('reorderfiles'),\n };\n\n const exposeEvent = event => {\n // create event object to be dispatched\n const detail = { pond: exports, ...event };\n delete detail.type;\n view.element.dispatchEvent(\n new CustomEvent(`FilePond:${event.type}`, {\n // event info\n detail,\n\n // event behaviour\n bubbles: true,\n cancelable: true,\n composed: true, // triggers listeners outside of shadow root\n })\n );\n\n // event object to params used for `on()` event handlers and callbacks `oninit()`\n const params = [];\n\n // if is possible error event, make it the first param\n if (event.hasOwnProperty('error')) {\n params.push(event.error);\n }\n\n // file is always section\n if (event.hasOwnProperty('file')) {\n params.push(event.file);\n }\n\n // append other props\n const filtered = ['type', 'error', 'file'];\n Object.keys(event)\n .filter(key => !filtered.includes(key))\n .forEach(key => params.push(event[key]));\n\n // on(type, () => { })\n exports.fire(event.type, ...params);\n\n // oninit = () => {}\n const handler = store.query(`GET_ON${event.type.toUpperCase()}`);\n if (handler) {\n handler(...params);\n }\n };\n\n const routeActionsToEvents = actions => {\n if (!actions.length) return;\n actions\n .filter(action => eventRoutes[action.type])\n .forEach(action => {\n const routes = eventRoutes[action.type];\n (Array.isArray(routes) ? routes : [routes]).forEach(route => {\n // this isn't fantastic, but because of the stacking of settimeouts plugins can handle the did_load before the did_init\n if (action.type === 'DID_INIT_ITEM') {\n exposeEvent(route(action.data));\n } else {\n setTimeout(() => {\n exposeEvent(route(action.data));\n }, 0);\n }\n });\n });\n };\n\n //\n // PUBLIC API -------------------------------------------------------------------------------------\n //\n const setOptions = options => store.dispatch('SET_OPTIONS', { options });\n\n const getFile = query => store.query('GET_ACTIVE_ITEM', query);\n\n const prepareFile = query =>\n new Promise((resolve, reject) => {\n store.dispatch('REQUEST_ITEM_PREPARE', {\n query,\n success: item => {\n resolve(item);\n },\n failure: error => {\n reject(error);\n },\n });\n });\n\n const addFile = (source, options = {}) =>\n new Promise((resolve, reject) => {\n addFiles([{ source, options }], { index: options.index })\n .then(items => resolve(items && items[0]))\n .catch(reject);\n });\n\n const isFilePondFile = obj => obj.file && obj.id;\n\n const removeFile = (query, options) => {\n // if only passed options\n if (typeof query === 'object' && !isFilePondFile(query) && !options) {\n options = query;\n query = undefined;\n }\n\n // request item removal\n store.dispatch('REMOVE_ITEM', { ...options, query });\n\n // see if item has been removed\n return store.query('GET_ACTIVE_ITEM', query) === null;\n };\n\n const addFiles = (...args) =>\n new Promise((resolve, reject) => {\n const sources = [];\n const options = {};\n\n // user passed a sources array\n if (isArray(args[0])) {\n sources.push.apply(sources, args[0]);\n Object.assign(options, args[1] || {});\n } else {\n // user passed sources as arguments, last one might be options object\n const lastArgument = args[args.length - 1];\n if (typeof lastArgument === 'object' && !(lastArgument instanceof Blob)) {\n Object.assign(options, args.pop());\n }\n\n // add rest to sources\n sources.push(...args);\n }\n\n store.dispatch('ADD_ITEMS', {\n items: sources,\n index: options.index,\n interactionMethod: InteractionMethod.API,\n success: resolve,\n failure: reject,\n });\n });\n\n const getFiles = () => store.query('GET_ACTIVE_ITEMS');\n\n const processFile = query =>\n new Promise((resolve, reject) => {\n store.dispatch('REQUEST_ITEM_PROCESSING', {\n query,\n success: item => {\n resolve(item);\n },\n failure: error => {\n reject(error);\n },\n });\n });\n\n const prepareFiles = (...args) => {\n const queries = Array.isArray(args[0]) ? args[0] : args;\n const items = queries.length ? queries : getFiles();\n return Promise.all(items.map(prepareFile));\n };\n\n const processFiles = (...args) => {\n const queries = Array.isArray(args[0]) ? args[0] : args;\n if (!queries.length) {\n const files = getFiles().filter(\n item =>\n !(item.status === ItemStatus.IDLE && item.origin === FileOrigin.LOCAL) &&\n item.status !== ItemStatus.PROCESSING &&\n item.status !== ItemStatus.PROCESSING_COMPLETE &&\n item.status !== ItemStatus.PROCESSING_REVERT_ERROR\n );\n return Promise.all(files.map(processFile));\n }\n return Promise.all(queries.map(processFile));\n };\n\n const removeFiles = (...args) => {\n const queries = Array.isArray(args[0]) ? args[0] : args;\n\n let options;\n if (typeof queries[queries.length - 1] === 'object') {\n options = queries.pop();\n } else if (Array.isArray(args[0])) {\n options = args[1];\n }\n\n const files = getFiles();\n\n if (!queries.length) return Promise.all(files.map(file => removeFile(file, options)));\n\n // when removing by index the indexes shift after each file removal so we need to convert indexes to ids\n const mappedQueries = queries\n .map(query => (isNumber(query) ? (files[query] ? files[query].id : null) : query))\n .filter(query => query);\n\n return mappedQueries.map(q => removeFile(q, options));\n };\n\n const exports = {\n // supports events\n ...on(),\n\n // inject private api methods\n ...readWriteApi,\n\n // inject all getters and setters\n ...createOptionAPI(store, defaultOptions),\n\n /**\n * Override options defined in options object\n * @param options\n */\n setOptions,\n\n /**\n * Load the given file\n * @param source - the source of the file (either a File, base64 data uri or url)\n * @param options - object, { index: 0 }\n */\n addFile,\n\n /**\n * Load the given files\n * @param sources - the sources of the files to load\n * @param options - object, { index: 0 }\n */\n addFiles,\n\n /**\n * Returns the file objects matching the given query\n * @param query { string, number, null }\n */\n getFile,\n\n /**\n * Upload file with given name\n * @param query { string, number, null }\n */\n processFile,\n\n /**\n * Request prepare output for file with given name\n * @param query { string, number, null }\n */\n prepareFile,\n\n /**\n * Removes a file by its name\n * @param query { string, number, null }\n */\n removeFile,\n\n /**\n * Moves a file to a new location in the files list\n */\n moveFile: (query, index) => store.dispatch('MOVE_ITEM', { query, index }),\n\n /**\n * Returns all files (wrapped in public api)\n */\n getFiles,\n\n /**\n * Starts uploading all files\n */\n processFiles,\n\n /**\n * Clears all files from the files list\n */\n removeFiles,\n\n /**\n * Starts preparing output of all files\n */\n prepareFiles,\n\n /**\n * Sort list of files\n */\n sort: compare => store.dispatch('SORT', { compare }),\n\n /**\n * Browse the file system for a file\n */\n browse: () => {\n // needs to be trigger directly as user action needs to be traceable (is not traceable in requestAnimationFrame)\n var input = view.element.querySelector('input[type=file]');\n if (input) {\n input.click();\n }\n },\n\n /**\n * Destroys the app\n */\n destroy: () => {\n // request destruction\n exports.fire('destroy', view.element);\n\n // stop active processes (file uploads, fetches, stuff like that)\n // loop over items and depending on states call abort for ongoing processes\n store.dispatch('ABORT_ALL');\n\n // destroy view\n view._destroy();\n\n // stop listening to resize\n window.removeEventListener('resize', resizeHandler);\n\n // stop listening to the visiblitychange event\n document.removeEventListener('visibilitychange', visibilityHandler);\n\n // dispatch destroy\n store.dispatch('DID_DESTROY');\n },\n\n /**\n * Inserts the plugin before the target element\n */\n insertBefore: element => insertBefore(view.element, element),\n\n /**\n * Inserts the plugin after the target element\n */\n insertAfter: element => insertAfter(view.element, element),\n\n /**\n * Appends the plugin to the target element\n */\n appendTo: element => element.appendChild(view.element),\n\n /**\n * Replaces an element with the app\n */\n replaceElement: element => {\n // insert the app before the element\n insertBefore(view.element, element);\n\n // remove the original element\n element.parentNode.removeChild(element);\n\n // remember original element\n originalElement = element;\n },\n\n /**\n * Restores the original element\n */\n restoreElement: () => {\n if (!originalElement) {\n return; // no element to restore\n }\n\n // restore original element\n insertAfter(originalElement, view.element);\n\n // remove our element\n view.element.parentNode.removeChild(view.element);\n\n // remove reference\n originalElement = null;\n },\n\n /**\n * Returns true if the app root is attached to given element\n * @param element\n */\n isAttachedTo: element => view.element === element || originalElement === element,\n\n /**\n * Returns the root element\n */\n element: {\n get: () => view.element,\n },\n\n /**\n * Returns the current pond status\n */\n status: {\n get: () => store.query('GET_STATUS'),\n },\n };\n\n // Done!\n store.dispatch('DID_INIT');\n\n // create actual api object\n return createObject(exports);\n};\n\nconst createAppObject = (customOptions = {}) => {\n // default options\n const defaultOptions = {};\n forin(getOptions(), (key, value) => {\n defaultOptions[key] = value[0];\n });\n\n // set app options\n const app = createApp({\n // default options\n ...defaultOptions,\n\n // custom options\n ...customOptions,\n });\n\n // return the plugin instance\n return app;\n};\n\nconst lowerCaseFirstLetter = string => string.charAt(0).toLowerCase() + string.slice(1);\n\nconst attributeNameToPropertyName = attributeName => toCamels(attributeName.replace(/^data-/, ''));\n\nconst mapObject = (object, propertyMap) => {\n // remove unwanted\n forin(propertyMap, (selector, mapping) => {\n forin(object, (property, value) => {\n // create regexp shortcut\n const selectorRegExp = new RegExp(selector);\n\n // tests if\n const matches = selectorRegExp.test(property);\n\n // no match, skip\n if (!matches) {\n return;\n }\n\n // if there's a mapping, the original property is always removed\n delete object[property];\n\n // should only remove, we done!\n if (mapping === false) {\n return;\n }\n\n // move value to new property\n if (isString(mapping)) {\n object[mapping] = value;\n return;\n }\n\n // move to group\n const group = mapping.group;\n if (isObject(mapping) && !object[group]) {\n object[group] = {};\n }\n\n object[group][lowerCaseFirstLetter(property.replace(selectorRegExp, ''))] = value;\n });\n\n // do submapping\n if (mapping.mapping) {\n mapObject(object[mapping.group], mapping.mapping);\n }\n });\n};\n\nconst getAttributesAsObject = (node, attributeMapping = {}) => {\n // turn attributes into object\n const attributes = [];\n forin(node.attributes, index => {\n attributes.push(node.attributes[index]);\n });\n\n const output = attributes\n .filter(attribute => attribute.name)\n .reduce((obj, attribute) => {\n const value = attr(node, attribute.name);\n\n obj[attributeNameToPropertyName(attribute.name)] =\n value === attribute.name ? true : value;\n return obj;\n }, {});\n\n // do mapping of object properties\n mapObject(output, attributeMapping);\n\n return output;\n};\n\nconst createAppAtElement = (element, options = {}) => {\n // how attributes of the input element are mapped to the options for the plugin\n const attributeMapping = {\n // translate to other name\n '^class$': 'className',\n '^multiple$': 'allowMultiple',\n '^capture$': 'captureMethod',\n '^webkitdirectory$': 'allowDirectoriesOnly',\n\n // group under single property\n '^server': {\n group: 'server',\n mapping: {\n '^process': {\n group: 'process',\n },\n '^revert': {\n group: 'revert',\n },\n '^fetch': {\n group: 'fetch',\n },\n '^restore': {\n group: 'restore',\n },\n '^load': {\n group: 'load',\n },\n },\n },\n\n // don't include in object\n '^type$': false,\n '^files$': false,\n };\n\n // add additional option translators\n applyFilters('SET_ATTRIBUTE_TO_OPTION_MAP', attributeMapping);\n\n // create final options object by setting options object and then overriding options supplied on element\n const mergedOptions = {\n ...options,\n };\n\n const attributeOptions = getAttributesAsObject(\n element.nodeName === 'FIELDSET' ? element.querySelector('input[type=file]') : element,\n attributeMapping\n );\n\n // merge with options object\n Object.keys(attributeOptions).forEach(key => {\n if (isObject(attributeOptions[key])) {\n if (!isObject(mergedOptions[key])) {\n mergedOptions[key] = {};\n }\n Object.assign(mergedOptions[key], attributeOptions[key]);\n } else {\n mergedOptions[key] = attributeOptions[key];\n }\n });\n\n // if parent is a fieldset, get files from parent by selecting all input fields that are not file upload fields\n // these will then be automatically set to the initial files\n mergedOptions.files = (options.files || []).concat(\n Array.from(element.querySelectorAll('input:not([type=file])')).map(input => ({\n source: input.value,\n options: {\n type: input.dataset.type,\n },\n }))\n );\n\n // build plugin\n const app = createAppObject(mergedOptions);\n\n // add already selected files\n if (element.files) {\n Array.from(element.files).forEach(file => {\n app.addFile(file);\n });\n }\n\n // replace the target element\n app.replaceElement(element);\n\n // expose\n return app;\n};\n\n// if an element is passed, we create the instance at that element, if not, we just create an up object\nconst createApp$1 = (...args) =>\n isNode(args[0]) ? createAppAtElement(...args) : createAppObject(...args);\n\nconst PRIVATE_METHODS = ['fire', '_read', '_write'];\n\nconst createAppAPI = app => {\n const api = {};\n\n copyObjectPropertiesToObject(app, api, PRIVATE_METHODS);\n\n return api;\n};\n\n/**\n * Replaces placeholders in given string with replacements\n * @param string - \"Foo {bar}\"\"\n * @param replacements - { \"bar\": 10 }\n */\nconst replaceInString = (string, replacements) =>\n string.replace(/(?:{([a-zA-Z]+)})/g, (match, group) => replacements[group]);\n\nconst createWorker = fn => {\n const workerBlob = new Blob(['(', fn.toString(), ')()'], {\n type: 'application/javascript',\n });\n const workerURL = URL.createObjectURL(workerBlob);\n const worker = new Worker(workerURL);\n\n return {\n transfer: (message, cb) => {},\n post: (message, cb, transferList) => {\n const id = getUniqueId();\n\n worker.onmessage = e => {\n if (e.data.id === id) {\n cb(e.data.message);\n }\n };\n\n worker.postMessage(\n {\n id,\n message,\n },\n transferList\n );\n },\n terminate: () => {\n worker.terminate();\n URL.revokeObjectURL(workerURL);\n },\n };\n};\n\nconst loadImage = url =>\n new Promise((resolve, reject) => {\n const img = new Image();\n img.onload = () => {\n resolve(img);\n };\n img.onerror = e => {\n reject(e);\n };\n img.src = url;\n });\n\nconst renameFile = (file, name) => {\n const renamedFile = file.slice(0, file.size, file.type);\n renamedFile.lastModifiedDate = file.lastModifiedDate;\n renamedFile.name = name;\n return renamedFile;\n};\n\nconst copyFile = file => renameFile(file, file.name);\n\n// already registered plugins (can't register twice)\nconst registeredPlugins = [];\n\n// pass utils to plugin\nconst createAppPlugin = plugin => {\n // already registered\n if (registeredPlugins.includes(plugin)) {\n return;\n }\n\n // remember this plugin\n registeredPlugins.push(plugin);\n\n // setup!\n const pluginOutline = plugin({\n addFilter,\n utils: {\n Type,\n forin,\n isString,\n isFile,\n toNaturalFileSize,\n replaceInString,\n getExtensionFromFilename,\n getFilenameWithoutExtension,\n guesstimateMimeType,\n getFileFromBlob,\n getFilenameFromURL,\n createRoute,\n createWorker,\n createView,\n createItemAPI,\n loadImage,\n copyFile,\n renameFile,\n createBlob,\n applyFilterChain,\n text,\n getNumericAspectRatioFromString,\n },\n views: {\n fileActionButton,\n },\n });\n\n // add plugin options to default options\n extendDefaultOptions(pluginOutline.options);\n};\n\n// feature detection used by supported() method\nconst isOperaMini = () => Object.prototype.toString.call(window.operamini) === '[object OperaMini]';\nconst hasPromises = () => 'Promise' in window;\nconst hasBlobSlice = () => 'slice' in Blob.prototype;\nconst hasCreateObjectURL = () => 'URL' in window && 'createObjectURL' in window.URL;\nconst hasVisibility = () => 'visibilityState' in document;\nconst hasTiming = () => 'performance' in window; // iOS 8.x\nconst hasCSSSupports = () => 'supports' in (window.CSS || {}); // use to detect Safari 9+\nconst isIE11 = () => /MSIE|Trident/.test(window.navigator.userAgent);\n\nconst supported = (() => {\n // Runs immediately and then remembers result for subsequent calls\n const isSupported =\n // Has to be a browser\n isBrowser() &&\n // Can't run on Opera Mini due to lack of everything\n !isOperaMini() &&\n // Require these APIs to feature detect a modern browser\n hasVisibility() &&\n hasPromises() &&\n hasBlobSlice() &&\n hasCreateObjectURL() &&\n hasTiming() &&\n // doesn't need CSSSupports but is a good way to detect Safari 9+ (we do want to support IE11 though)\n (hasCSSSupports() || isIE11());\n\n return () => isSupported;\n})();\n\n/**\n * Plugin internal state (over all instances)\n */\nconst state = {\n // active app instances, used to redraw the apps and to find the later\n apps: [],\n};\n\n// plugin name\nconst name = 'filepond';\n\n/**\n * Public Plugin methods\n */\nconst fn = () => {};\nlet Status$1 = {};\nlet FileStatus = {};\nlet FileOrigin$1 = {};\nlet OptionTypes = {};\nlet create$f = fn;\nlet destroy = fn;\nlet parse = fn;\nlet find = fn;\nlet registerPlugin = fn;\nlet getOptions$1 = fn;\nlet setOptions$1 = fn;\n\n// if not supported, no API\nif (supported()) {\n // start painter and fire load event\n createPainter(\n () => {\n state.apps.forEach(app => app._read());\n },\n ts => {\n state.apps.forEach(app => app._write(ts));\n }\n );\n\n // fire loaded event so we know when FilePond is available\n const dispatch = () => {\n // let others know we have area ready\n document.dispatchEvent(\n new CustomEvent('FilePond:loaded', {\n detail: {\n supported,\n create: create$f,\n destroy,\n parse,\n find,\n registerPlugin,\n setOptions: setOptions$1,\n },\n })\n );\n\n // clean up event\n document.removeEventListener('DOMContentLoaded', dispatch);\n };\n\n if (document.readyState !== 'loading') {\n // move to back of execution queue, FilePond should have been exported by then\n setTimeout(() => dispatch(), 0);\n } else {\n document.addEventListener('DOMContentLoaded', dispatch);\n }\n\n // updates the OptionTypes object based on the current options\n const updateOptionTypes = () =>\n forin(getOptions(), (key, value) => {\n OptionTypes[key] = value[1];\n });\n\n Status$1 = { ...Status };\n FileOrigin$1 = { ...FileOrigin };\n FileStatus = { ...ItemStatus };\n\n OptionTypes = {};\n updateOptionTypes();\n\n // create method, creates apps and adds them to the app array\n create$f = (...args) => {\n const app = createApp$1(...args);\n app.on('destroy', destroy);\n state.apps.push(app);\n return createAppAPI(app);\n };\n\n // destroys apps and removes them from the app array\n destroy = hook => {\n // returns true if the app was destroyed successfully\n const indexToRemove = state.apps.findIndex(app => app.isAttachedTo(hook));\n if (indexToRemove >= 0) {\n // remove from apps\n const app = state.apps.splice(indexToRemove, 1)[0];\n\n // restore original dom element\n app.restoreElement();\n\n return true;\n }\n\n return false;\n };\n\n // parses the given context for plugins (does not include the context element itself)\n parse = context => {\n // get all possible hooks\n const matchedHooks = Array.from(context.querySelectorAll(`.${name}`));\n\n // filter out already active hooks\n const newHooks = matchedHooks.filter(\n newHook => !state.apps.find(app => app.isAttachedTo(newHook))\n );\n\n // create new instance for each hook\n return newHooks.map(hook => create$f(hook));\n };\n\n // returns an app based on the given element hook\n find = hook => {\n const app = state.apps.find(app => app.isAttachedTo(hook));\n if (!app) {\n return null;\n }\n return createAppAPI(app);\n };\n\n // adds a plugin extension\n registerPlugin = (...plugins) => {\n // register plugins\n plugins.forEach(createAppPlugin);\n\n // update OptionTypes, each plugin might have extended the default options\n updateOptionTypes();\n };\n\n getOptions$1 = () => {\n const opts = {};\n forin(getOptions(), (key, value) => {\n opts[key] = value[0];\n });\n return opts;\n };\n\n setOptions$1 = opts => {\n if (isObject(opts)) {\n // update existing plugins\n state.apps.forEach(app => {\n app.setOptions(opts);\n });\n\n // override defaults\n setOptions(opts);\n }\n\n // return new options\n return getOptions$1();\n };\n}\n\nexport {\n FileOrigin$1 as FileOrigin,\n FileStatus,\n OptionTypes,\n Status$1 as Status,\n create$f as create,\n destroy,\n find,\n getOptions$1 as getOptions,\n parse,\n registerPlugin,\n setOptions$1 as setOptions,\n supported,\n};\n","/*!\n * FilePondPluginImagePreview 4.6.12\n * Licensed under MIT, https://opensource.org/licenses/MIT/\n * Please visit https://pqina.nl/filepond/ for details.\n */\n\n/* eslint-disable */\n\n// test if file is of type image and can be viewed in canvas\nconst isPreviewableImage = file => /^image/.test(file.type);\n\nconst vectorMultiply = (v, amount) => createVector(v.x * amount, v.y * amount);\n\nconst vectorAdd = (a, b) => createVector(a.x + b.x, a.y + b.y);\n\nconst vectorNormalize = v => {\n const l = Math.sqrt(v.x * v.x + v.y * v.y);\n if (l === 0) {\n return {\n x: 0,\n y: 0\n };\n }\n return createVector(v.x / l, v.y / l);\n};\n\nconst vectorRotate = (v, radians, origin) => {\n const cos = Math.cos(radians);\n const sin = Math.sin(radians);\n const t = createVector(v.x - origin.x, v.y - origin.y);\n return createVector(\n origin.x + cos * t.x - sin * t.y,\n origin.y + sin * t.x + cos * t.y\n );\n};\n\nconst createVector = (x = 0, y = 0) => ({ x, y });\n\nconst getMarkupValue = (value, size, scalar = 1, axis) => {\n if (typeof value === 'string') {\n return parseFloat(value) * scalar;\n }\n if (typeof value === 'number') {\n return value * (axis ? size[axis] : Math.min(size.width, size.height));\n }\n return;\n};\n\nconst getMarkupStyles = (markup, size, scale) => {\n const lineStyle = markup.borderStyle || markup.lineStyle || 'solid';\n const fill = markup.backgroundColor || markup.fontColor || 'transparent';\n const stroke = markup.borderColor || markup.lineColor || 'transparent';\n const strokeWidth = getMarkupValue(\n markup.borderWidth || markup.lineWidth,\n size,\n scale\n );\n const lineCap = markup.lineCap || 'round';\n const lineJoin = markup.lineJoin || 'round';\n const dashes =\n typeof lineStyle === 'string'\n ? ''\n : lineStyle.map(v => getMarkupValue(v, size, scale)).join(',');\n const opacity = markup.opacity || 1;\n return {\n 'stroke-linecap': lineCap,\n 'stroke-linejoin': lineJoin,\n 'stroke-width': strokeWidth || 0,\n 'stroke-dasharray': dashes,\n stroke,\n fill,\n opacity\n };\n};\n\nconst isDefined = value => value != null;\n\nconst getMarkupRect = (rect, size, scalar = 1) => {\n let left =\n getMarkupValue(rect.x, size, scalar, 'width') ||\n getMarkupValue(rect.left, size, scalar, 'width');\n let top =\n getMarkupValue(rect.y, size, scalar, 'height') ||\n getMarkupValue(rect.top, size, scalar, 'height');\n let width = getMarkupValue(rect.width, size, scalar, 'width');\n let height = getMarkupValue(rect.height, size, scalar, 'height');\n let right = getMarkupValue(rect.right, size, scalar, 'width');\n let bottom = getMarkupValue(rect.bottom, size, scalar, 'height');\n\n if (!isDefined(top)) {\n if (isDefined(height) && isDefined(bottom)) {\n top = size.height - height - bottom;\n } else {\n top = bottom;\n }\n }\n\n if (!isDefined(left)) {\n if (isDefined(width) && isDefined(right)) {\n left = size.width - width - right;\n } else {\n left = right;\n }\n }\n\n if (!isDefined(width)) {\n if (isDefined(left) && isDefined(right)) {\n width = size.width - left - right;\n } else {\n width = 0;\n }\n }\n\n if (!isDefined(height)) {\n if (isDefined(top) && isDefined(bottom)) {\n height = size.height - top - bottom;\n } else {\n height = 0;\n }\n }\n\n return {\n x: left || 0,\n y: top || 0,\n width: width || 0,\n height: height || 0\n };\n};\n\nconst pointsToPathShape = points =>\n points\n .map((point, index) => `${index === 0 ? 'M' : 'L'} ${point.x} ${point.y}`)\n .join(' ');\n\nconst setAttributes = (element, attr) =>\n Object.keys(attr).forEach(key => element.setAttribute(key, attr[key]));\n\nconst ns = 'http://www.w3.org/2000/svg';\nconst svg = (tag, attr) => {\n const element = document.createElementNS(ns, tag);\n if (attr) {\n setAttributes(element, attr);\n }\n return element;\n};\n\nconst updateRect = element =>\n setAttributes(element, {\n ...element.rect,\n ...element.styles\n });\n\nconst updateEllipse = element => {\n const cx = element.rect.x + element.rect.width * 0.5;\n const cy = element.rect.y + element.rect.height * 0.5;\n const rx = element.rect.width * 0.5;\n const ry = element.rect.height * 0.5;\n return setAttributes(element, {\n cx,\n cy,\n rx,\n ry,\n ...element.styles\n });\n};\n\nconst IMAGE_FIT_STYLE = {\n contain: 'xMidYMid meet',\n cover: 'xMidYMid slice'\n};\n\nconst updateImage = (element, markup) => {\n setAttributes(element, {\n ...element.rect,\n ...element.styles,\n preserveAspectRatio: IMAGE_FIT_STYLE[markup.fit] || 'none'\n });\n};\n\nconst TEXT_ANCHOR = {\n left: 'start',\n center: 'middle',\n right: 'end'\n};\n\nconst updateText = (element, markup, size, scale) => {\n const fontSize = getMarkupValue(markup.fontSize, size, scale);\n const fontFamily = markup.fontFamily || 'sans-serif';\n const fontWeight = markup.fontWeight || 'normal';\n const textAlign = TEXT_ANCHOR[markup.textAlign] || 'start';\n\n setAttributes(element, {\n ...element.rect,\n ...element.styles,\n 'stroke-width': 0,\n 'font-weight': fontWeight,\n 'font-size': fontSize,\n 'font-family': fontFamily,\n 'text-anchor': textAlign\n });\n\n // update text\n if (element.text !== markup.text) {\n element.text = markup.text;\n element.textContent = markup.text.length ? markup.text : ' ';\n }\n};\n\nconst updateLine = (element, markup, size, scale) => {\n setAttributes(element, {\n ...element.rect,\n ...element.styles,\n fill: 'none'\n });\n\n const line = element.childNodes[0];\n const begin = element.childNodes[1];\n const end = element.childNodes[2];\n\n const origin = element.rect;\n\n const target = {\n x: element.rect.x + element.rect.width,\n y: element.rect.y + element.rect.height\n };\n\n setAttributes(line, {\n x1: origin.x,\n y1: origin.y,\n x2: target.x,\n y2: target.y\n });\n\n if (!markup.lineDecoration) return;\n\n begin.style.display = 'none';\n end.style.display = 'none';\n\n const v = vectorNormalize({\n x: target.x - origin.x,\n y: target.y - origin.y\n });\n\n const l = getMarkupValue(0.05, size, scale);\n\n if (markup.lineDecoration.indexOf('arrow-begin') !== -1) {\n const arrowBeginRotationPoint = vectorMultiply(v, l);\n const arrowBeginCenter = vectorAdd(origin, arrowBeginRotationPoint);\n const arrowBeginA = vectorRotate(origin, 2, arrowBeginCenter);\n const arrowBeginB = vectorRotate(origin, -2, arrowBeginCenter);\n\n setAttributes(begin, {\n style: 'display:block;',\n d: `M${arrowBeginA.x},${arrowBeginA.y} L${origin.x},${origin.y} L${\n arrowBeginB.x\n },${arrowBeginB.y}`\n });\n }\n\n if (markup.lineDecoration.indexOf('arrow-end') !== -1) {\n const arrowEndRotationPoint = vectorMultiply(v, -l);\n const arrowEndCenter = vectorAdd(target, arrowEndRotationPoint);\n const arrowEndA = vectorRotate(target, 2, arrowEndCenter);\n const arrowEndB = vectorRotate(target, -2, arrowEndCenter);\n\n setAttributes(end, {\n style: 'display:block;',\n d: `M${arrowEndA.x},${arrowEndA.y} L${target.x},${target.y} L${\n arrowEndB.x\n },${arrowEndB.y}`\n });\n }\n};\n\nconst updatePath = (element, markup, size, scale) => {\n setAttributes(element, {\n ...element.styles,\n fill: 'none',\n d: pointsToPathShape(\n markup.points.map(point => ({\n x: getMarkupValue(point.x, size, scale, 'width'),\n y: getMarkupValue(point.y, size, scale, 'height')\n }))\n )\n });\n};\n\nconst createShape = node => markup => svg(node, { id: markup.id });\n\nconst createImage = markup => {\n const shape = svg('image', {\n id: markup.id,\n 'stroke-linecap': 'round',\n 'stroke-linejoin': 'round',\n opacity: '0'\n });\n shape.onload = () => {\n shape.setAttribute('opacity', markup.opacity || 1);\n };\n shape.setAttributeNS(\n 'http://www.w3.org/1999/xlink',\n 'xlink:href',\n markup.src\n );\n return shape;\n};\n\nconst createLine = markup => {\n const shape = svg('g', {\n id: markup.id,\n 'stroke-linecap': 'round',\n 'stroke-linejoin': 'round'\n });\n\n const line = svg('line');\n shape.appendChild(line);\n\n const begin = svg('path');\n shape.appendChild(begin);\n\n const end = svg('path');\n shape.appendChild(end);\n\n return shape;\n};\n\nconst CREATE_TYPE_ROUTES = {\n image: createImage,\n rect: createShape('rect'),\n ellipse: createShape('ellipse'),\n text: createShape('text'),\n path: createShape('path'),\n line: createLine\n};\n\nconst UPDATE_TYPE_ROUTES = {\n rect: updateRect,\n ellipse: updateEllipse,\n image: updateImage,\n text: updateText,\n path: updatePath,\n line: updateLine\n};\n\nconst createMarkupByType = (type, markup) => CREATE_TYPE_ROUTES[type](markup);\n\nconst updateMarkupByType = (element, type, markup, size, scale) => {\n if (type !== 'path') {\n element.rect = getMarkupRect(markup, size, scale);\n }\n element.styles = getMarkupStyles(markup, size, scale);\n UPDATE_TYPE_ROUTES[type](element, markup, size, scale);\n};\n\nconst MARKUP_RECT = [\n 'x',\n 'y',\n 'left',\n 'top',\n 'right',\n 'bottom',\n 'width',\n 'height'\n];\n\nconst toOptionalFraction = value =>\n typeof value === 'string' && /%/.test(value)\n ? parseFloat(value) / 100\n : value;\n\n// adds default markup properties, clones markup\nconst prepareMarkup = markup => {\n const [type, props] = markup;\n\n const rect = props.points\n ? {}\n : MARKUP_RECT.reduce((prev, curr) => {\n prev[curr] = toOptionalFraction(props[curr]);\n return prev;\n }, {});\n\n return [\n type,\n {\n zIndex: 0,\n ...props,\n ...rect\n }\n ];\n};\n\nconst sortMarkupByZIndex = (a, b) => {\n if (a[1].zIndex > b[1].zIndex) {\n return 1;\n }\n if (a[1].zIndex < b[1].zIndex) {\n return -1;\n }\n return 0;\n};\n\nconst createMarkupView = _ =>\n _.utils.createView({\n name: 'image-preview-markup',\n tag: 'svg',\n ignoreRect: true,\n mixins: {\n apis: ['width', 'height', 'crop', 'markup', 'resize', 'dirty']\n },\n write: ({ root, props }) => {\n if (!props.dirty) return;\n\n const { crop, resize, markup } = props;\n\n const viewWidth = props.width;\n const viewHeight = props.height;\n\n let cropWidth = crop.width;\n let cropHeight = crop.height;\n\n if (resize) {\n const { size } = resize;\n\n let outputWidth = size && size.width;\n let outputHeight = size && size.height;\n const outputFit = resize.mode;\n const outputUpscale = resize.upscale;\n\n if (outputWidth && !outputHeight) outputHeight = outputWidth;\n if (outputHeight && !outputWidth) outputWidth = outputHeight;\n\n const shouldUpscale =\n cropWidth < outputWidth && cropHeight < outputHeight;\n\n if (!shouldUpscale || (shouldUpscale && outputUpscale)) {\n let scalarWidth = outputWidth / cropWidth;\n let scalarHeight = outputHeight / cropHeight;\n\n if (outputFit === 'force') {\n cropWidth = outputWidth;\n cropHeight = outputHeight;\n } else {\n let scalar;\n if (outputFit === 'cover') {\n scalar = Math.max(scalarWidth, scalarHeight);\n } else if (outputFit === 'contain') {\n scalar = Math.min(scalarWidth, scalarHeight);\n }\n cropWidth = cropWidth * scalar;\n cropHeight = cropHeight * scalar;\n }\n }\n }\n\n const size = {\n width: viewWidth,\n height: viewHeight\n };\n\n root.element.setAttribute('width', size.width);\n root.element.setAttribute('height', size.height);\n\n const scale = Math.min(viewWidth / cropWidth, viewHeight / cropHeight);\n\n // clear\n root.element.innerHTML = '';\n\n // get filter\n const markupFilter = root.query('GET_IMAGE_PREVIEW_MARKUP_FILTER');\n\n // draw new\n markup\n .filter(markupFilter)\n .map(prepareMarkup)\n .sort(sortMarkupByZIndex)\n .forEach(markup => {\n const [type, settings] = markup;\n\n // create\n const element = createMarkupByType(type, settings);\n\n // update\n updateMarkupByType(element, type, settings, size, scale);\n\n // add\n root.element.appendChild(element);\n });\n }\n });\n\nconst createVector$1 = (x, y) => ({ x, y });\n\nconst vectorDot = (a, b) => a.x * b.x + a.y * b.y;\n\nconst vectorSubtract = (a, b) => createVector$1(a.x - b.x, a.y - b.y);\n\nconst vectorDistanceSquared = (a, b) =>\n vectorDot(vectorSubtract(a, b), vectorSubtract(a, b));\n\nconst vectorDistance = (a, b) => Math.sqrt(vectorDistanceSquared(a, b));\n\nconst getOffsetPointOnEdge = (length, rotation) => {\n const a = length;\n\n const A = 1.5707963267948966;\n const B = rotation;\n const C = 1.5707963267948966 - rotation;\n\n const sinA = Math.sin(A);\n const sinB = Math.sin(B);\n const sinC = Math.sin(C);\n const cosC = Math.cos(C);\n const ratio = a / sinA;\n const b = ratio * sinB;\n const c = ratio * sinC;\n\n return createVector$1(cosC * b, cosC * c);\n};\n\nconst getRotatedRectSize = (rect, rotation) => {\n const w = rect.width;\n const h = rect.height;\n\n const hor = getOffsetPointOnEdge(w, rotation);\n const ver = getOffsetPointOnEdge(h, rotation);\n\n const tl = createVector$1(rect.x + Math.abs(hor.x), rect.y - Math.abs(hor.y));\n\n const tr = createVector$1(\n rect.x + rect.width + Math.abs(ver.y),\n rect.y + Math.abs(ver.x)\n );\n\n const bl = createVector$1(\n rect.x - Math.abs(ver.y),\n rect.y + rect.height - Math.abs(ver.x)\n );\n\n return {\n width: vectorDistance(tl, tr),\n height: vectorDistance(tl, bl)\n };\n};\n\nconst calculateCanvasSize = (image, canvasAspectRatio, zoom = 1) => {\n const imageAspectRatio = image.height / image.width;\n\n // determine actual pixels on x and y axis\n let canvasWidth = 1;\n let canvasHeight = canvasAspectRatio;\n let imgWidth = 1;\n let imgHeight = imageAspectRatio;\n if (imgHeight > canvasHeight) {\n imgHeight = canvasHeight;\n imgWidth = imgHeight / imageAspectRatio;\n }\n\n const scalar = Math.max(canvasWidth / imgWidth, canvasHeight / imgHeight);\n const width = image.width / (zoom * scalar * imgWidth);\n const height = width * canvasAspectRatio;\n\n return {\n width: width,\n height: height\n };\n};\n\nconst getImageRectZoomFactor = (imageRect, cropRect, rotation, center) => {\n // calculate available space round image center position\n const cx = center.x > 0.5 ? 1 - center.x : center.x;\n const cy = center.y > 0.5 ? 1 - center.y : center.y;\n const imageWidth = cx * 2 * imageRect.width;\n const imageHeight = cy * 2 * imageRect.height;\n\n // calculate rotated crop rectangle size\n const rotatedCropSize = getRotatedRectSize(cropRect, rotation);\n\n // calculate scalar required to fit image\n return Math.max(\n rotatedCropSize.width / imageWidth,\n rotatedCropSize.height / imageHeight\n );\n};\n\nconst getCenteredCropRect = (container, aspectRatio) => {\n let width = container.width;\n let height = width * aspectRatio;\n if (height > container.height) {\n height = container.height;\n width = height / aspectRatio;\n }\n const x = (container.width - width) * 0.5;\n const y = (container.height - height) * 0.5;\n\n return {\n x,\n y,\n width,\n height\n };\n};\n\nconst getCurrentCropSize = (imageSize, crop = {}) => {\n let { zoom, rotation, center, aspectRatio } = crop;\n\n if (!aspectRatio) aspectRatio = imageSize.height / imageSize.width;\n\n const canvasSize = calculateCanvasSize(imageSize, aspectRatio, zoom);\n\n const canvasCenter = {\n x: canvasSize.width * 0.5,\n y: canvasSize.height * 0.5\n };\n\n const stage = {\n x: 0,\n y: 0,\n width: canvasSize.width,\n height: canvasSize.height,\n center: canvasCenter\n };\n\n const shouldLimit = typeof crop.scaleToFit === 'undefined' || crop.scaleToFit;\n\n const stageZoomFactor = getImageRectZoomFactor(\n imageSize,\n getCenteredCropRect(stage, aspectRatio),\n rotation,\n shouldLimit ? center : { x: 0.5, y: 0.5 }\n );\n\n const scale = zoom * stageZoomFactor;\n\n // start drawing\n return {\n widthFloat: canvasSize.width / scale,\n heightFloat: canvasSize.height / scale,\n width: Math.round(canvasSize.width / scale),\n height: Math.round(canvasSize.height / scale)\n };\n};\n\nconst IMAGE_SCALE_SPRING_PROPS = {\n type: 'spring',\n stiffness: 0.5,\n damping: 0.45,\n mass: 10\n};\n\n// does horizontal and vertical flipping\nconst createBitmapView = _ =>\n _.utils.createView({\n name: 'image-bitmap',\n ignoreRect: true,\n mixins: { styles: ['scaleX', 'scaleY'] },\n create: ({ root, props }) => {\n root.appendChild(props.image);\n }\n });\n\n// shifts and rotates image\nconst createImageCanvasWrapper = _ =>\n _.utils.createView({\n name: 'image-canvas-wrapper',\n tag: 'div',\n ignoreRect: true,\n mixins: {\n apis: ['crop', 'width', 'height'],\n styles: [\n 'originX',\n 'originY',\n 'translateX',\n 'translateY',\n 'scaleX',\n 'scaleY',\n 'rotateZ'\n ],\n animations: {\n originX: IMAGE_SCALE_SPRING_PROPS,\n originY: IMAGE_SCALE_SPRING_PROPS,\n scaleX: IMAGE_SCALE_SPRING_PROPS,\n scaleY: IMAGE_SCALE_SPRING_PROPS,\n translateX: IMAGE_SCALE_SPRING_PROPS,\n translateY: IMAGE_SCALE_SPRING_PROPS,\n rotateZ: IMAGE_SCALE_SPRING_PROPS\n }\n },\n create: ({ root, props }) => {\n props.width = props.image.width;\n props.height = props.image.height;\n root.ref.bitmap = root.appendChildView(\n root.createChildView(createBitmapView(_), { image: props.image })\n );\n },\n write: ({ root, props }) => {\n const { flip } = props.crop;\n const { bitmap } = root.ref;\n bitmap.scaleX = flip.horizontal ? -1 : 1;\n bitmap.scaleY = flip.vertical ? -1 : 1;\n }\n });\n\n// clips canvas to correct aspect ratio\nconst createClipView = _ =>\n _.utils.createView({\n name: 'image-clip',\n tag: 'div',\n ignoreRect: true,\n mixins: {\n apis: [\n 'crop',\n 'markup',\n 'resize',\n 'width',\n 'height',\n 'dirty',\n 'background'\n ],\n styles: ['width', 'height', 'opacity'],\n animations: {\n opacity: { type: 'tween', duration: 250 }\n }\n },\n didWriteView: function({ root, props }) {\n if (!props.background) return;\n root.element.style.backgroundColor = props.background;\n },\n create: ({ root, props }) => {\n root.ref.image = root.appendChildView(\n root.createChildView(\n createImageCanvasWrapper(_),\n Object.assign({}, props)\n )\n );\n\n root.ref.createMarkup = () => {\n if (root.ref.markup) return;\n root.ref.markup = root.appendChildView(\n root.createChildView(createMarkupView(_), Object.assign({}, props))\n );\n };\n\n root.ref.destroyMarkup = () => {\n if (!root.ref.markup) return;\n root.removeChildView(root.ref.markup);\n root.ref.markup = null;\n };\n\n // set up transparency grid\n const transparencyIndicator = root.query(\n 'GET_IMAGE_PREVIEW_TRANSPARENCY_INDICATOR'\n );\n if (transparencyIndicator === null) return;\n\n // grid pattern\n if (transparencyIndicator === 'grid') {\n root.element.dataset.transparencyIndicator = transparencyIndicator;\n }\n // basic color\n else {\n root.element.dataset.transparencyIndicator = 'color';\n }\n },\n write: ({ root, props, shouldOptimize }) => {\n const { crop, markup, resize, dirty, width, height } = props;\n\n root.ref.image.crop = crop;\n\n const stage = {\n x: 0,\n y: 0,\n width,\n height,\n center: {\n x: width * 0.5,\n y: height * 0.5\n }\n };\n\n const image = {\n width: root.ref.image.width,\n height: root.ref.image.height\n };\n\n const origin = {\n x: crop.center.x * image.width,\n y: crop.center.y * image.height\n };\n\n const translation = {\n x: stage.center.x - image.width * crop.center.x,\n y: stage.center.y - image.height * crop.center.y\n };\n\n const rotation = Math.PI * 2 + (crop.rotation % (Math.PI * 2));\n\n const cropAspectRatio = crop.aspectRatio || image.height / image.width;\n\n const shouldLimit =\n typeof crop.scaleToFit === 'undefined' || crop.scaleToFit;\n\n const stageZoomFactor = getImageRectZoomFactor(\n image,\n getCenteredCropRect(stage, cropAspectRatio),\n rotation,\n shouldLimit ? crop.center : { x: 0.5, y: 0.5 }\n );\n\n const scale = crop.zoom * stageZoomFactor;\n\n // update markup view\n if (markup && markup.length) {\n root.ref.createMarkup();\n root.ref.markup.width = width;\n root.ref.markup.height = height;\n root.ref.markup.resize = resize;\n root.ref.markup.dirty = dirty;\n root.ref.markup.markup = markup;\n root.ref.markup.crop = getCurrentCropSize(image, crop);\n } else if (root.ref.markup) {\n root.ref.destroyMarkup();\n }\n\n // update image view\n const imageView = root.ref.image;\n\n // don't update clip layout\n if (shouldOptimize) {\n imageView.originX = null;\n imageView.originY = null;\n imageView.translateX = null;\n imageView.translateY = null;\n imageView.rotateZ = null;\n imageView.scaleX = null;\n imageView.scaleY = null;\n return;\n }\n\n imageView.originX = origin.x;\n imageView.originY = origin.y;\n imageView.translateX = translation.x;\n imageView.translateY = translation.y;\n imageView.rotateZ = rotation;\n imageView.scaleX = scale;\n imageView.scaleY = scale;\n }\n });\n\nconst createImageView = _ =>\n _.utils.createView({\n name: 'image-preview',\n tag: 'div',\n ignoreRect: true,\n mixins: {\n apis: ['image', 'crop', 'markup', 'resize', 'dirty', 'background'],\n styles: ['translateY', 'scaleX', 'scaleY', 'opacity'],\n animations: {\n scaleX: IMAGE_SCALE_SPRING_PROPS,\n scaleY: IMAGE_SCALE_SPRING_PROPS,\n translateY: IMAGE_SCALE_SPRING_PROPS,\n opacity: { type: 'tween', duration: 400 }\n }\n },\n create: ({ root, props }) => {\n root.ref.clip = root.appendChildView(\n root.createChildView(createClipView(_), {\n id: props.id,\n image: props.image,\n crop: props.crop,\n markup: props.markup,\n resize: props.resize,\n dirty: props.dirty,\n background: props.background\n })\n );\n },\n write: ({ root, props, shouldOptimize }) => {\n const { clip } = root.ref;\n\n const { image, crop, markup, resize, dirty } = props;\n\n clip.crop = crop;\n clip.markup = markup;\n clip.resize = resize;\n clip.dirty = dirty;\n\n // don't update clip layout\n clip.opacity = shouldOptimize ? 0 : 1;\n\n // don't re-render if optimizing or hidden (width will be zero resulting in weird animations)\n if (shouldOptimize || root.rect.element.hidden) return;\n\n // calculate scaled preview image size\n const imageAspectRatio = image.height / image.width;\n let aspectRatio = crop.aspectRatio || imageAspectRatio;\n\n // calculate container size\n const containerWidth = root.rect.inner.width;\n const containerHeight = root.rect.inner.height;\n\n let fixedPreviewHeight = root.query('GET_IMAGE_PREVIEW_HEIGHT');\n const minPreviewHeight = root.query('GET_IMAGE_PREVIEW_MIN_HEIGHT');\n const maxPreviewHeight = root.query('GET_IMAGE_PREVIEW_MAX_HEIGHT');\n\n const panelAspectRatio = root.query('GET_PANEL_ASPECT_RATIO');\n const allowMultiple = root.query('GET_ALLOW_MULTIPLE');\n\n if (panelAspectRatio && !allowMultiple) {\n fixedPreviewHeight = containerWidth * panelAspectRatio;\n aspectRatio = panelAspectRatio;\n }\n\n // determine clip width and height\n let clipHeight =\n fixedPreviewHeight !== null\n ? fixedPreviewHeight\n : Math.max(\n minPreviewHeight,\n Math.min(containerWidth * aspectRatio, maxPreviewHeight)\n );\n\n let clipWidth = clipHeight / aspectRatio;\n if (clipWidth > containerWidth) {\n clipWidth = containerWidth;\n clipHeight = clipWidth * aspectRatio;\n }\n\n if (clipHeight > containerHeight) {\n clipHeight = containerHeight;\n clipWidth = containerHeight / aspectRatio;\n }\n\n clip.width = clipWidth;\n clip.height = clipHeight;\n }\n });\n\nlet SVG_MASK = `<svg width=\"500\" height=\"200\" viewBox=\"0 0 500 200\" preserveAspectRatio=\"none\">\n <defs>\n <radialGradient id=\"gradient-__UID__\" cx=\".5\" cy=\"1.25\" r=\"1.15\">\n <stop offset='50%' stop-color='#000000'/>\n <stop offset='56%' stop-color='#0a0a0a'/>\n <stop offset='63%' stop-color='#262626'/>\n <stop offset='69%' stop-color='#4f4f4f'/>\n <stop offset='75%' stop-color='#808080'/>\n <stop offset='81%' stop-color='#b1b1b1'/>\n <stop offset='88%' stop-color='#dadada'/>\n <stop offset='94%' stop-color='#f6f6f6'/>\n <stop offset='100%' stop-color='#ffffff'/>\n </radialGradient>\n <mask id=\"mask-__UID__\">\n <rect x=\"0\" y=\"0\" width=\"500\" height=\"200\" fill=\"url(#gradient-__UID__)\"></rect>\n </mask>\n </defs>\n <rect x=\"0\" width=\"500\" height=\"200\" fill=\"currentColor\" mask=\"url(#mask-__UID__)\"></rect>\n</svg>`;\n\nlet SVGMaskUniqueId = 0;\n\nconst createImageOverlayView = fpAPI =>\n fpAPI.utils.createView({\n name: 'image-preview-overlay',\n tag: 'div',\n ignoreRect: true,\n create: ({ root, props }) => {\n let mask = SVG_MASK;\n if (document.querySelector('base')) {\n const url = new URL(\n window.location.href.replace(window.location.hash, '')\n ).href;\n mask = mask.replace(/url\\(\\#/g, 'url(' + url + '#');\n }\n\n SVGMaskUniqueId++;\n root.element.classList.add(\n `filepond--image-preview-overlay-${props.status}`\n );\n root.element.innerHTML = mask.replace(/__UID__/g, SVGMaskUniqueId);\n },\n mixins: {\n styles: ['opacity'],\n animations: {\n opacity: { type: 'spring', mass: 25 }\n }\n }\n });\n\n/**\n * Bitmap Worker\n */\nconst BitmapWorker = function() {\n self.onmessage = e => {\n createImageBitmap(e.data.message.file).then(bitmap => {\n self.postMessage({ id: e.data.id, message: bitmap }, [bitmap]);\n });\n };\n};\n\n/**\n * ColorMatrix Worker\n */\nconst ColorMatrixWorker = function() {\n self.onmessage = e => {\n const imageData = e.data.message.imageData;\n const matrix = e.data.message.colorMatrix;\n\n const data = imageData.data;\n const l = data.length;\n\n const m11 = matrix[0];\n const m12 = matrix[1];\n const m13 = matrix[2];\n const m14 = matrix[3];\n const m15 = matrix[4];\n\n const m21 = matrix[5];\n const m22 = matrix[6];\n const m23 = matrix[7];\n const m24 = matrix[8];\n const m25 = matrix[9];\n\n const m31 = matrix[10];\n const m32 = matrix[11];\n const m33 = matrix[12];\n const m34 = matrix[13];\n const m35 = matrix[14];\n\n const m41 = matrix[15];\n const m42 = matrix[16];\n const m43 = matrix[17];\n const m44 = matrix[18];\n const m45 = matrix[19];\n\n let index = 0,\n r = 0.0,\n g = 0.0,\n b = 0.0,\n a = 0.0;\n\n for (; index < l; index += 4) {\n r = data[index] / 255;\n g = data[index + 1] / 255;\n b = data[index + 2] / 255;\n a = data[index + 3] / 255;\n data[index] = Math.max(\n 0,\n Math.min((r * m11 + g * m12 + b * m13 + a * m14 + m15) * 255, 255)\n );\n data[index + 1] = Math.max(\n 0,\n Math.min((r * m21 + g * m22 + b * m23 + a * m24 + m25) * 255, 255)\n );\n data[index + 2] = Math.max(\n 0,\n Math.min((r * m31 + g * m32 + b * m33 + a * m34 + m35) * 255, 255)\n );\n data[index + 3] = Math.max(\n 0,\n Math.min((r * m41 + g * m42 + b * m43 + a * m44 + m45) * 255, 255)\n );\n }\n\n self.postMessage({ id: e.data.id, message: imageData }, [\n imageData.data.buffer\n ]);\n };\n};\n\nconst getImageSize = (url, cb) => {\n let image = new Image();\n image.onload = () => {\n const width = image.naturalWidth;\n const height = image.naturalHeight;\n image = null;\n cb(width, height);\n };\n image.src = url;\n};\n\nconst transforms = {\n 1: () => [1, 0, 0, 1, 0, 0],\n 2: width => [-1, 0, 0, 1, width, 0],\n 3: (width, height) => [-1, 0, 0, -1, width, height],\n 4: (width, height) => [1, 0, 0, -1, 0, height],\n 5: () => [0, 1, 1, 0, 0, 0],\n 6: (width, height) => [0, 1, -1, 0, height, 0],\n 7: (width, height) => [0, -1, -1, 0, height, width],\n 8: width => [0, -1, 1, 0, 0, width]\n};\n\nconst fixImageOrientation = (ctx, width, height, orientation) => {\n // no orientation supplied\n if (orientation === -1) {\n return;\n }\n\n ctx.transform.apply(ctx, transforms[orientation](width, height));\n};\n\n// draws the preview image to canvas\nconst createPreviewImage = (data, width, height, orientation) => {\n // can't draw on half pixels\n width = Math.round(width);\n height = Math.round(height);\n\n // draw image\n const canvas = document.createElement('canvas');\n canvas.width = width;\n canvas.height = height;\n const ctx = canvas.getContext('2d');\n\n // if is rotated incorrectly swap width and height\n if (orientation >= 5 && orientation <= 8) {\n [width, height] = [height, width];\n }\n\n // correct image orientation\n fixImageOrientation(ctx, width, height, orientation);\n\n // draw the image\n ctx.drawImage(data, 0, 0, width, height);\n\n return canvas;\n};\n\nconst isBitmap = file => /^image/.test(file.type) && !/svg/.test(file.type);\n\nconst MAX_WIDTH = 10;\nconst MAX_HEIGHT = 10;\n\nconst calculateAverageColor = image => {\n const scalar = Math.min(MAX_WIDTH / image.width, MAX_HEIGHT / image.height);\n\n const canvas = document.createElement('canvas');\n const ctx = canvas.getContext('2d');\n const width = (canvas.width = Math.ceil(image.width * scalar));\n const height = (canvas.height = Math.ceil(image.height * scalar));\n ctx.drawImage(image, 0, 0, width, height);\n let data = null;\n try {\n data = ctx.getImageData(0, 0, width, height).data;\n } catch (e) {\n return null;\n }\n const l = data.length;\n\n let r = 0;\n let g = 0;\n let b = 0;\n let i = 0;\n\n for (; i < l; i += 4) {\n r += data[i] * data[i];\n g += data[i + 1] * data[i + 1];\n b += data[i + 2] * data[i + 2];\n }\n\n r = averageColor(r, l);\n g = averageColor(g, l);\n b = averageColor(b, l);\n\n return { r, g, b };\n};\n\nconst averageColor = (c, l) => Math.floor(Math.sqrt(c / (l / 4)));\n\nconst cloneCanvas = (origin, target) => {\n target = target || document.createElement('canvas');\n target.width = origin.width;\n target.height = origin.height;\n const ctx = target.getContext('2d');\n ctx.drawImage(origin, 0, 0);\n return target;\n};\n\nconst cloneImageData = imageData => {\n let id;\n try {\n id = new ImageData(imageData.width, imageData.height);\n } catch (e) {\n const canvas = document.createElement('canvas');\n const ctx = canvas.getContext('2d');\n id = ctx.createImageData(imageData.width, imageData.height);\n }\n id.data.set(new Uint8ClampedArray(imageData.data));\n return id;\n};\n\nconst loadImage = url =>\n new Promise((resolve, reject) => {\n const img = new Image();\n img.crossOrigin = 'Anonymous';\n img.onload = () => {\n resolve(img);\n };\n img.onerror = e => {\n reject(e);\n };\n img.src = url;\n });\n\nconst createImageWrapperView = _ => {\n // create overlay view\n const OverlayView = createImageOverlayView(_);\n\n const ImageView = createImageView(_);\n\n const { createWorker } = _.utils;\n\n const applyFilter = (root, filter, target) =>\n new Promise(resolve => {\n // will store image data for future filter updates\n if (!root.ref.imageData) {\n root.ref.imageData = target\n .getContext('2d')\n .getImageData(0, 0, target.width, target.height);\n }\n\n // get image data reference\n const imageData = cloneImageData(root.ref.imageData);\n\n if (!filter || filter.length !== 20) {\n target.getContext('2d').putImageData(imageData, 0, 0);\n return resolve();\n }\n\n const worker = createWorker(ColorMatrixWorker);\n worker.post(\n {\n imageData,\n colorMatrix: filter\n },\n response => {\n // apply filtered colors\n target.getContext('2d').putImageData(response, 0, 0);\n\n // stop worker\n worker.terminate();\n\n // done!\n resolve();\n },\n [imageData.data.buffer]\n );\n });\n\n const removeImageView = (root, imageView) => {\n root.removeChildView(imageView);\n imageView.image.width = 1;\n imageView.image.height = 1;\n imageView._destroy();\n };\n\n // remove an image\n const shiftImage = ({ root }) => {\n const imageView = root.ref.images.shift();\n imageView.opacity = 0;\n imageView.translateY = -15;\n root.ref.imageViewBin.push(imageView);\n return imageView;\n };\n\n // add new image\n const pushImage = ({ root, props, image }) => {\n const id = props.id;\n const item = root.query('GET_ITEM', { id });\n if (!item) return;\n\n const crop = item.getMetadata('crop') || {\n center: {\n x: 0.5,\n y: 0.5\n },\n flip: {\n horizontal: false,\n vertical: false\n },\n zoom: 1,\n rotation: 0,\n aspectRatio: null\n };\n\n const background = root.query(\n 'GET_IMAGE_TRANSFORM_CANVAS_BACKGROUND_COLOR'\n );\n\n let markup;\n let resize;\n let dirty = false;\n if (root.query('GET_IMAGE_PREVIEW_MARKUP_SHOW')) {\n markup = item.getMetadata('markup') || [];\n resize = item.getMetadata('resize');\n dirty = true;\n }\n\n // append image presenter\n const imageView = root.appendChildView(\n root.createChildView(ImageView, {\n id,\n image,\n crop,\n resize,\n markup,\n dirty,\n background,\n opacity: 0,\n scaleX: 1.15,\n scaleY: 1.15,\n translateY: 15\n }),\n root.childViews.length\n );\n root.ref.images.push(imageView);\n\n // reveal the preview image\n imageView.opacity = 1;\n imageView.scaleX = 1;\n imageView.scaleY = 1;\n imageView.translateY = 0;\n\n // the preview is now ready to be drawn\n setTimeout(() => {\n root.dispatch('DID_IMAGE_PREVIEW_SHOW', { id });\n }, 250);\n };\n\n const updateImage = ({ root, props }) => {\n const item = root.query('GET_ITEM', { id: props.id });\n if (!item) return;\n const imageView = root.ref.images[root.ref.images.length - 1];\n imageView.crop = item.getMetadata('crop');\n imageView.background = root.query(\n 'GET_IMAGE_TRANSFORM_CANVAS_BACKGROUND_COLOR'\n );\n if (root.query('GET_IMAGE_PREVIEW_MARKUP_SHOW')) {\n imageView.dirty = true;\n imageView.resize = item.getMetadata('resize');\n imageView.markup = item.getMetadata('markup');\n }\n };\n\n // replace image preview\n const didUpdateItemMetadata = ({ root, props, action }) => {\n // only filter and crop trigger redraw\n if (!/crop|filter|markup|resize/.test(action.change.key)) return;\n\n // no images to update, exit\n if (!root.ref.images.length) return;\n\n // no item found, exit\n const item = root.query('GET_ITEM', { id: props.id });\n if (!item) return;\n\n // for now, update existing image when filtering\n if (/filter/.test(action.change.key)) {\n const imageView = root.ref.images[root.ref.images.length - 1];\n applyFilter(root, action.change.value, imageView.image);\n return;\n }\n\n if (/crop|markup|resize/.test(action.change.key)) {\n const crop = item.getMetadata('crop');\n const image = root.ref.images[root.ref.images.length - 1];\n\n // if aspect ratio has changed, we need to create a new image\n if (\n crop &&\n crop.aspectRatio &&\n image.crop &&\n image.crop.aspectRatio &&\n Math.abs(crop.aspectRatio - image.crop.aspectRatio) > 0.00001\n ) {\n const imageView = shiftImage({ root });\n pushImage({ root, props, image: cloneCanvas(imageView.image) });\n }\n // if not, we can update the current image\n else {\n updateImage({ root, props });\n }\n }\n };\n\n const canCreateImageBitmap = file => {\n // Firefox versions before 58 will freeze when running createImageBitmap\n // in a Web Worker so we detect those versions and return false for support\n const userAgent = window.navigator.userAgent;\n const isFirefox = userAgent.match(/Firefox\\/([0-9]+)\\./);\n const firefoxVersion = isFirefox ? parseInt(isFirefox[1]) : null;\n if (firefoxVersion !== null && firefoxVersion <= 58) return false;\n\n return 'createImageBitmap' in window && isBitmap(file);\n };\n\n /**\n * Write handler for when preview container has been created\n */\n const didCreatePreviewContainer = ({ root, props }) => {\n const { id } = props;\n\n // we need to get the file data to determine the eventual image size\n const item = root.query('GET_ITEM', id);\n if (!item) return;\n\n // get url to file (we'll revoke it later on when done)\n const fileURL = URL.createObjectURL(item.file);\n\n // determine image size of this item\n getImageSize(fileURL, (width, height) => {\n // we can now scale the panel to the final size\n root.dispatch('DID_IMAGE_PREVIEW_CALCULATE_SIZE', {\n id,\n width,\n height\n });\n });\n };\n\n const drawPreview = ({ root, props }) => {\n const { id } = props;\n\n // we need to get the file data to determine the eventual image size\n const item = root.query('GET_ITEM', id);\n if (!item) return;\n\n // get url to file (we'll revoke it later on when done)\n const fileURL = URL.createObjectURL(item.file);\n\n // fallback\n const loadPreviewFallback = () => {\n // let's scale the image in the main thread :(\n loadImage(fileURL).then(previewImageLoaded);\n };\n\n // image is now ready\n const previewImageLoaded = imageData => {\n // the file url is no longer needed\n URL.revokeObjectURL(fileURL);\n\n // draw the scaled down version here and use that as source so bitmapdata can be closed\n // orientation info\n const exif = item.getMetadata('exif') || {};\n const orientation = exif.orientation || -1;\n\n // get width and height from action, and swap if orientation is incorrect\n let { width, height } = imageData;\n\n // if no width or height, just return early.\n if (!width || !height) return;\n\n if (orientation >= 5 && orientation <= 8) {\n [width, height] = [height, width];\n }\n\n // scale canvas based on pixel density\n // we multiply by .75 as that creates smaller but still clear images on screens with high res displays\n const pixelDensityFactor = Math.max(1, window.devicePixelRatio * 0.75);\n\n // we want as much pixels to work with as possible,\n // this multiplies the minimum image resolution,\n // so when zooming in it doesn't get too blurry\n const zoomFactor = root.query('GET_IMAGE_PREVIEW_ZOOM_FACTOR');\n\n // imaeg scale factor\n const scaleFactor = zoomFactor * pixelDensityFactor;\n\n // calculate scaled preview image size\n const previewImageRatio = height / width;\n\n // calculate image preview height and width\n const previewContainerWidth = root.rect.element.width;\n const previewContainerHeight = root.rect.element.height;\n\n let imageWidth = previewContainerWidth;\n let imageHeight = imageWidth * previewImageRatio;\n\n if (previewImageRatio > 1) {\n imageWidth = Math.min(width, previewContainerWidth * scaleFactor);\n imageHeight = imageWidth * previewImageRatio;\n } else {\n imageHeight = Math.min(height, previewContainerHeight * scaleFactor);\n imageWidth = imageHeight / previewImageRatio;\n }\n\n // transfer to image tag so no canvas memory wasted on iOS\n const previewImage = createPreviewImage(\n imageData,\n imageWidth,\n imageHeight,\n orientation\n );\n\n // done\n const done = () => {\n // calculate average image color, disabled for now\n const averageColor = root.query(\n 'GET_IMAGE_PREVIEW_CALCULATE_AVERAGE_IMAGE_COLOR'\n )\n ? calculateAverageColor(data)\n : null;\n item.setMetadata('color', averageColor, true);\n\n // data has been transferred to canvas ( if was ImageBitmap )\n if ('close' in imageData) {\n imageData.close();\n }\n\n // show the overlay\n root.ref.overlayShadow.opacity = 1;\n\n // create the first image\n pushImage({ root, props, image: previewImage });\n };\n\n // apply filter\n const filter = item.getMetadata('filter');\n if (filter) {\n applyFilter(root, filter, previewImage).then(done);\n } else {\n done();\n }\n };\n\n // if we support scaling using createImageBitmap we use a worker\n if (canCreateImageBitmap(item.file)) {\n // let's scale the image in a worker\n const worker = createWorker(BitmapWorker);\n\n worker.post(\n {\n file: item.file\n },\n imageBitmap => {\n // destroy worker\n worker.terminate();\n\n // no bitmap returned, must be something wrong,\n // try the oldschool way\n if (!imageBitmap) {\n loadPreviewFallback();\n return;\n }\n\n // yay we got our bitmap, let's continue showing the preview\n previewImageLoaded(imageBitmap);\n }\n );\n } else {\n // create fallback preview\n loadPreviewFallback();\n }\n };\n\n /**\n * Write handler for when the preview image is ready to be animated\n */\n const didDrawPreview = ({ root }) => {\n // get last added image\n const image = root.ref.images[root.ref.images.length - 1];\n image.translateY = 0;\n image.scaleX = 1.0;\n image.scaleY = 1.0;\n image.opacity = 1;\n };\n\n /**\n * Write handler for when the preview has been loaded\n */\n const restoreOverlay = ({ root }) => {\n root.ref.overlayShadow.opacity = 1;\n root.ref.overlayError.opacity = 0;\n root.ref.overlaySuccess.opacity = 0;\n };\n\n const didThrowError = ({ root }) => {\n root.ref.overlayShadow.opacity = 0.25;\n root.ref.overlayError.opacity = 1;\n };\n\n const didCompleteProcessing = ({ root }) => {\n root.ref.overlayShadow.opacity = 0.25;\n root.ref.overlaySuccess.opacity = 1;\n };\n\n /**\n * Constructor\n */\n const create = ({ root }) => {\n // image view\n root.ref.images = [];\n\n // the preview image data (we need this to filter the image)\n root.ref.imageData = null;\n\n // image bin\n root.ref.imageViewBin = [];\n\n // image overlays\n root.ref.overlayShadow = root.appendChildView(\n root.createChildView(OverlayView, {\n opacity: 0,\n status: 'idle'\n })\n );\n\n root.ref.overlaySuccess = root.appendChildView(\n root.createChildView(OverlayView, {\n opacity: 0,\n status: 'success'\n })\n );\n\n root.ref.overlayError = root.appendChildView(\n root.createChildView(OverlayView, {\n opacity: 0,\n status: 'failure'\n })\n );\n };\n\n return _.utils.createView({\n name: 'image-preview-wrapper',\n create,\n styles: ['height'],\n apis: ['height'],\n destroy: ({ root }) => {\n // we resize the image so memory on iOS 12 is released more quickly (it seems)\n root.ref.images.forEach(imageView => {\n imageView.image.width = 1;\n imageView.image.height = 1;\n });\n },\n didWriteView: ({ root }) => {\n root.ref.images.forEach(imageView => {\n imageView.dirty = false;\n });\n },\n write: _.utils.createRoute(\n {\n // image preview stated\n DID_IMAGE_PREVIEW_DRAW: didDrawPreview,\n DID_IMAGE_PREVIEW_CONTAINER_CREATE: didCreatePreviewContainer,\n DID_FINISH_CALCULATE_PREVIEWSIZE: drawPreview,\n DID_UPDATE_ITEM_METADATA: didUpdateItemMetadata,\n\n // file states\n DID_THROW_ITEM_LOAD_ERROR: didThrowError,\n DID_THROW_ITEM_PROCESSING_ERROR: didThrowError,\n DID_THROW_ITEM_INVALID: didThrowError,\n DID_COMPLETE_ITEM_PROCESSING: didCompleteProcessing,\n DID_START_ITEM_PROCESSING: restoreOverlay,\n DID_REVERT_ITEM_PROCESSING: restoreOverlay\n },\n ({ root }) => {\n // views on death row\n const viewsToRemove = root.ref.imageViewBin.filter(\n imageView => imageView.opacity === 0\n );\n\n // views to retain\n root.ref.imageViewBin = root.ref.imageViewBin.filter(\n imageView => imageView.opacity > 0\n );\n\n // remove these views\n viewsToRemove.forEach(imageView => removeImageView(root, imageView));\n viewsToRemove.length = 0;\n }\n )\n });\n};\n\n/**\n * Image Preview Plugin\n */\nconst plugin = fpAPI => {\n const { addFilter, utils } = fpAPI;\n const { Type, createRoute, isFile } = utils;\n\n // imagePreviewView\n const imagePreviewView = createImageWrapperView(fpAPI);\n\n // called for each view that is created right after the 'create' method\n addFilter('CREATE_VIEW', viewAPI => {\n // get reference to created view\n const { is, view, query } = viewAPI;\n\n // only hook up to item view and only if is enabled for this cropper\n if (!is('file') || !query('GET_ALLOW_IMAGE_PREVIEW')) return;\n\n // create the image preview plugin, but only do so if the item is an image\n const didLoadItem = ({ root, props }) => {\n const { id } = props;\n const item = query('GET_ITEM', id);\n\n // item could theoretically have been removed in the mean time\n if (!item || !isFile(item.file) || item.archived) return;\n\n // get the file object\n const file = item.file;\n\n // exit if this is not an image\n if (!isPreviewableImage(file)) return;\n\n // test if is filtered\n if (!query('GET_IMAGE_PREVIEW_FILTER_ITEM')(item)) return;\n\n // exit if image size is too high and no createImageBitmap support\n // this would simply bring the browser to its knees and that is not what we want\n const supportsCreateImageBitmap = 'createImageBitmap' in (window || {});\n const maxPreviewFileSize = query('GET_IMAGE_PREVIEW_MAX_FILE_SIZE');\n if (\n !supportsCreateImageBitmap &&\n (maxPreviewFileSize && file.size > maxPreviewFileSize)\n )\n return;\n\n // set preview view\n root.ref.imagePreview = view.appendChildView(\n view.createChildView(imagePreviewView, { id })\n );\n\n // update height if is fixed\n const fixedPreviewHeight = root.query('GET_IMAGE_PREVIEW_HEIGHT');\n if (fixedPreviewHeight) {\n root.dispatch('DID_UPDATE_PANEL_HEIGHT', {\n id: item.id,\n height: fixedPreviewHeight\n });\n }\n\n // now ready\n const queue =\n !supportsCreateImageBitmap &&\n file.size > query('GET_IMAGE_PREVIEW_MAX_INSTANT_PREVIEW_FILE_SIZE');\n root.dispatch('DID_IMAGE_PREVIEW_CONTAINER_CREATE', { id }, queue);\n };\n\n const rescaleItem = (root, props) => {\n if (!root.ref.imagePreview) return;\n\n let { id } = props;\n\n // get item\n const item = root.query('GET_ITEM', { id });\n if (!item) return;\n\n // if is fixed height or panel has aspect ratio, exit here, height has already been defined\n const panelAspectRatio = root.query('GET_PANEL_ASPECT_RATIO');\n const itemPanelAspectRatio = root.query('GET_ITEM_PANEL_ASPECT_RATIO');\n const fixedHeight = root.query('GET_IMAGE_PREVIEW_HEIGHT');\n if (panelAspectRatio || itemPanelAspectRatio || fixedHeight) return;\n\n // no data!\n let { imageWidth, imageHeight } = root.ref;\n if (!imageWidth || !imageHeight) return;\n\n // get height min and max\n const minPreviewHeight = root.query('GET_IMAGE_PREVIEW_MIN_HEIGHT');\n const maxPreviewHeight = root.query('GET_IMAGE_PREVIEW_MAX_HEIGHT');\n\n // orientation info\n const exif = item.getMetadata('exif') || {};\n const orientation = exif.orientation || -1;\n\n // get width and height from action, and swap of orientation is incorrect\n if (orientation >= 5 && orientation <= 8)\n [imageWidth, imageHeight] = [imageHeight, imageWidth];\n\n // scale up width and height when we're dealing with an SVG\n if (!isBitmap(item.file) || root.query('GET_IMAGE_PREVIEW_UPSCALE')) {\n const scalar = 2048 / imageWidth;\n imageWidth *= scalar;\n imageHeight *= scalar;\n }\n\n // image aspect ratio\n const imageAspectRatio = imageHeight / imageWidth;\n\n // we need the item to get to the crop size\n const previewAspectRatio =\n (item.getMetadata('crop') || {}).aspectRatio || imageAspectRatio;\n\n // preview height range\n let previewHeightMax = Math.max(\n minPreviewHeight,\n Math.min(imageHeight, maxPreviewHeight)\n );\n const itemWidth = root.rect.element.width;\n const previewHeight = Math.min(\n itemWidth * previewAspectRatio,\n previewHeightMax\n );\n\n // request update to panel height\n root.dispatch('DID_UPDATE_PANEL_HEIGHT', {\n id: item.id,\n height: previewHeight\n });\n };\n\n const didResizeView = ({ root }) => {\n // actions in next write operation\n root.ref.shouldRescale = true;\n };\n\n const didUpdateItemMetadata = ({ root, action }) => {\n if (action.change.key !== 'crop') return;\n\n // actions in next write operation\n root.ref.shouldRescale = true;\n };\n\n const didCalculatePreviewSize = ({ root, action }) => {\n // remember dimensions\n root.ref.imageWidth = action.width;\n root.ref.imageHeight = action.height;\n\n // actions in next write operation\n root.ref.shouldRescale = true;\n root.ref.shouldDrawPreview = true;\n\n // as image load could take a while and fire when draw loop is resting we need to give it a kick\n root.dispatch('KICK');\n };\n\n // start writing\n view.registerWriter(\n createRoute(\n {\n DID_RESIZE_ROOT: didResizeView,\n DID_STOP_RESIZE: didResizeView,\n DID_LOAD_ITEM: didLoadItem,\n DID_IMAGE_PREVIEW_CALCULATE_SIZE: didCalculatePreviewSize,\n DID_UPDATE_ITEM_METADATA: didUpdateItemMetadata\n },\n ({ root, props }) => {\n // no preview view attached\n if (!root.ref.imagePreview) return;\n\n // don't do anything while hidden\n if (root.rect.element.hidden) return;\n\n // resize the item panel\n if (root.ref.shouldRescale) {\n rescaleItem(root, props);\n root.ref.shouldRescale = false;\n }\n\n if (root.ref.shouldDrawPreview) {\n // queue till next frame so we're sure the height has been applied this forces the draw image call inside the wrapper view to use the correct height\n requestAnimationFrame(() => {\n // this requestAnimationFrame nesting is horrible but it fixes an issue with 100hz displays on Chrome\n // https://github.com/pqina/filepond-plugin-image-preview/issues/57\n requestAnimationFrame(() => {\n root.dispatch('DID_FINISH_CALCULATE_PREVIEWSIZE', {\n id: props.id\n });\n });\n });\n\n root.ref.shouldDrawPreview = false;\n }\n }\n )\n );\n });\n\n // expose plugin\n return {\n options: {\n // Enable or disable image preview\n allowImagePreview: [true, Type.BOOLEAN],\n\n // filters file items to determine which are shown as preview\n imagePreviewFilterItem: [() => true, Type.FUNCTION],\n\n // Fixed preview height\n imagePreviewHeight: [null, Type.INT],\n\n // Min image height\n imagePreviewMinHeight: [44, Type.INT],\n\n // Max image height\n imagePreviewMaxHeight: [256, Type.INT],\n\n // Max size of preview file for when createImageBitmap is not supported\n imagePreviewMaxFileSize: [null, Type.INT],\n\n // The amount of extra pixels added to the image preview to allow comfortable zooming\n imagePreviewZoomFactor: [2, Type.INT],\n\n // Should we upscale small images to fit the max bounding box of the preview area\n imagePreviewUpscale: [false, Type.BOOLEAN],\n\n // Max size of preview file that we allow to try to instant preview if createImageBitmap is not supported, else image is queued for loading\n imagePreviewMaxInstantPreviewFileSize: [1000000, Type.INT],\n\n // Style of the transparancy indicator used behind images\n imagePreviewTransparencyIndicator: [null, Type.STRING],\n\n // Enables or disables reading average image color\n imagePreviewCalculateAverageImageColor: [false, Type.BOOLEAN],\n\n // Enables or disables the previewing of markup\n imagePreviewMarkupShow: [true, Type.BOOLEAN],\n\n // Allows filtering of markup to only show certain shapes\n imagePreviewMarkupFilter: [() => true, Type.FUNCTION]\n }\n };\n};\n\n// fire pluginloaded event if running in browser, this allows registering the plugin when using async script tags\nconst isBrowser =\n typeof window !== 'undefined' && typeof window.document !== 'undefined';\nif (isBrowser) {\n document.dispatchEvent(\n new CustomEvent('FilePond:pluginloaded', { detail: plugin })\n );\n}\n\nexport default plugin;\n","/*!\n * FilePondPluginImageExifOrientation 1.0.11\n * Licensed under MIT, https://opensource.org/licenses/MIT/\n * Please visit https://pqina.nl/filepond/ for details.\n */\n\n/* eslint-disable */\n\n// test if file is of type image\nconst isJPEG = file => /^image\\/jpeg/.test(file.type);\n\nconst Marker = {\n JPEG: 0xffd8,\n APP1: 0xffe1,\n EXIF: 0x45786966,\n TIFF: 0x4949,\n Orientation: 0x0112,\n Unknown: 0xff00\n};\n\nconst getUint16 = (view, offset, little = false) =>\n view.getUint16(offset, little);\nconst getUint32 = (view, offset, little = false) =>\n view.getUint32(offset, little);\n\nconst getImageOrientation = file =>\n new Promise((resolve, reject) => {\n const reader = new FileReader();\n reader.onload = function(e) {\n const view = new DataView(e.target.result);\n\n // Every JPEG file starts from binary value '0xFFD8'\n if (getUint16(view, 0) !== Marker.JPEG) {\n // This aint no JPEG\n resolve(-1);\n return;\n }\n\n const length = view.byteLength;\n let offset = 2;\n\n while (offset < length) {\n const marker = getUint16(view, offset);\n offset += 2;\n\n // There's our APP1 Marker\n if (marker === Marker.APP1) {\n if (getUint32(view, (offset += 2)) !== Marker.EXIF) {\n // no EXIF info defined\n break;\n }\n\n // Get TIFF Header\n const little = getUint16(view, (offset += 6)) === Marker.TIFF;\n offset += getUint32(view, offset + 4, little);\n\n const tags = getUint16(view, offset, little);\n offset += 2;\n\n for (let i = 0; i < tags; i++) {\n // found the orientation tag\n if (\n getUint16(view, offset + i * 12, little) === Marker.Orientation\n ) {\n resolve(getUint16(view, offset + i * 12 + 8, little));\n return;\n }\n }\n } else if ((marker & Marker.Unknown) !== Marker.Unknown) {\n // Invalid\n break;\n } else {\n offset += getUint16(view, offset);\n }\n }\n\n // Nothing found\n resolve(-1);\n };\n\n // we don't need to read the entire file to get the orientation\n reader.readAsArrayBuffer(file.slice(0, 64 * 1024));\n });\n\nconst IS_BROWSER = (() =>\n typeof window !== 'undefined' && typeof window.document !== 'undefined')();\nconst isBrowser = () => IS_BROWSER;\n\n// 2x1 pixel image 90CW rotated with orientation header\nconst testSrc =\n 'data:image/jpg;base64,/9j/4AAQSkZJRgABAQEASABIAAD/4QA6RXhpZgAATU0AKgAAAAgAAwESAAMAAAABAAYAAAEoAAMAAAABAAIAAAITAAMAAAABAAEAAAAAAAD/2wBDAP//////////////////////////////////////////////////////////////////////////////////////wAALCAABAAIBASIA/8QAJgABAAAAAAAAAAAAAAAAAAAAAxABAAAAAAAAAAAAAAAAAAAAAP/aAAgBAQAAPwBH/9k=';\n\n// should correct orientation if is presented in landscape, in which case the browser doesn't autocorrect\nlet shouldCorrect = undefined;\nconst testImage = isBrowser() ? new Image() : {};\ntestImage.onload = () =>\n (shouldCorrect = testImage.naturalWidth > testImage.naturalHeight);\ntestImage.src = testSrc;\n\nconst shouldCorrectImageExifOrientation = () => shouldCorrect;\n\n/**\n * Read Image Orientation Plugin\n */\nconst plugin = ({ addFilter, utils }) => {\n const { Type, isFile } = utils;\n\n // subscribe to file load and append required info\n addFilter(\n 'DID_LOAD_ITEM',\n (item, { query }) =>\n new Promise((resolve, reject) => {\n // get file reference\n const file = item.file;\n\n // if this is not a jpeg image we are not interested\n if (\n !isFile(file) ||\n !isJPEG(file) ||\n !query('GET_ALLOW_IMAGE_EXIF_ORIENTATION') ||\n !shouldCorrectImageExifOrientation()\n ) {\n // continue with the unaltered dataset\n return resolve(item);\n }\n\n // get orientation from exif data\n getImageOrientation(file).then(orientation => {\n item.setMetadata('exif', { orientation });\n resolve(item);\n });\n })\n );\n\n // Expose plugin options\n return {\n options: {\n // Enable or disable image orientation reading\n allowImageExifOrientation: [true, Type.BOOLEAN]\n }\n };\n};\n\n// fire pluginloaded event if running in browser, this allows registering the plugin when using async script tags\nconst isBrowser$1 =\n typeof window !== 'undefined' && typeof window.document !== 'undefined';\nif (isBrowser$1) {\n document.dispatchEvent(\n new CustomEvent('FilePond:pluginloaded', { detail: plugin })\n );\n}\n\nexport default plugin;\n","/*!\n * FilePondPluginFileValidateType 1.2.9\n * Licensed under MIT, https://opensource.org/licenses/MIT/\n * Please visit https://pqina.nl/filepond/ for details.\n */\n\n/* eslint-disable */\n\nconst plugin = ({ addFilter, utils }) => {\n // get quick reference to Type utils\n const {\n Type,\n isString,\n replaceInString,\n guesstimateMimeType,\n getExtensionFromFilename,\n getFilenameFromURL,\n } = utils;\n\n const mimeTypeMatchesWildCard = (mimeType, wildcard) => {\n const mimeTypeGroup = (/^[^/]+/.exec(mimeType) || []).pop(); // image/png -> image\n const wildcardGroup = wildcard.slice(0, -2); // image/* -> image\n return mimeTypeGroup === wildcardGroup;\n };\n\n const isValidMimeType = (acceptedTypes, userInputType) =>\n acceptedTypes.some(acceptedType => {\n // accepted is wildcard mime type\n if (/\\*$/.test(acceptedType)) {\n return mimeTypeMatchesWildCard(userInputType, acceptedType);\n }\n\n // is normal mime type\n return acceptedType === userInputType;\n });\n\n const getItemType = item => {\n // if the item is a url we guess the mime type by the extension\n let type = '';\n if (isString(item)) {\n const filename = getFilenameFromURL(item);\n const extension = getExtensionFromFilename(filename);\n if (extension) {\n type = guesstimateMimeType(extension);\n }\n } else {\n type = item.type;\n }\n\n return type;\n };\n\n const validateFile = (item, acceptedFileTypes, typeDetector) => {\n // no types defined, everything is allowed \\o/\n if (acceptedFileTypes.length === 0) {\n return true;\n }\n\n // gets the item type\n const type = getItemType(item);\n\n // no type detector, test now\n if (!typeDetector) {\n return isValidMimeType(acceptedFileTypes, type);\n }\n\n // use type detector\n return new Promise((resolve, reject) => {\n typeDetector(item, type)\n .then(detectedType => {\n if (isValidMimeType(acceptedFileTypes, detectedType)) {\n resolve();\n } else {\n reject();\n }\n })\n .catch(reject);\n });\n };\n\n const applyMimeTypeMap = map => acceptedFileType =>\n map[acceptedFileType] === null ? false : map[acceptedFileType] || acceptedFileType;\n\n // setup attribute mapping for accept\n addFilter('SET_ATTRIBUTE_TO_OPTION_MAP', map =>\n Object.assign(map, {\n accept: 'acceptedFileTypes',\n })\n );\n\n // filtering if an item is allowed in hopper\n addFilter('ALLOW_HOPPER_ITEM', (file, { query }) => {\n // if we are not doing file type validation exit\n if (!query('GET_ALLOW_FILE_TYPE_VALIDATION')) {\n return true;\n }\n\n // we validate the file against the accepted file types\n return validateFile(file, query('GET_ACCEPTED_FILE_TYPES'));\n });\n\n // called for each file that is loaded\n // right before it is set to the item state\n // should return a promise\n addFilter(\n 'LOAD_FILE',\n (file, { query }) =>\n new Promise((resolve, reject) => {\n if (!query('GET_ALLOW_FILE_TYPE_VALIDATION')) {\n resolve(file);\n return;\n }\n\n const acceptedFileTypes = query('GET_ACCEPTED_FILE_TYPES');\n\n // custom type detector method\n const typeDetector = query('GET_FILE_VALIDATE_TYPE_DETECT_TYPE');\n\n // if invalid, exit here\n const validationResult = validateFile(file, acceptedFileTypes, typeDetector);\n\n const handleRejection = () => {\n const acceptedFileTypesMapped = acceptedFileTypes\n .map(\n applyMimeTypeMap(\n query('GET_FILE_VALIDATE_TYPE_LABEL_EXPECTED_TYPES_MAP')\n )\n )\n .filter(label => label !== false);\n\n const acceptedFileTypesMappedUnique = acceptedFileTypesMapped.filter(\n (item, index) => acceptedFileTypesMapped.indexOf(item) === index\n );\n\n reject({\n status: {\n main: query('GET_LABEL_FILE_TYPE_NOT_ALLOWED'),\n sub: replaceInString(\n query('GET_FILE_VALIDATE_TYPE_LABEL_EXPECTED_TYPES'),\n {\n allTypes: acceptedFileTypesMappedUnique.join(', '),\n allButLastType: acceptedFileTypesMappedUnique\n .slice(0, -1)\n .join(', '),\n lastType:\n acceptedFileTypesMappedUnique[\n acceptedFileTypesMappedUnique.length - 1\n ],\n }\n ),\n },\n });\n };\n\n // has returned new filename immidiately\n if (typeof validationResult === 'boolean') {\n if (!validationResult) {\n return handleRejection();\n }\n return resolve(file);\n }\n\n // is promise\n validationResult\n .then(() => {\n resolve(file);\n })\n .catch(handleRejection);\n })\n );\n\n // expose plugin\n return {\n // default options\n options: {\n // Enable or disable file type validation\n allowFileTypeValidation: [true, Type.BOOLEAN],\n\n // What file types to accept\n acceptedFileTypes: [[], Type.ARRAY],\n // - must be comma separated\n // - mime types: image/png, image/jpeg, image/gif\n // - extensions: .png, .jpg, .jpeg ( not enabled yet )\n // - wildcards: image/*\n\n // label to show when a type is not allowed\n labelFileTypeNotAllowed: ['File is of invalid type', Type.STRING],\n\n // nicer label\n fileValidateTypeLabelExpectedTypes: [\n 'Expects {allButLastType} or {lastType}',\n Type.STRING,\n ],\n\n // map mime types to extensions\n fileValidateTypeLabelExpectedTypesMap: [{}, Type.OBJECT],\n\n // Custom function to detect type of file\n fileValidateTypeDetectType: [null, Type.FUNCTION],\n },\n };\n};\n\n// fire pluginloaded event if running in browser, this allows registering the plugin when using async script tags\nconst isBrowser = typeof window !== 'undefined' && typeof window.document !== 'undefined';\nif (isBrowser) {\n document.dispatchEvent(new CustomEvent('FilePond:pluginloaded', { detail: plugin }));\n}\n\nexport default plugin;\n","/*!\n * FilePondPluginFileValidateSize 2.2.8\n * Licensed under MIT, https://opensource.org/licenses/MIT/\n * Please visit https://pqina.nl/filepond/ for details.\n */\n\n/* eslint-disable */\n\nconst plugin = ({ addFilter, utils }) => {\n // get quick reference to Type utils\n const { Type, replaceInString, toNaturalFileSize } = utils;\n\n // filtering if an item is allowed in hopper\n addFilter('ALLOW_HOPPER_ITEM', (file, { query }) => {\n if (!query('GET_ALLOW_FILE_SIZE_VALIDATION')) {\n return true;\n }\n\n const sizeMax = query('GET_MAX_FILE_SIZE');\n if (sizeMax !== null && file.size > sizeMax) {\n return false;\n }\n\n const sizeMin = query('GET_MIN_FILE_SIZE');\n if (sizeMin !== null && file.size < sizeMin) {\n return false;\n }\n\n return true;\n });\n\n // called for each file that is loaded\n // right before it is set to the item state\n // should return a promise\n addFilter(\n 'LOAD_FILE',\n (file, { query }) =>\n new Promise((resolve, reject) => {\n // if not allowed, all fine, exit\n if (!query('GET_ALLOW_FILE_SIZE_VALIDATION')) {\n return resolve(file);\n }\n\n // check if file should be filtered\n const fileFilter = query('GET_FILE_VALIDATE_SIZE_FILTER');\n if (fileFilter && !fileFilter(file)) {\n return resolve(file);\n }\n\n // reject or resolve based on file size\n const sizeMax = query('GET_MAX_FILE_SIZE');\n if (sizeMax !== null && file.size > sizeMax) {\n reject({\n status: {\n main: query('GET_LABEL_MAX_FILE_SIZE_EXCEEDED'),\n sub: replaceInString(query('GET_LABEL_MAX_FILE_SIZE'), {\n filesize: toNaturalFileSize(\n sizeMax,\n '.',\n query('GET_FILE_SIZE_BASE'),\n query('GET_FILE_SIZE_LABELS', query)\n ),\n }),\n },\n });\n return;\n }\n\n // reject or resolve based on file size\n const sizeMin = query('GET_MIN_FILE_SIZE');\n if (sizeMin !== null && file.size < sizeMin) {\n reject({\n status: {\n main: query('GET_LABEL_MIN_FILE_SIZE_EXCEEDED'),\n sub: replaceInString(query('GET_LABEL_MIN_FILE_SIZE'), {\n filesize: toNaturalFileSize(\n sizeMin,\n '.',\n query('GET_FILE_SIZE_BASE'),\n query('GET_FILE_SIZE_LABELS', query)\n ),\n }),\n },\n });\n return;\n }\n\n // returns the current option value\n const totalSizeMax = query('GET_MAX_TOTAL_FILE_SIZE');\n if (totalSizeMax !== null) {\n // get the current total file size\n const currentTotalSize = query('GET_ACTIVE_ITEMS').reduce((total, item) => {\n return total + item.fileSize;\n }, 0);\n\n // get the size of the new file\n if (currentTotalSize > totalSizeMax) {\n reject({\n status: {\n main: query('GET_LABEL_MAX_TOTAL_FILE_SIZE_EXCEEDED'),\n sub: replaceInString(query('GET_LABEL_MAX_TOTAL_FILE_SIZE'), {\n filesize: toNaturalFileSize(\n totalSizeMax,\n '.',\n query('GET_FILE_SIZE_BASE'),\n query('GET_FILE_SIZE_LABELS', query)\n ),\n }),\n },\n });\n return;\n }\n }\n\n // file is fine, let's pass it back\n resolve(file);\n })\n );\n\n return {\n options: {\n // Enable or disable file type validation\n allowFileSizeValidation: [true, Type.BOOLEAN],\n\n // Max individual file size in bytes\n maxFileSize: [null, Type.INT],\n\n // Min individual file size in bytes\n minFileSize: [null, Type.INT],\n\n // Max total file size in bytes\n maxTotalFileSize: [null, Type.INT],\n\n // Filter the files that need to be validated for size\n fileValidateSizeFilter: [null, Type.FUNCTION],\n\n // error labels\n labelMinFileSizeExceeded: ['File is too small', Type.STRING],\n labelMinFileSize: ['Minimum file size is {filesize}', Type.STRING],\n\n labelMaxFileSizeExceeded: ['File is too large', Type.STRING],\n labelMaxFileSize: ['Maximum file size is {filesize}', Type.STRING],\n\n labelMaxTotalFileSizeExceeded: ['Maximum total size exceeded', Type.STRING],\n labelMaxTotalFileSize: ['Maximum total file size is {filesize}', Type.STRING],\n },\n };\n};\n\n// fire pluginloaded event if running in browser, this allows registering the plugin when using async script tags\nconst isBrowser = typeof window !== 'undefined' && typeof window.document !== 'undefined';\nif (isBrowser) {\n document.dispatchEvent(new CustomEvent('FilePond:pluginloaded', { detail: plugin }));\n}\n\nexport default plugin;\n","/**!\n * Sortable 1.15.7\n * @author\tRubaXa <trash@rubaxa.org>\n * @author\towenm <owen23355@gmail.com>\n * @license MIT\n */\nfunction _arrayLikeToArray(r, a) {\n (null == a || a > r.length) && (a = r.length);\n for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e];\n return n;\n}\nfunction _arrayWithoutHoles(r) {\n if (Array.isArray(r)) return _arrayLikeToArray(r);\n}\nfunction _defineProperty(e, r, t) {\n return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, {\n value: t,\n enumerable: !0,\n configurable: !0,\n writable: !0\n }) : e[r] = t, e;\n}\nfunction _extends() {\n return _extends = Object.assign ? Object.assign.bind() : function (n) {\n for (var e = 1; e < arguments.length; e++) {\n var t = arguments[e];\n for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]);\n }\n return n;\n }, _extends.apply(null, arguments);\n}\nfunction _iterableToArray(r) {\n if (\"undefined\" != typeof Symbol && null != r[Symbol.iterator] || null != r[\"@@iterator\"]) return Array.from(r);\n}\nfunction _nonIterableSpread() {\n throw new TypeError(\"Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}\nfunction ownKeys(e, r) {\n var t = Object.keys(e);\n if (Object.getOwnPropertySymbols) {\n var o = Object.getOwnPropertySymbols(e);\n r && (o = o.filter(function (r) {\n return Object.getOwnPropertyDescriptor(e, r).enumerable;\n })), t.push.apply(t, o);\n }\n return t;\n}\nfunction _objectSpread2(e) {\n for (var r = 1; r < arguments.length; r++) {\n var t = null != arguments[r] ? arguments[r] : {};\n r % 2 ? ownKeys(Object(t), !0).forEach(function (r) {\n _defineProperty(e, r, t[r]);\n }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) {\n Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r));\n });\n }\n return e;\n}\nfunction _objectWithoutProperties(e, t) {\n if (null == e) return {};\n var o,\n r,\n i = _objectWithoutPropertiesLoose(e, t);\n if (Object.getOwnPropertySymbols) {\n var n = Object.getOwnPropertySymbols(e);\n for (r = 0; r < n.length; r++) o = n[r], -1 === t.indexOf(o) && {}.propertyIsEnumerable.call(e, o) && (i[o] = e[o]);\n }\n return i;\n}\nfunction _objectWithoutPropertiesLoose(r, e) {\n if (null == r) return {};\n var t = {};\n for (var n in r) if ({}.hasOwnProperty.call(r, n)) {\n if (-1 !== e.indexOf(n)) continue;\n t[n] = r[n];\n }\n return t;\n}\nfunction _toConsumableArray(r) {\n return _arrayWithoutHoles(r) || _iterableToArray(r) || _unsupportedIterableToArray(r) || _nonIterableSpread();\n}\nfunction _toPrimitive(t, r) {\n if (\"object\" != typeof t || !t) return t;\n var e = t[Symbol.toPrimitive];\n if (void 0 !== e) {\n var i = e.call(t, r || \"default\");\n if (\"object\" != typeof i) return i;\n throw new TypeError(\"@@toPrimitive must return a primitive value.\");\n }\n return (\"string\" === r ? String : Number)(t);\n}\nfunction _toPropertyKey(t) {\n var i = _toPrimitive(t, \"string\");\n return \"symbol\" == typeof i ? i : i + \"\";\n}\nfunction _typeof(o) {\n \"@babel/helpers - typeof\";\n\n return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) {\n return typeof o;\n } : function (o) {\n return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o;\n }, _typeof(o);\n}\nfunction _unsupportedIterableToArray(r, a) {\n if (r) {\n if (\"string\" == typeof r) return _arrayLikeToArray(r, a);\n var t = {}.toString.call(r).slice(8, -1);\n return \"Object\" === t && r.constructor && (t = r.constructor.name), \"Map\" === t || \"Set\" === t ? Array.from(r) : \"Arguments\" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0;\n }\n}\n\nvar version = \"1.15.7\";\n\nfunction userAgent(pattern) {\n if (typeof window !== 'undefined' && window.navigator) {\n return !! /*@__PURE__*/navigator.userAgent.match(pattern);\n }\n}\nvar IE11OrLess = userAgent(/(?:Trident.*rv[ :]?11\\.|msie|iemobile|Windows Phone)/i);\nvar Edge = userAgent(/Edge/i);\nvar FireFox = userAgent(/firefox/i);\nvar Safari = userAgent(/safari/i) && !userAgent(/chrome/i) && !userAgent(/android/i);\nvar IOS = userAgent(/iP(ad|od|hone)/i);\nvar ChromeForAndroid = userAgent(/chrome/i) && userAgent(/android/i);\n\nvar captureMode = {\n capture: false,\n passive: false\n};\nfunction on(el, event, fn) {\n el.addEventListener(event, fn, !IE11OrLess && captureMode);\n}\nfunction off(el, event, fn) {\n el.removeEventListener(event, fn, !IE11OrLess && captureMode);\n}\nfunction matches( /**HTMLElement*/el, /**String*/selector) {\n if (!selector) return;\n selector[0] === '>' && (selector = selector.substring(1));\n if (el) {\n try {\n if (el.matches) {\n return el.matches(selector);\n } else if (el.msMatchesSelector) {\n return el.msMatchesSelector(selector);\n } else if (el.webkitMatchesSelector) {\n return el.webkitMatchesSelector(selector);\n }\n } catch (_) {\n return false;\n }\n }\n return false;\n}\nfunction getParentOrHost(el) {\n return el.host && el !== document && el.host.nodeType && el.host !== el ? el.host : el.parentNode;\n}\nfunction closest( /**HTMLElement*/el, /**String*/selector, /**HTMLElement*/ctx, includeCTX) {\n if (el) {\n ctx = ctx || document;\n do {\n if (selector != null && (selector[0] === '>' ? el.parentNode === ctx && matches(el, selector) : matches(el, selector)) || includeCTX && el === ctx) {\n return el;\n }\n if (el === ctx) break;\n /* jshint boss:true */\n } while (el = getParentOrHost(el));\n }\n return null;\n}\nvar R_SPACE = /\\s+/g;\nfunction toggleClass(el, name, state) {\n if (el && name) {\n if (el.classList) {\n el.classList[state ? 'add' : 'remove'](name);\n } else {\n var className = (' ' + el.className + ' ').replace(R_SPACE, ' ').replace(' ' + name + ' ', ' ');\n el.className = (className + (state ? ' ' + name : '')).replace(R_SPACE, ' ');\n }\n }\n}\nfunction css(el, prop, val) {\n var style = el && el.style;\n if (style) {\n if (val === void 0) {\n if (document.defaultView && document.defaultView.getComputedStyle) {\n val = document.defaultView.getComputedStyle(el, '');\n } else if (el.currentStyle) {\n val = el.currentStyle;\n }\n return prop === void 0 ? val : val[prop];\n } else {\n if (!(prop in style) && prop.indexOf('webkit') === -1) {\n prop = '-webkit-' + prop;\n }\n style[prop] = val + (typeof val === 'string' ? '' : 'px');\n }\n }\n}\nfunction matrix(el, selfOnly) {\n var appliedTransforms = '';\n if (typeof el === 'string') {\n appliedTransforms = el;\n } else {\n do {\n var transform = css(el, 'transform');\n if (transform && transform !== 'none') {\n appliedTransforms = transform + ' ' + appliedTransforms;\n }\n /* jshint boss:true */\n } while (!selfOnly && (el = el.parentNode));\n }\n var matrixFn = window.DOMMatrix || window.WebKitCSSMatrix || window.CSSMatrix || window.MSCSSMatrix;\n /*jshint -W056 */\n return matrixFn && new matrixFn(appliedTransforms);\n}\nfunction find(ctx, tagName, iterator) {\n if (ctx) {\n var list = ctx.getElementsByTagName(tagName),\n i = 0,\n n = list.length;\n if (iterator) {\n for (; i < n; i++) {\n iterator(list[i], i);\n }\n }\n return list;\n }\n return [];\n}\nfunction getWindowScrollingElement() {\n var scrollingElement = document.scrollingElement;\n if (scrollingElement) {\n return scrollingElement;\n } else {\n return document.documentElement;\n }\n}\n\n/**\r\n * Returns the \"bounding client rect\" of given element\r\n * @param {HTMLElement} el The element whose boundingClientRect is wanted\r\n * @param {[Boolean]} relativeToContainingBlock Whether the rect should be relative to the containing block of (including) the container\r\n * @param {[Boolean]} relativeToNonStaticParent Whether the rect should be relative to the relative parent of (including) the contaienr\r\n * @param {[Boolean]} undoScale Whether the container's scale() should be undone\r\n * @param {[HTMLElement]} container The parent the element will be placed in\r\n * @return {Object} The boundingClientRect of el, with specified adjustments\r\n */\nfunction getRect(el, relativeToContainingBlock, relativeToNonStaticParent, undoScale, container) {\n if (!el.getBoundingClientRect && el !== window) return;\n var elRect, top, left, bottom, right, height, width;\n if (el !== window && el.parentNode && el !== getWindowScrollingElement()) {\n elRect = el.getBoundingClientRect();\n top = elRect.top;\n left = elRect.left;\n bottom = elRect.bottom;\n right = elRect.right;\n height = elRect.height;\n width = elRect.width;\n } else {\n top = 0;\n left = 0;\n bottom = window.innerHeight;\n right = window.innerWidth;\n height = window.innerHeight;\n width = window.innerWidth;\n }\n if ((relativeToContainingBlock || relativeToNonStaticParent) && el !== window) {\n // Adjust for translate()\n container = container || el.parentNode;\n\n // solves #1123 (see: https://stackoverflow.com/a/37953806/6088312)\n // Not needed on <= IE11\n if (!IE11OrLess) {\n do {\n if (container && container.getBoundingClientRect && (css(container, 'transform') !== 'none' || relativeToNonStaticParent && css(container, 'position') !== 'static')) {\n var containerRect = container.getBoundingClientRect();\n\n // Set relative to edges of padding box of container\n top -= containerRect.top + parseInt(css(container, 'border-top-width'));\n left -= containerRect.left + parseInt(css(container, 'border-left-width'));\n bottom = top + elRect.height;\n right = left + elRect.width;\n break;\n }\n /* jshint boss:true */\n } while (container = container.parentNode);\n }\n }\n if (undoScale && el !== window) {\n // Adjust for scale()\n var elMatrix = matrix(container || el),\n scaleX = elMatrix && elMatrix.a,\n scaleY = elMatrix && elMatrix.d;\n if (elMatrix) {\n top /= scaleY;\n left /= scaleX;\n width /= scaleX;\n height /= scaleY;\n bottom = top + height;\n right = left + width;\n }\n }\n return {\n top: top,\n left: left,\n bottom: bottom,\n right: right,\n width: width,\n height: height\n };\n}\n\n/**\r\n * Checks if a side of an element is scrolled past a side of its parents\r\n * @param {HTMLElement} el The element who's side being scrolled out of view is in question\r\n * @param {String} elSide Side of the element in question ('top', 'left', 'right', 'bottom')\r\n * @param {String} parentSide Side of the parent in question ('top', 'left', 'right', 'bottom')\r\n * @return {HTMLElement} The parent scroll element that the el's side is scrolled past, or null if there is no such element\r\n */\nfunction isScrolledPast(el, elSide, parentSide) {\n var parent = getParentAutoScrollElement(el, true),\n elSideVal = getRect(el)[elSide];\n\n /* jshint boss:true */\n while (parent) {\n var parentSideVal = getRect(parent)[parentSide],\n visible = void 0;\n if (parentSide === 'top' || parentSide === 'left') {\n visible = elSideVal >= parentSideVal;\n } else {\n visible = elSideVal <= parentSideVal;\n }\n if (!visible) return parent;\n if (parent === getWindowScrollingElement()) break;\n parent = getParentAutoScrollElement(parent, false);\n }\n return false;\n}\n\n/**\r\n * Gets nth child of el, ignoring hidden children, sortable's elements (does not ignore clone if it's visible)\r\n * and non-draggable elements\r\n * @param {HTMLElement} el The parent element\r\n * @param {Number} childNum The index of the child\r\n * @param {Object} options Parent Sortable's options\r\n * @return {HTMLElement} The child at index childNum, or null if not found\r\n */\nfunction getChild(el, childNum, options, includeDragEl) {\n var currentChild = 0,\n i = 0,\n children = el.children;\n while (i < children.length) {\n if (children[i].style.display !== 'none' && children[i] !== Sortable.ghost && (includeDragEl || children[i] !== Sortable.dragged) && closest(children[i], options.draggable, el, false)) {\n if (currentChild === childNum) {\n return children[i];\n }\n currentChild++;\n }\n i++;\n }\n return null;\n}\n\n/**\r\n * Gets the last child in the el, ignoring ghostEl or invisible elements (clones)\r\n * @param {HTMLElement} el Parent element\r\n * @param {selector} selector Any other elements that should be ignored\r\n * @return {HTMLElement} The last child, ignoring ghostEl\r\n */\nfunction lastChild(el, selector) {\n var last = el.lastElementChild;\n while (last && (last === Sortable.ghost || css(last, 'display') === 'none' || selector && !matches(last, selector))) {\n last = last.previousElementSibling;\n }\n return last || null;\n}\n\n/**\r\n * Returns the index of an element within its parent for a selected set of\r\n * elements\r\n * @param {HTMLElement} el\r\n * @param {selector} selector\r\n * @return {number}\r\n */\nfunction index(el, selector) {\n var index = 0;\n if (!el || !el.parentNode) {\n return -1;\n }\n\n /* jshint boss:true */\n while (el = el.previousElementSibling) {\n if (el.nodeName.toUpperCase() !== 'TEMPLATE' && el !== Sortable.clone && (!selector || matches(el, selector))) {\n index++;\n }\n }\n return index;\n}\n\n/**\r\n * Returns the scroll offset of the given element, added with all the scroll offsets of parent elements.\r\n * The value is returned in real pixels.\r\n * @param {HTMLElement} el\r\n * @return {Array} Offsets in the format of [left, top]\r\n */\nfunction getRelativeScrollOffset(el) {\n var offsetLeft = 0,\n offsetTop = 0,\n winScroller = getWindowScrollingElement();\n if (el) {\n do {\n var elMatrix = matrix(el),\n scaleX = elMatrix.a,\n scaleY = elMatrix.d;\n offsetLeft += el.scrollLeft * scaleX;\n offsetTop += el.scrollTop * scaleY;\n } while (el !== winScroller && (el = el.parentNode));\n }\n return [offsetLeft, offsetTop];\n}\n\n/**\r\n * Returns the index of the object within the given array\r\n * @param {Array} arr Array that may or may not hold the object\r\n * @param {Object} obj An object that has a key-value pair unique to and identical to a key-value pair in the object you want to find\r\n * @return {Number} The index of the object in the array, or -1\r\n */\nfunction indexOfObject(arr, obj) {\n for (var i in arr) {\n if (!arr.hasOwnProperty(i)) continue;\n for (var key in obj) {\n if (obj.hasOwnProperty(key) && obj[key] === arr[i][key]) return Number(i);\n }\n }\n return -1;\n}\nfunction getParentAutoScrollElement(el, includeSelf) {\n // skip to window\n if (!el || !el.getBoundingClientRect) return getWindowScrollingElement();\n var elem = el;\n var gotSelf = false;\n do {\n // we don't need to get elem css if it isn't even overflowing in the first place (performance)\n if (elem.clientWidth < elem.scrollWidth || elem.clientHeight < elem.scrollHeight) {\n var elemCSS = css(elem);\n if (elem.clientWidth < elem.scrollWidth && (elemCSS.overflowX == 'auto' || elemCSS.overflowX == 'scroll') || elem.clientHeight < elem.scrollHeight && (elemCSS.overflowY == 'auto' || elemCSS.overflowY == 'scroll')) {\n if (!elem.getBoundingClientRect || elem === document.body) return getWindowScrollingElement();\n if (gotSelf || includeSelf) return elem;\n gotSelf = true;\n }\n }\n /* jshint boss:true */\n } while (elem = elem.parentNode);\n return getWindowScrollingElement();\n}\nfunction extend(dst, src) {\n if (dst && src) {\n for (var key in src) {\n if (src.hasOwnProperty(key)) {\n dst[key] = src[key];\n }\n }\n }\n return dst;\n}\nfunction isRectEqual(rect1, rect2) {\n return Math.round(rect1.top) === Math.round(rect2.top) && Math.round(rect1.left) === Math.round(rect2.left) && Math.round(rect1.height) === Math.round(rect2.height) && Math.round(rect1.width) === Math.round(rect2.width);\n}\nvar _throttleTimeout;\nfunction throttle(callback, ms) {\n return function () {\n if (!_throttleTimeout) {\n var args = arguments,\n _this = this;\n if (args.length === 1) {\n callback.call(_this, args[0]);\n } else {\n callback.apply(_this, args);\n }\n _throttleTimeout = setTimeout(function () {\n _throttleTimeout = void 0;\n }, ms);\n }\n };\n}\nfunction cancelThrottle() {\n clearTimeout(_throttleTimeout);\n _throttleTimeout = void 0;\n}\nfunction scrollBy(el, x, y) {\n el.scrollLeft += x;\n el.scrollTop += y;\n}\nfunction clone(el) {\n var Polymer = window.Polymer;\n var $ = window.jQuery || window.Zepto;\n if (Polymer && Polymer.dom) {\n return Polymer.dom(el).cloneNode(true);\n } else if ($) {\n return $(el).clone(true)[0];\n } else {\n return el.cloneNode(true);\n }\n}\nfunction setRect(el, rect) {\n css(el, 'position', 'absolute');\n css(el, 'top', rect.top);\n css(el, 'left', rect.left);\n css(el, 'width', rect.width);\n css(el, 'height', rect.height);\n}\nfunction unsetRect(el) {\n css(el, 'position', '');\n css(el, 'top', '');\n css(el, 'left', '');\n css(el, 'width', '');\n css(el, 'height', '');\n}\nfunction getChildContainingRectFromElement(container, options, ghostEl) {\n var rect = {};\n Array.from(container.children).forEach(function (child) {\n var _rect$left, _rect$top, _rect$right, _rect$bottom;\n if (!closest(child, options.draggable, container, false) || child.animated || child === ghostEl) return;\n var childRect = getRect(child);\n rect.left = Math.min((_rect$left = rect.left) !== null && _rect$left !== void 0 ? _rect$left : Infinity, childRect.left);\n rect.top = Math.min((_rect$top = rect.top) !== null && _rect$top !== void 0 ? _rect$top : Infinity, childRect.top);\n rect.right = Math.max((_rect$right = rect.right) !== null && _rect$right !== void 0 ? _rect$right : -Infinity, childRect.right);\n rect.bottom = Math.max((_rect$bottom = rect.bottom) !== null && _rect$bottom !== void 0 ? _rect$bottom : -Infinity, childRect.bottom);\n });\n rect.width = rect.right - rect.left;\n rect.height = rect.bottom - rect.top;\n rect.x = rect.left;\n rect.y = rect.top;\n return rect;\n}\nvar expando = 'Sortable' + new Date().getTime();\n\nfunction AnimationStateManager() {\n var animationStates = [],\n animationCallbackId;\n return {\n captureAnimationState: function captureAnimationState() {\n animationStates = [];\n if (!this.options.animation) return;\n var children = [].slice.call(this.el.children);\n children.forEach(function (child) {\n if (css(child, 'display') === 'none' || child === Sortable.ghost) return;\n animationStates.push({\n target: child,\n rect: getRect(child)\n });\n var fromRect = _objectSpread2({}, animationStates[animationStates.length - 1].rect);\n\n // If animating: compensate for current animation\n if (child.thisAnimationDuration) {\n var childMatrix = matrix(child, true);\n if (childMatrix) {\n fromRect.top -= childMatrix.f;\n fromRect.left -= childMatrix.e;\n }\n }\n child.fromRect = fromRect;\n });\n },\n addAnimationState: function addAnimationState(state) {\n animationStates.push(state);\n },\n removeAnimationState: function removeAnimationState(target) {\n animationStates.splice(indexOfObject(animationStates, {\n target: target\n }), 1);\n },\n animateAll: function animateAll(callback) {\n var _this = this;\n if (!this.options.animation) {\n clearTimeout(animationCallbackId);\n if (typeof callback === 'function') callback();\n return;\n }\n var animating = false,\n animationTime = 0;\n animationStates.forEach(function (state) {\n var time = 0,\n target = state.target,\n fromRect = target.fromRect,\n toRect = getRect(target),\n prevFromRect = target.prevFromRect,\n prevToRect = target.prevToRect,\n animatingRect = state.rect,\n targetMatrix = matrix(target, true);\n if (targetMatrix) {\n // Compensate for current animation\n toRect.top -= targetMatrix.f;\n toRect.left -= targetMatrix.e;\n }\n target.toRect = toRect;\n if (target.thisAnimationDuration) {\n // Could also check if animatingRect is between fromRect and toRect\n if (isRectEqual(prevFromRect, toRect) && !isRectEqual(fromRect, toRect) &&\n // Make sure animatingRect is on line between toRect & fromRect\n (animatingRect.top - toRect.top) / (animatingRect.left - toRect.left) === (fromRect.top - toRect.top) / (fromRect.left - toRect.left)) {\n // If returning to same place as started from animation and on same axis\n time = calculateRealTime(animatingRect, prevFromRect, prevToRect, _this.options);\n }\n }\n\n // if fromRect != toRect: animate\n if (!isRectEqual(toRect, fromRect)) {\n target.prevFromRect = fromRect;\n target.prevToRect = toRect;\n if (!time) {\n time = _this.options.animation;\n }\n _this.animate(target, animatingRect, toRect, time);\n }\n if (time) {\n animating = true;\n animationTime = Math.max(animationTime, time);\n clearTimeout(target.animationResetTimer);\n target.animationResetTimer = setTimeout(function () {\n target.animationTime = 0;\n target.prevFromRect = null;\n target.fromRect = null;\n target.prevToRect = null;\n target.thisAnimationDuration = null;\n }, time);\n target.thisAnimationDuration = time;\n }\n });\n clearTimeout(animationCallbackId);\n if (!animating) {\n if (typeof callback === 'function') callback();\n } else {\n animationCallbackId = setTimeout(function () {\n if (typeof callback === 'function') callback();\n }, animationTime);\n }\n animationStates = [];\n },\n animate: function animate(target, currentRect, toRect, duration) {\n if (duration) {\n css(target, 'transition', '');\n css(target, 'transform', '');\n var elMatrix = matrix(this.el),\n scaleX = elMatrix && elMatrix.a,\n scaleY = elMatrix && elMatrix.d,\n translateX = (currentRect.left - toRect.left) / (scaleX || 1),\n translateY = (currentRect.top - toRect.top) / (scaleY || 1);\n target.animatingX = !!translateX;\n target.animatingY = !!translateY;\n css(target, 'transform', 'translate3d(' + translateX + 'px,' + translateY + 'px,0)');\n this.forRepaintDummy = repaint(target); // repaint\n\n css(target, 'transition', 'transform ' + duration + 'ms' + (this.options.easing ? ' ' + this.options.easing : ''));\n css(target, 'transform', 'translate3d(0,0,0)');\n typeof target.animated === 'number' && clearTimeout(target.animated);\n target.animated = setTimeout(function () {\n css(target, 'transition', '');\n css(target, 'transform', '');\n target.animated = false;\n target.animatingX = false;\n target.animatingY = false;\n }, duration);\n }\n }\n };\n}\nfunction repaint(target) {\n return target.offsetWidth;\n}\nfunction calculateRealTime(animatingRect, fromRect, toRect, options) {\n return Math.sqrt(Math.pow(fromRect.top - animatingRect.top, 2) + Math.pow(fromRect.left - animatingRect.left, 2)) / Math.sqrt(Math.pow(fromRect.top - toRect.top, 2) + Math.pow(fromRect.left - toRect.left, 2)) * options.animation;\n}\n\nvar plugins = [];\nvar defaults = {\n initializeByDefault: true\n};\nvar PluginManager = {\n mount: function mount(plugin) {\n // Set default static properties\n for (var option in defaults) {\n if (defaults.hasOwnProperty(option) && !(option in plugin)) {\n plugin[option] = defaults[option];\n }\n }\n plugins.forEach(function (p) {\n if (p.pluginName === plugin.pluginName) {\n throw \"Sortable: Cannot mount plugin \".concat(plugin.pluginName, \" more than once\");\n }\n });\n plugins.push(plugin);\n },\n pluginEvent: function pluginEvent(eventName, sortable, evt) {\n var _this = this;\n this.eventCanceled = false;\n evt.cancel = function () {\n _this.eventCanceled = true;\n };\n var eventNameGlobal = eventName + 'Global';\n plugins.forEach(function (plugin) {\n if (!sortable[plugin.pluginName]) return;\n // Fire global events if it exists in this sortable\n if (sortable[plugin.pluginName][eventNameGlobal]) {\n sortable[plugin.pluginName][eventNameGlobal](_objectSpread2({\n sortable: sortable\n }, evt));\n }\n\n // Only fire plugin event if plugin is enabled in this sortable,\n // and plugin has event defined\n if (sortable.options[plugin.pluginName] && sortable[plugin.pluginName][eventName]) {\n sortable[plugin.pluginName][eventName](_objectSpread2({\n sortable: sortable\n }, evt));\n }\n });\n },\n initializePlugins: function initializePlugins(sortable, el, defaults, options) {\n plugins.forEach(function (plugin) {\n var pluginName = plugin.pluginName;\n if (!sortable.options[pluginName] && !plugin.initializeByDefault) return;\n var initialized = new plugin(sortable, el, sortable.options);\n initialized.sortable = sortable;\n initialized.options = sortable.options;\n sortable[pluginName] = initialized;\n\n // Add default options from plugin\n _extends(defaults, initialized.defaults);\n });\n for (var option in sortable.options) {\n if (!sortable.options.hasOwnProperty(option)) continue;\n var modified = this.modifyOption(sortable, option, sortable.options[option]);\n if (typeof modified !== 'undefined') {\n sortable.options[option] = modified;\n }\n }\n },\n getEventProperties: function getEventProperties(name, sortable) {\n var eventProperties = {};\n plugins.forEach(function (plugin) {\n if (typeof plugin.eventProperties !== 'function') return;\n _extends(eventProperties, plugin.eventProperties.call(sortable[plugin.pluginName], name));\n });\n return eventProperties;\n },\n modifyOption: function modifyOption(sortable, name, value) {\n var modifiedValue;\n plugins.forEach(function (plugin) {\n // Plugin must exist on the Sortable\n if (!sortable[plugin.pluginName]) return;\n\n // If static option listener exists for this option, call in the context of the Sortable's instance of this plugin\n if (plugin.optionListeners && typeof plugin.optionListeners[name] === 'function') {\n modifiedValue = plugin.optionListeners[name].call(sortable[plugin.pluginName], value);\n }\n });\n return modifiedValue;\n }\n};\n\nfunction dispatchEvent(_ref) {\n var sortable = _ref.sortable,\n rootEl = _ref.rootEl,\n name = _ref.name,\n targetEl = _ref.targetEl,\n cloneEl = _ref.cloneEl,\n toEl = _ref.toEl,\n fromEl = _ref.fromEl,\n oldIndex = _ref.oldIndex,\n newIndex = _ref.newIndex,\n oldDraggableIndex = _ref.oldDraggableIndex,\n newDraggableIndex = _ref.newDraggableIndex,\n originalEvent = _ref.originalEvent,\n putSortable = _ref.putSortable,\n extraEventProperties = _ref.extraEventProperties;\n sortable = sortable || rootEl && rootEl[expando];\n if (!sortable) return;\n var evt,\n options = sortable.options,\n onName = 'on' + name.charAt(0).toUpperCase() + name.substr(1);\n // Support for new CustomEvent feature\n if (window.CustomEvent && !IE11OrLess && !Edge) {\n evt = new CustomEvent(name, {\n bubbles: true,\n cancelable: true\n });\n } else {\n evt = document.createEvent('Event');\n evt.initEvent(name, true, true);\n }\n evt.to = toEl || rootEl;\n evt.from = fromEl || rootEl;\n evt.item = targetEl || rootEl;\n evt.clone = cloneEl;\n evt.oldIndex = oldIndex;\n evt.newIndex = newIndex;\n evt.oldDraggableIndex = oldDraggableIndex;\n evt.newDraggableIndex = newDraggableIndex;\n evt.originalEvent = originalEvent;\n evt.pullMode = putSortable ? putSortable.lastPutMode : undefined;\n var allEventProperties = _objectSpread2(_objectSpread2({}, extraEventProperties), PluginManager.getEventProperties(name, sortable));\n for (var option in allEventProperties) {\n evt[option] = allEventProperties[option];\n }\n if (rootEl) {\n rootEl.dispatchEvent(evt);\n }\n if (options[onName]) {\n options[onName].call(sortable, evt);\n }\n}\n\nvar _excluded = [\"evt\"];\nvar pluginEvent = function pluginEvent(eventName, sortable) {\n var _ref = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {},\n originalEvent = _ref.evt,\n data = _objectWithoutProperties(_ref, _excluded);\n PluginManager.pluginEvent.bind(Sortable)(eventName, sortable, _objectSpread2({\n dragEl: dragEl,\n parentEl: parentEl,\n ghostEl: ghostEl,\n rootEl: rootEl,\n nextEl: nextEl,\n lastDownEl: lastDownEl,\n cloneEl: cloneEl,\n cloneHidden: cloneHidden,\n dragStarted: moved,\n putSortable: putSortable,\n activeSortable: Sortable.active,\n originalEvent: originalEvent,\n oldIndex: oldIndex,\n oldDraggableIndex: oldDraggableIndex,\n newIndex: newIndex,\n newDraggableIndex: newDraggableIndex,\n hideGhostForTarget: _hideGhostForTarget,\n unhideGhostForTarget: _unhideGhostForTarget,\n cloneNowHidden: function cloneNowHidden() {\n cloneHidden = true;\n },\n cloneNowShown: function cloneNowShown() {\n cloneHidden = false;\n },\n dispatchSortableEvent: function dispatchSortableEvent(name) {\n _dispatchEvent({\n sortable: sortable,\n name: name,\n originalEvent: originalEvent\n });\n }\n }, data));\n};\nfunction _dispatchEvent(info) {\n dispatchEvent(_objectSpread2({\n putSortable: putSortable,\n cloneEl: cloneEl,\n targetEl: dragEl,\n rootEl: rootEl,\n oldIndex: oldIndex,\n oldDraggableIndex: oldDraggableIndex,\n newIndex: newIndex,\n newDraggableIndex: newDraggableIndex\n }, info));\n}\nvar dragEl,\n parentEl,\n ghostEl,\n rootEl,\n nextEl,\n lastDownEl,\n cloneEl,\n cloneHidden,\n oldIndex,\n newIndex,\n oldDraggableIndex,\n newDraggableIndex,\n activeGroup,\n putSortable,\n awaitingDragStarted = false,\n ignoreNextClick = false,\n sortables = [],\n tapEvt,\n touchEvt,\n lastDx,\n lastDy,\n tapDistanceLeft,\n tapDistanceTop,\n moved,\n lastTarget,\n lastDirection,\n pastFirstInvertThresh = false,\n isCircumstantialInvert = false,\n targetMoveDistance,\n // For positioning ghost absolutely\n ghostRelativeParent,\n ghostRelativeParentInitialScroll = [],\n // (left, top)\n\n _silent = false,\n savedInputChecked = [];\n\n/** @const */\nvar documentExists = typeof document !== 'undefined',\n PositionGhostAbsolutely = IOS,\n CSSFloatProperty = Edge || IE11OrLess ? 'cssFloat' : 'float',\n // This will not pass for IE9, because IE9 DnD only works on anchors\n supportDraggable = documentExists && !ChromeForAndroid && !IOS && 'draggable' in document.createElement('div'),\n supportCssPointerEvents = function () {\n if (!documentExists) return;\n // false when <= IE11\n if (IE11OrLess) {\n return false;\n }\n var el = document.createElement('x');\n el.style.cssText = 'pointer-events:auto';\n return el.style.pointerEvents === 'auto';\n }(),\n _detectDirection = function _detectDirection(el, options) {\n var elCSS = css(el),\n elWidth = parseInt(elCSS.width) - parseInt(elCSS.paddingLeft) - parseInt(elCSS.paddingRight) - parseInt(elCSS.borderLeftWidth) - parseInt(elCSS.borderRightWidth),\n child1 = getChild(el, 0, options),\n child2 = getChild(el, 1, options),\n firstChildCSS = child1 && css(child1),\n secondChildCSS = child2 && css(child2),\n firstChildWidth = firstChildCSS && parseInt(firstChildCSS.marginLeft) + parseInt(firstChildCSS.marginRight) + getRect(child1).width,\n secondChildWidth = secondChildCSS && parseInt(secondChildCSS.marginLeft) + parseInt(secondChildCSS.marginRight) + getRect(child2).width;\n if (elCSS.display === 'flex') {\n return elCSS.flexDirection === 'column' || elCSS.flexDirection === 'column-reverse' ? 'vertical' : 'horizontal';\n }\n if (elCSS.display === 'grid') {\n return elCSS.gridTemplateColumns.split(' ').length <= 1 ? 'vertical' : 'horizontal';\n }\n if (child1 && firstChildCSS[\"float\"] && firstChildCSS[\"float\"] !== 'none') {\n var touchingSideChild2 = firstChildCSS[\"float\"] === 'left' ? 'left' : 'right';\n return child2 && (secondChildCSS.clear === 'both' || secondChildCSS.clear === touchingSideChild2) ? 'vertical' : 'horizontal';\n }\n return child1 && (firstChildCSS.display === 'block' || firstChildCSS.display === 'flex' || firstChildCSS.display === 'table' || firstChildCSS.display === 'grid' || firstChildWidth >= elWidth && elCSS[CSSFloatProperty] === 'none' || child2 && elCSS[CSSFloatProperty] === 'none' && firstChildWidth + secondChildWidth > elWidth) ? 'vertical' : 'horizontal';\n },\n _dragElInRowColumn = function _dragElInRowColumn(dragRect, targetRect, vertical) {\n var dragElS1Opp = vertical ? dragRect.left : dragRect.top,\n dragElS2Opp = vertical ? dragRect.right : dragRect.bottom,\n dragElOppLength = vertical ? dragRect.width : dragRect.height,\n targetS1Opp = vertical ? targetRect.left : targetRect.top,\n targetS2Opp = vertical ? targetRect.right : targetRect.bottom,\n targetOppLength = vertical ? targetRect.width : targetRect.height;\n return dragElS1Opp === targetS1Opp || dragElS2Opp === targetS2Opp || dragElS1Opp + dragElOppLength / 2 === targetS1Opp + targetOppLength / 2;\n },\n /**\r\n * Detects first nearest empty sortable to X and Y position using emptyInsertThreshold.\r\n * @param {Number} x X position\r\n * @param {Number} y Y position\r\n * @return {HTMLElement} Element of the first found nearest Sortable\r\n */\n _detectNearestEmptySortable = function _detectNearestEmptySortable(x, y) {\n var ret;\n sortables.some(function (sortable) {\n var threshold = sortable[expando].options.emptyInsertThreshold;\n if (!threshold || lastChild(sortable)) return;\n var rect = getRect(sortable),\n insideHorizontally = x >= rect.left - threshold && x <= rect.right + threshold,\n insideVertically = y >= rect.top - threshold && y <= rect.bottom + threshold;\n if (insideHorizontally && insideVertically) {\n return ret = sortable;\n }\n });\n return ret;\n },\n _prepareGroup = function _prepareGroup(options) {\n function toFn(value, pull) {\n return function (to, from, dragEl, evt) {\n var sameGroup = to.options.group.name && from.options.group.name && to.options.group.name === from.options.group.name;\n if (value == null && (pull || sameGroup)) {\n // Default pull value\n // Default pull and put value if same group\n return true;\n } else if (value == null || value === false) {\n return false;\n } else if (pull && value === 'clone') {\n return value;\n } else if (typeof value === 'function') {\n return toFn(value(to, from, dragEl, evt), pull)(to, from, dragEl, evt);\n } else {\n var otherGroup = (pull ? to : from).options.group.name;\n return value === true || typeof value === 'string' && value === otherGroup || value.join && value.indexOf(otherGroup) > -1;\n }\n };\n }\n var group = {};\n var originalGroup = options.group;\n if (!originalGroup || _typeof(originalGroup) != 'object') {\n originalGroup = {\n name: originalGroup\n };\n }\n group.name = originalGroup.name;\n group.checkPull = toFn(originalGroup.pull, true);\n group.checkPut = toFn(originalGroup.put);\n group.revertClone = originalGroup.revertClone;\n options.group = group;\n },\n _hideGhostForTarget = function _hideGhostForTarget() {\n if (!supportCssPointerEvents && ghostEl) {\n css(ghostEl, 'display', 'none');\n }\n },\n _unhideGhostForTarget = function _unhideGhostForTarget() {\n if (!supportCssPointerEvents && ghostEl) {\n css(ghostEl, 'display', '');\n }\n };\n\n// #1184 fix - Prevent click event on fallback if dragged but item not changed position\nif (documentExists && !ChromeForAndroid) {\n document.addEventListener('click', function (evt) {\n if (ignoreNextClick) {\n evt.preventDefault();\n evt.stopPropagation && evt.stopPropagation();\n evt.stopImmediatePropagation && evt.stopImmediatePropagation();\n ignoreNextClick = false;\n return false;\n }\n }, true);\n}\nvar nearestEmptyInsertDetectEvent = function nearestEmptyInsertDetectEvent(evt) {\n if (dragEl) {\n evt = evt.touches ? evt.touches[0] : evt;\n var nearest = _detectNearestEmptySortable(evt.clientX, evt.clientY);\n if (nearest) {\n // Create imitation event\n var event = {};\n for (var i in evt) {\n if (evt.hasOwnProperty(i)) {\n event[i] = evt[i];\n }\n }\n event.target = event.rootEl = nearest;\n event.preventDefault = void 0;\n event.stopPropagation = void 0;\n nearest[expando]._onDragOver(event);\n }\n }\n};\nvar _checkOutsideTargetEl = function _checkOutsideTargetEl(evt) {\n if (dragEl) {\n dragEl.parentNode[expando]._isOutsideThisEl(evt.target);\n }\n};\n\n/**\r\n * @class Sortable\r\n * @param {HTMLElement} el\r\n * @param {Object} [options]\r\n */\nfunction Sortable(el, options) {\n if (!(el && el.nodeType && el.nodeType === 1)) {\n throw \"Sortable: `el` must be an HTMLElement, not \".concat({}.toString.call(el));\n }\n this.el = el; // root element\n this.options = options = _extends({}, options);\n\n // Export instance\n el[expando] = this;\n var defaults = {\n group: null,\n sort: true,\n disabled: false,\n store: null,\n handle: null,\n draggable: /^[uo]l$/i.test(el.nodeName) ? '>li' : '>*',\n swapThreshold: 1,\n // percentage; 0 <= x <= 1\n invertSwap: false,\n // invert always\n invertedSwapThreshold: null,\n // will be set to same as swapThreshold if default\n removeCloneOnHide: true,\n direction: function direction() {\n return _detectDirection(el, this.options);\n },\n ghostClass: 'sortable-ghost',\n chosenClass: 'sortable-chosen',\n dragClass: 'sortable-drag',\n ignore: 'a, img',\n filter: null,\n preventOnFilter: true,\n animation: 0,\n easing: null,\n setData: function setData(dataTransfer, dragEl) {\n dataTransfer.setData('Text', dragEl.textContent);\n },\n dropBubble: false,\n dragoverBubble: false,\n dataIdAttr: 'data-id',\n delay: 0,\n delayOnTouchOnly: false,\n touchStartThreshold: (Number.parseInt ? Number : window).parseInt(window.devicePixelRatio, 10) || 1,\n forceFallback: false,\n fallbackClass: 'sortable-fallback',\n fallbackOnBody: false,\n fallbackTolerance: 0,\n fallbackOffset: {\n x: 0,\n y: 0\n },\n // Disabled on Safari: #1571; Enabled on Safari IOS: #2244\n supportPointer: Sortable.supportPointer !== false && 'PointerEvent' in window && (!Safari || IOS),\n emptyInsertThreshold: 5\n };\n PluginManager.initializePlugins(this, el, defaults);\n\n // Set default options\n for (var name in defaults) {\n !(name in options) && (options[name] = defaults[name]);\n }\n _prepareGroup(options);\n\n // Bind all private methods\n for (var fn in this) {\n if (fn.charAt(0) === '_' && typeof this[fn] === 'function') {\n this[fn] = this[fn].bind(this);\n }\n }\n\n // Setup drag mode\n this.nativeDraggable = options.forceFallback ? false : supportDraggable;\n if (this.nativeDraggable) {\n // Touch start threshold cannot be greater than the native dragstart threshold\n this.options.touchStartThreshold = 1;\n }\n\n // Bind events\n if (options.supportPointer) {\n on(el, 'pointerdown', this._onTapStart);\n } else {\n on(el, 'mousedown', this._onTapStart);\n on(el, 'touchstart', this._onTapStart);\n }\n if (this.nativeDraggable) {\n on(el, 'dragover', this);\n on(el, 'dragenter', this);\n }\n sortables.push(this.el);\n\n // Restore sorting\n options.store && options.store.get && this.sort(options.store.get(this) || []);\n\n // Add animation state manager\n _extends(this, AnimationStateManager());\n}\nSortable.prototype = /** @lends Sortable.prototype */{\n constructor: Sortable,\n _isOutsideThisEl: function _isOutsideThisEl(target) {\n if (!this.el.contains(target) && target !== this.el) {\n lastTarget = null;\n }\n },\n _getDirection: function _getDirection(evt, target) {\n return typeof this.options.direction === 'function' ? this.options.direction.call(this, evt, target, dragEl) : this.options.direction;\n },\n _onTapStart: function _onTapStart( /** Event|TouchEvent */evt) {\n if (!evt.cancelable) return;\n var _this = this,\n el = this.el,\n options = this.options,\n preventOnFilter = options.preventOnFilter,\n type = evt.type,\n touch = evt.touches && evt.touches[0] || evt.pointerType && evt.pointerType === 'touch' && evt,\n target = (touch || evt).target,\n originalTarget = evt.target.shadowRoot && (evt.path && evt.path[0] || evt.composedPath && evt.composedPath()[0]) || target,\n filter = options.filter;\n _saveInputCheckedState(el);\n\n // Don't trigger start event when an element is been dragged, otherwise the evt.oldindex always wrong when set option.group.\n if (dragEl) {\n return;\n }\n if (/mousedown|pointerdown/.test(type) && evt.button !== 0 || options.disabled) {\n return; // only left button and enabled\n }\n\n // cancel dnd if original target is content editable\n if (originalTarget.isContentEditable) {\n return;\n }\n\n // Safari ignores further event handling after mousedown\n if (!this.nativeDraggable && Safari && target && target.tagName.toUpperCase() === 'SELECT') {\n return;\n }\n target = closest(target, options.draggable, el, false);\n if (target && target.animated) {\n return;\n }\n if (lastDownEl === target) {\n // Ignoring duplicate `down`\n return;\n }\n\n // Get the index of the dragged element within its parent\n oldIndex = index(target);\n oldDraggableIndex = index(target, options.draggable);\n\n // Check filter\n if (typeof filter === 'function') {\n if (filter.call(this, evt, target, this)) {\n _dispatchEvent({\n sortable: _this,\n rootEl: originalTarget,\n name: 'filter',\n targetEl: target,\n toEl: el,\n fromEl: el\n });\n pluginEvent('filter', _this, {\n evt: evt\n });\n preventOnFilter && evt.preventDefault();\n return; // cancel dnd\n }\n } else if (filter) {\n filter = filter.split(',').some(function (criteria) {\n criteria = closest(originalTarget, criteria.trim(), el, false);\n if (criteria) {\n _dispatchEvent({\n sortable: _this,\n rootEl: criteria,\n name: 'filter',\n targetEl: target,\n fromEl: el,\n toEl: el\n });\n pluginEvent('filter', _this, {\n evt: evt\n });\n return true;\n }\n });\n if (filter) {\n preventOnFilter && evt.preventDefault();\n return; // cancel dnd\n }\n }\n if (options.handle && !closest(originalTarget, options.handle, el, false)) {\n return;\n }\n\n // Prepare `dragstart`\n this._prepareDragStart(evt, touch, target);\n },\n _prepareDragStart: function _prepareDragStart( /** Event */evt, /** Touch */touch, /** HTMLElement */target) {\n var _this = this,\n el = _this.el,\n options = _this.options,\n ownerDocument = el.ownerDocument,\n dragStartFn;\n if (target && !dragEl && target.parentNode === el) {\n var dragRect = getRect(target);\n rootEl = el;\n dragEl = target;\n parentEl = dragEl.parentNode;\n nextEl = dragEl.nextSibling;\n lastDownEl = target;\n activeGroup = options.group;\n Sortable.dragged = dragEl;\n tapEvt = {\n target: dragEl,\n clientX: (touch || evt).clientX,\n clientY: (touch || evt).clientY\n };\n tapDistanceLeft = tapEvt.clientX - dragRect.left;\n tapDistanceTop = tapEvt.clientY - dragRect.top;\n this._lastX = (touch || evt).clientX;\n this._lastY = (touch || evt).clientY;\n dragEl.style['will-change'] = 'all';\n dragStartFn = function dragStartFn() {\n pluginEvent('delayEnded', _this, {\n evt: evt\n });\n if (Sortable.eventCanceled) {\n _this._onDrop();\n return;\n }\n // Delayed drag has been triggered\n // we can re-enable the events: touchmove/mousemove\n _this._disableDelayedDragEvents();\n if (!FireFox && _this.nativeDraggable) {\n dragEl.draggable = true;\n }\n\n // Bind the events: dragstart/dragend\n _this._triggerDragStart(evt, touch);\n\n // Drag start event\n _dispatchEvent({\n sortable: _this,\n name: 'choose',\n originalEvent: evt\n });\n\n // Chosen item\n toggleClass(dragEl, options.chosenClass, true);\n };\n\n // Disable \"draggable\"\n options.ignore.split(',').forEach(function (criteria) {\n find(dragEl, criteria.trim(), _disableDraggable);\n });\n on(ownerDocument, 'dragover', nearestEmptyInsertDetectEvent);\n on(ownerDocument, 'mousemove', nearestEmptyInsertDetectEvent);\n on(ownerDocument, 'touchmove', nearestEmptyInsertDetectEvent);\n if (options.supportPointer) {\n on(ownerDocument, 'pointerup', _this._onDrop);\n // Native D&D triggers pointercancel\n !this.nativeDraggable && on(ownerDocument, 'pointercancel', _this._onDrop);\n } else {\n on(ownerDocument, 'mouseup', _this._onDrop);\n on(ownerDocument, 'touchend', _this._onDrop);\n on(ownerDocument, 'touchcancel', _this._onDrop);\n }\n\n // Make dragEl draggable (must be before delay for FireFox)\n if (FireFox && this.nativeDraggable) {\n this.options.touchStartThreshold = 4;\n dragEl.draggable = true;\n }\n pluginEvent('delayStart', this, {\n evt: evt\n });\n\n // Delay is impossible for native DnD in Edge or IE\n if (options.delay && (!options.delayOnTouchOnly || touch) && (!this.nativeDraggable || !(Edge || IE11OrLess))) {\n if (Sortable.eventCanceled) {\n this._onDrop();\n return;\n }\n // If the user moves the pointer or let go the click or touch\n // before the delay has been reached:\n // disable the delayed drag\n if (options.supportPointer) {\n on(ownerDocument, 'pointerup', _this._disableDelayedDrag);\n on(ownerDocument, 'pointercancel', _this._disableDelayedDrag);\n } else {\n on(ownerDocument, 'mouseup', _this._disableDelayedDrag);\n on(ownerDocument, 'touchend', _this._disableDelayedDrag);\n on(ownerDocument, 'touchcancel', _this._disableDelayedDrag);\n }\n on(ownerDocument, 'mousemove', _this._delayedDragTouchMoveHandler);\n on(ownerDocument, 'touchmove', _this._delayedDragTouchMoveHandler);\n options.supportPointer && on(ownerDocument, 'pointermove', _this._delayedDragTouchMoveHandler);\n _this._dragStartTimer = setTimeout(dragStartFn, options.delay);\n } else {\n dragStartFn();\n }\n }\n },\n _delayedDragTouchMoveHandler: function _delayedDragTouchMoveHandler( /** TouchEvent|PointerEvent **/e) {\n var touch = e.touches ? e.touches[0] : e;\n if (Math.max(Math.abs(touch.clientX - this._lastX), Math.abs(touch.clientY - this._lastY)) >= Math.floor(this.options.touchStartThreshold / (this.nativeDraggable && window.devicePixelRatio || 1))) {\n this._disableDelayedDrag();\n }\n },\n _disableDelayedDrag: function _disableDelayedDrag() {\n dragEl && _disableDraggable(dragEl);\n clearTimeout(this._dragStartTimer);\n this._disableDelayedDragEvents();\n },\n _disableDelayedDragEvents: function _disableDelayedDragEvents() {\n var ownerDocument = this.el.ownerDocument;\n off(ownerDocument, 'mouseup', this._disableDelayedDrag);\n off(ownerDocument, 'touchend', this._disableDelayedDrag);\n off(ownerDocument, 'touchcancel', this._disableDelayedDrag);\n off(ownerDocument, 'pointerup', this._disableDelayedDrag);\n off(ownerDocument, 'pointercancel', this._disableDelayedDrag);\n off(ownerDocument, 'mousemove', this._delayedDragTouchMoveHandler);\n off(ownerDocument, 'touchmove', this._delayedDragTouchMoveHandler);\n off(ownerDocument, 'pointermove', this._delayedDragTouchMoveHandler);\n },\n _triggerDragStart: function _triggerDragStart( /** Event */evt, /** Touch */touch) {\n touch = touch || evt.pointerType == 'touch' && evt;\n if (!this.nativeDraggable || touch) {\n if (this.options.supportPointer) {\n on(document, 'pointermove', this._onTouchMove);\n } else if (touch) {\n on(document, 'touchmove', this._onTouchMove);\n } else {\n on(document, 'mousemove', this._onTouchMove);\n }\n } else {\n on(dragEl, 'dragend', this);\n on(rootEl, 'dragstart', this._onDragStart);\n }\n try {\n if (document.selection) {\n _nextTick(function () {\n document.selection.empty();\n });\n } else {\n window.getSelection().removeAllRanges();\n }\n } catch (err) {}\n },\n _dragStarted: function _dragStarted(fallback, evt) {\n awaitingDragStarted = false;\n if (rootEl && dragEl) {\n pluginEvent('dragStarted', this, {\n evt: evt\n });\n if (this.nativeDraggable) {\n on(document, 'dragover', _checkOutsideTargetEl);\n }\n var options = this.options;\n\n // Apply effect\n !fallback && toggleClass(dragEl, options.dragClass, false);\n toggleClass(dragEl, options.ghostClass, true);\n Sortable.active = this;\n fallback && this._appendGhost();\n\n // Drag start event\n _dispatchEvent({\n sortable: this,\n name: 'start',\n originalEvent: evt\n });\n } else {\n this._nulling();\n }\n },\n _emulateDragOver: function _emulateDragOver() {\n if (touchEvt) {\n this._lastX = touchEvt.clientX;\n this._lastY = touchEvt.clientY;\n _hideGhostForTarget();\n var target = document.elementFromPoint(touchEvt.clientX, touchEvt.clientY);\n var parent = target;\n while (target && target.shadowRoot) {\n target = target.shadowRoot.elementFromPoint(touchEvt.clientX, touchEvt.clientY);\n if (target === parent) break;\n parent = target;\n }\n dragEl.parentNode[expando]._isOutsideThisEl(target);\n if (parent) {\n do {\n if (parent[expando]) {\n var inserted = void 0;\n inserted = parent[expando]._onDragOver({\n clientX: touchEvt.clientX,\n clientY: touchEvt.clientY,\n target: target,\n rootEl: parent\n });\n if (inserted && !this.options.dragoverBubble) {\n break;\n }\n }\n target = parent; // store last element\n }\n /* jshint boss:true */ while (parent = getParentOrHost(parent));\n }\n _unhideGhostForTarget();\n }\n },\n _onTouchMove: function _onTouchMove( /**TouchEvent*/evt) {\n if (tapEvt) {\n var options = this.options,\n fallbackTolerance = options.fallbackTolerance,\n fallbackOffset = options.fallbackOffset,\n touch = evt.touches ? evt.touches[0] : evt,\n ghostMatrix = ghostEl && matrix(ghostEl, true),\n scaleX = ghostEl && ghostMatrix && ghostMatrix.a,\n scaleY = ghostEl && ghostMatrix && ghostMatrix.d,\n relativeScrollOffset = PositionGhostAbsolutely && ghostRelativeParent && getRelativeScrollOffset(ghostRelativeParent),\n dx = (touch.clientX - tapEvt.clientX + fallbackOffset.x) / (scaleX || 1) + (relativeScrollOffset ? relativeScrollOffset[0] - ghostRelativeParentInitialScroll[0] : 0) / (scaleX || 1),\n dy = (touch.clientY - tapEvt.clientY + fallbackOffset.y) / (scaleY || 1) + (relativeScrollOffset ? relativeScrollOffset[1] - ghostRelativeParentInitialScroll[1] : 0) / (scaleY || 1);\n\n // only set the status to dragging, when we are actually dragging\n if (!Sortable.active && !awaitingDragStarted) {\n if (fallbackTolerance && Math.max(Math.abs(touch.clientX - this._lastX), Math.abs(touch.clientY - this._lastY)) < fallbackTolerance) {\n return;\n }\n this._onDragStart(evt, true);\n }\n if (ghostEl) {\n if (ghostMatrix) {\n ghostMatrix.e += dx - (lastDx || 0);\n ghostMatrix.f += dy - (lastDy || 0);\n } else {\n ghostMatrix = {\n a: 1,\n b: 0,\n c: 0,\n d: 1,\n e: dx,\n f: dy\n };\n }\n var cssMatrix = \"matrix(\".concat(ghostMatrix.a, \",\").concat(ghostMatrix.b, \",\").concat(ghostMatrix.c, \",\").concat(ghostMatrix.d, \",\").concat(ghostMatrix.e, \",\").concat(ghostMatrix.f, \")\");\n css(ghostEl, 'webkitTransform', cssMatrix);\n css(ghostEl, 'mozTransform', cssMatrix);\n css(ghostEl, 'msTransform', cssMatrix);\n css(ghostEl, 'transform', cssMatrix);\n lastDx = dx;\n lastDy = dy;\n touchEvt = touch;\n }\n evt.cancelable && evt.preventDefault();\n }\n },\n _appendGhost: function _appendGhost() {\n // Bug if using scale(): https://stackoverflow.com/questions/2637058\n // Not being adjusted for\n if (!ghostEl) {\n var container = this.options.fallbackOnBody ? document.body : rootEl,\n rect = getRect(dragEl, true, PositionGhostAbsolutely, true, container),\n options = this.options;\n\n // Position absolutely\n if (PositionGhostAbsolutely) {\n // Get relatively positioned parent\n ghostRelativeParent = container;\n while (css(ghostRelativeParent, 'position') === 'static' && css(ghostRelativeParent, 'transform') === 'none' && ghostRelativeParent !== document) {\n ghostRelativeParent = ghostRelativeParent.parentNode;\n }\n if (ghostRelativeParent !== document.body && ghostRelativeParent !== document.documentElement) {\n if (ghostRelativeParent === document) ghostRelativeParent = getWindowScrollingElement();\n rect.top += ghostRelativeParent.scrollTop;\n rect.left += ghostRelativeParent.scrollLeft;\n } else {\n ghostRelativeParent = getWindowScrollingElement();\n }\n ghostRelativeParentInitialScroll = getRelativeScrollOffset(ghostRelativeParent);\n }\n ghostEl = dragEl.cloneNode(true);\n toggleClass(ghostEl, options.ghostClass, false);\n toggleClass(ghostEl, options.fallbackClass, true);\n toggleClass(ghostEl, options.dragClass, true);\n css(ghostEl, 'transition', '');\n css(ghostEl, 'transform', '');\n css(ghostEl, 'box-sizing', 'border-box');\n css(ghostEl, 'margin', 0);\n css(ghostEl, 'top', rect.top);\n css(ghostEl, 'left', rect.left);\n css(ghostEl, 'width', rect.width);\n css(ghostEl, 'height', rect.height);\n css(ghostEl, 'opacity', '0.8');\n css(ghostEl, 'position', PositionGhostAbsolutely ? 'absolute' : 'fixed');\n css(ghostEl, 'zIndex', '100000');\n css(ghostEl, 'pointerEvents', 'none');\n Sortable.ghost = ghostEl;\n container.appendChild(ghostEl);\n\n // Set transform-origin\n css(ghostEl, 'transform-origin', tapDistanceLeft / parseInt(ghostEl.style.width) * 100 + '% ' + tapDistanceTop / parseInt(ghostEl.style.height) * 100 + '%');\n }\n },\n _onDragStart: function _onDragStart( /**Event*/evt, /**boolean*/fallback) {\n var _this = this;\n var dataTransfer = evt.dataTransfer;\n var options = _this.options;\n pluginEvent('dragStart', this, {\n evt: evt\n });\n if (Sortable.eventCanceled) {\n this._onDrop();\n return;\n }\n pluginEvent('setupClone', this);\n if (!Sortable.eventCanceled) {\n cloneEl = clone(dragEl);\n cloneEl.removeAttribute(\"id\");\n cloneEl.draggable = false;\n cloneEl.style['will-change'] = '';\n this._hideClone();\n toggleClass(cloneEl, this.options.chosenClass, false);\n Sortable.clone = cloneEl;\n }\n\n // #1143: IFrame support workaround\n _this.cloneId = _nextTick(function () {\n pluginEvent('clone', _this);\n if (Sortable.eventCanceled) return;\n if (!_this.options.removeCloneOnHide) {\n rootEl.insertBefore(cloneEl, dragEl);\n }\n _this._hideClone();\n _dispatchEvent({\n sortable: _this,\n name: 'clone'\n });\n });\n !fallback && toggleClass(dragEl, options.dragClass, true);\n\n // Set proper drop events\n if (fallback) {\n ignoreNextClick = true;\n _this._loopId = setInterval(_this._emulateDragOver, 50);\n } else {\n // Undo what was set in _prepareDragStart before drag started\n off(document, 'mouseup', _this._onDrop);\n off(document, 'touchend', _this._onDrop);\n off(document, 'touchcancel', _this._onDrop);\n if (dataTransfer) {\n dataTransfer.effectAllowed = 'move';\n options.setData && options.setData.call(_this, dataTransfer, dragEl);\n }\n on(document, 'drop', _this);\n\n // #1276 fix:\n css(dragEl, 'transform', 'translateZ(0)');\n }\n awaitingDragStarted = true;\n _this._dragStartId = _nextTick(_this._dragStarted.bind(_this, fallback, evt));\n on(document, 'selectstart', _this);\n moved = true;\n window.getSelection().removeAllRanges();\n if (Safari) {\n css(document.body, 'user-select', 'none');\n }\n },\n // Returns true - if no further action is needed (either inserted or another condition)\n _onDragOver: function _onDragOver( /**Event*/evt) {\n var el = this.el,\n target = evt.target,\n dragRect,\n targetRect,\n revert,\n options = this.options,\n group = options.group,\n activeSortable = Sortable.active,\n isOwner = activeGroup === group,\n canSort = options.sort,\n fromSortable = putSortable || activeSortable,\n vertical,\n _this = this,\n completedFired = false;\n if (_silent) return;\n function dragOverEvent(name, extra) {\n pluginEvent(name, _this, _objectSpread2({\n evt: evt,\n isOwner: isOwner,\n axis: vertical ? 'vertical' : 'horizontal',\n revert: revert,\n dragRect: dragRect,\n targetRect: targetRect,\n canSort: canSort,\n fromSortable: fromSortable,\n target: target,\n completed: completed,\n onMove: function onMove(target, after) {\n return _onMove(rootEl, el, dragEl, dragRect, target, getRect(target), evt, after);\n },\n changed: changed\n }, extra));\n }\n\n // Capture animation state\n function capture() {\n dragOverEvent('dragOverAnimationCapture');\n _this.captureAnimationState();\n if (_this !== fromSortable) {\n fromSortable.captureAnimationState();\n }\n }\n\n // Return invocation when dragEl is inserted (or completed)\n function completed(insertion) {\n dragOverEvent('dragOverCompleted', {\n insertion: insertion\n });\n if (insertion) {\n // Clones must be hidden before folding animation to capture dragRectAbsolute properly\n if (isOwner) {\n activeSortable._hideClone();\n } else {\n activeSortable._showClone(_this);\n }\n if (_this !== fromSortable) {\n // Set ghost class to new sortable's ghost class\n toggleClass(dragEl, putSortable ? putSortable.options.ghostClass : activeSortable.options.ghostClass, false);\n toggleClass(dragEl, options.ghostClass, true);\n }\n if (putSortable !== _this && _this !== Sortable.active) {\n putSortable = _this;\n } else if (_this === Sortable.active && putSortable) {\n putSortable = null;\n }\n\n // Animation\n if (fromSortable === _this) {\n _this._ignoreWhileAnimating = target;\n }\n _this.animateAll(function () {\n dragOverEvent('dragOverAnimationComplete');\n _this._ignoreWhileAnimating = null;\n });\n if (_this !== fromSortable) {\n fromSortable.animateAll();\n fromSortable._ignoreWhileAnimating = null;\n }\n }\n\n // Null lastTarget if it is not inside a previously swapped element\n if (target === dragEl && !dragEl.animated || target === el && !target.animated) {\n lastTarget = null;\n }\n\n // no bubbling and not fallback\n if (!options.dragoverBubble && !evt.rootEl && target !== document) {\n dragEl.parentNode[expando]._isOutsideThisEl(evt.target);\n\n // Do not detect for empty insert if already inserted\n !insertion && nearestEmptyInsertDetectEvent(evt);\n }\n !options.dragoverBubble && evt.stopPropagation && evt.stopPropagation();\n return completedFired = true;\n }\n\n // Call when dragEl has been inserted\n function changed() {\n newIndex = index(dragEl);\n newDraggableIndex = index(dragEl, options.draggable);\n _dispatchEvent({\n sortable: _this,\n name: 'change',\n toEl: el,\n newIndex: newIndex,\n newDraggableIndex: newDraggableIndex,\n originalEvent: evt\n });\n }\n if (evt.preventDefault !== void 0) {\n evt.cancelable && evt.preventDefault();\n }\n target = closest(target, options.draggable, el, true);\n dragOverEvent('dragOver');\n if (Sortable.eventCanceled) return completedFired;\n if (dragEl.contains(evt.target) || target.animated && target.animatingX && target.animatingY || _this._ignoreWhileAnimating === target) {\n return completed(false);\n }\n ignoreNextClick = false;\n if (activeSortable && !options.disabled && (isOwner ? canSort || (revert = parentEl !== rootEl) // Reverting item into the original list\n : putSortable === this || (this.lastPutMode = activeGroup.checkPull(this, activeSortable, dragEl, evt)) && group.checkPut(this, activeSortable, dragEl, evt))) {\n vertical = this._getDirection(evt, target) === 'vertical';\n dragRect = getRect(dragEl);\n dragOverEvent('dragOverValid');\n if (Sortable.eventCanceled) return completedFired;\n if (revert) {\n parentEl = rootEl; // actualization\n capture();\n this._hideClone();\n dragOverEvent('revert');\n if (!Sortable.eventCanceled) {\n if (nextEl) {\n rootEl.insertBefore(dragEl, nextEl);\n } else {\n rootEl.appendChild(dragEl);\n }\n }\n return completed(true);\n }\n var elLastChild = lastChild(el, options.draggable);\n if (!elLastChild || _ghostIsLast(evt, vertical, this) && !elLastChild.animated) {\n // Insert to end of list\n\n // If already at end of list: Do not insert\n if (elLastChild === dragEl) {\n return completed(false);\n }\n\n // if there is a last element, it is the target\n if (elLastChild && el === evt.target) {\n target = elLastChild;\n }\n if (target) {\n targetRect = getRect(target);\n }\n if (_onMove(rootEl, el, dragEl, dragRect, target, targetRect, evt, !!target) !== false) {\n capture();\n if (elLastChild && elLastChild.nextSibling) {\n // the last draggable element is not the last node\n el.insertBefore(dragEl, elLastChild.nextSibling);\n } else {\n el.appendChild(dragEl);\n }\n parentEl = el; // actualization\n\n changed();\n return completed(true);\n }\n } else if (elLastChild && _ghostIsFirst(evt, vertical, this)) {\n // Insert to start of list\n var firstChild = getChild(el, 0, options, true);\n if (firstChild === dragEl) {\n return completed(false);\n }\n target = firstChild;\n targetRect = getRect(target);\n if (_onMove(rootEl, el, dragEl, dragRect, target, targetRect, evt, false) !== false) {\n capture();\n el.insertBefore(dragEl, firstChild);\n parentEl = el; // actualization\n\n changed();\n return completed(true);\n }\n } else if (target.parentNode === el) {\n targetRect = getRect(target);\n var direction = 0,\n targetBeforeFirstSwap,\n differentLevel = dragEl.parentNode !== el,\n differentRowCol = !_dragElInRowColumn(dragEl.animated && dragEl.toRect || dragRect, target.animated && target.toRect || targetRect, vertical),\n side1 = vertical ? 'top' : 'left',\n scrolledPastTop = isScrolledPast(target, 'top', 'top') || isScrolledPast(dragEl, 'top', 'top'),\n scrollBefore = scrolledPastTop ? scrolledPastTop.scrollTop : void 0;\n if (lastTarget !== target) {\n targetBeforeFirstSwap = targetRect[side1];\n pastFirstInvertThresh = false;\n isCircumstantialInvert = !differentRowCol && options.invertSwap || differentLevel;\n }\n direction = _getSwapDirection(evt, target, targetRect, vertical, differentRowCol ? 1 : options.swapThreshold, options.invertedSwapThreshold == null ? options.swapThreshold : options.invertedSwapThreshold, isCircumstantialInvert, lastTarget === target);\n var sibling;\n if (direction !== 0) {\n // Check if target is beside dragEl in respective direction (ignoring hidden elements)\n var dragIndex = index(dragEl);\n do {\n dragIndex -= direction;\n sibling = parentEl.children[dragIndex];\n } while (sibling && (css(sibling, 'display') === 'none' || sibling === ghostEl));\n }\n // If dragEl is already beside target: Do not insert\n if (direction === 0 || sibling === target) {\n return completed(false);\n }\n lastTarget = target;\n lastDirection = direction;\n var nextSibling = target.nextElementSibling,\n after = false;\n after = direction === 1;\n var moveVector = _onMove(rootEl, el, dragEl, dragRect, target, targetRect, evt, after);\n if (moveVector !== false) {\n if (moveVector === 1 || moveVector === -1) {\n after = moveVector === 1;\n }\n _silent = true;\n setTimeout(_unsilent, 30);\n capture();\n if (after && !nextSibling) {\n el.appendChild(dragEl);\n } else {\n target.parentNode.insertBefore(dragEl, after ? nextSibling : target);\n }\n\n // Undo chrome's scroll adjustment (has no effect on other browsers)\n if (scrolledPastTop) {\n scrollBy(scrolledPastTop, 0, scrollBefore - scrolledPastTop.scrollTop);\n }\n parentEl = dragEl.parentNode; // actualization\n\n // must be done before animation\n if (targetBeforeFirstSwap !== undefined && !isCircumstantialInvert) {\n targetMoveDistance = Math.abs(targetBeforeFirstSwap - getRect(target)[side1]);\n }\n changed();\n return completed(true);\n }\n }\n if (el.contains(dragEl)) {\n return completed(false);\n }\n }\n return false;\n },\n _ignoreWhileAnimating: null,\n _offMoveEvents: function _offMoveEvents() {\n off(document, 'mousemove', this._onTouchMove);\n off(document, 'touchmove', this._onTouchMove);\n off(document, 'pointermove', this._onTouchMove);\n off(document, 'dragover', nearestEmptyInsertDetectEvent);\n off(document, 'mousemove', nearestEmptyInsertDetectEvent);\n off(document, 'touchmove', nearestEmptyInsertDetectEvent);\n },\n _offUpEvents: function _offUpEvents() {\n var ownerDocument = this.el.ownerDocument;\n off(ownerDocument, 'mouseup', this._onDrop);\n off(ownerDocument, 'touchend', this._onDrop);\n off(ownerDocument, 'pointerup', this._onDrop);\n off(ownerDocument, 'pointercancel', this._onDrop);\n off(ownerDocument, 'touchcancel', this._onDrop);\n off(document, 'selectstart', this);\n },\n _onDrop: function _onDrop( /**Event*/evt) {\n var el = this.el,\n options = this.options;\n\n // Get the index of the dragged element within its parent\n newIndex = index(dragEl);\n newDraggableIndex = index(dragEl, options.draggable);\n pluginEvent('drop', this, {\n evt: evt\n });\n parentEl = dragEl && dragEl.parentNode;\n\n // Get again after plugin event\n newIndex = index(dragEl);\n newDraggableIndex = index(dragEl, options.draggable);\n if (Sortable.eventCanceled) {\n this._nulling();\n return;\n }\n awaitingDragStarted = false;\n isCircumstantialInvert = false;\n pastFirstInvertThresh = false;\n clearInterval(this._loopId);\n clearTimeout(this._dragStartTimer);\n _cancelNextTick(this.cloneId);\n _cancelNextTick(this._dragStartId);\n\n // Unbind events\n if (this.nativeDraggable) {\n off(document, 'drop', this);\n off(el, 'dragstart', this._onDragStart);\n }\n this._offMoveEvents();\n this._offUpEvents();\n if (Safari) {\n css(document.body, 'user-select', '');\n }\n css(dragEl, 'transform', '');\n if (evt) {\n if (moved) {\n evt.cancelable && evt.preventDefault();\n !options.dropBubble && evt.stopPropagation();\n }\n ghostEl && ghostEl.parentNode && ghostEl.parentNode.removeChild(ghostEl);\n if (rootEl === parentEl || putSortable && putSortable.lastPutMode !== 'clone') {\n // Remove clone(s)\n cloneEl && cloneEl.parentNode && cloneEl.parentNode.removeChild(cloneEl);\n }\n if (dragEl) {\n if (this.nativeDraggable) {\n off(dragEl, 'dragend', this);\n }\n _disableDraggable(dragEl);\n dragEl.style['will-change'] = '';\n\n // Remove classes\n // ghostClass is added in dragStarted\n if (moved && !awaitingDragStarted) {\n toggleClass(dragEl, putSortable ? putSortable.options.ghostClass : this.options.ghostClass, false);\n }\n toggleClass(dragEl, this.options.chosenClass, false);\n\n // Drag stop event\n _dispatchEvent({\n sortable: this,\n name: 'unchoose',\n toEl: parentEl,\n newIndex: null,\n newDraggableIndex: null,\n originalEvent: evt\n });\n if (rootEl !== parentEl) {\n if (newIndex >= 0) {\n // Add event\n _dispatchEvent({\n rootEl: parentEl,\n name: 'add',\n toEl: parentEl,\n fromEl: rootEl,\n originalEvent: evt\n });\n\n // Remove event\n _dispatchEvent({\n sortable: this,\n name: 'remove',\n toEl: parentEl,\n originalEvent: evt\n });\n\n // drag from one list and drop into another\n _dispatchEvent({\n rootEl: parentEl,\n name: 'sort',\n toEl: parentEl,\n fromEl: rootEl,\n originalEvent: evt\n });\n _dispatchEvent({\n sortable: this,\n name: 'sort',\n toEl: parentEl,\n originalEvent: evt\n });\n }\n putSortable && putSortable.save();\n } else {\n if (newIndex !== oldIndex) {\n if (newIndex >= 0) {\n // drag & drop within the same list\n _dispatchEvent({\n sortable: this,\n name: 'update',\n toEl: parentEl,\n originalEvent: evt\n });\n _dispatchEvent({\n sortable: this,\n name: 'sort',\n toEl: parentEl,\n originalEvent: evt\n });\n }\n }\n }\n if (Sortable.active) {\n /* jshint eqnull:true */\n if (newIndex == null || newIndex === -1) {\n newIndex = oldIndex;\n newDraggableIndex = oldDraggableIndex;\n }\n _dispatchEvent({\n sortable: this,\n name: 'end',\n toEl: parentEl,\n originalEvent: evt\n });\n\n // Save sorting\n this.save();\n }\n }\n }\n this._nulling();\n },\n _nulling: function _nulling() {\n pluginEvent('nulling', this);\n rootEl = dragEl = parentEl = ghostEl = nextEl = cloneEl = lastDownEl = cloneHidden = tapEvt = touchEvt = moved = newIndex = newDraggableIndex = oldIndex = oldDraggableIndex = lastTarget = lastDirection = putSortable = activeGroup = Sortable.dragged = Sortable.ghost = Sortable.clone = Sortable.active = null;\n var el = this.el;\n savedInputChecked.forEach(function (checkEl) {\n if (el.contains(checkEl)) {\n checkEl.checked = true;\n }\n });\n savedInputChecked.length = lastDx = lastDy = 0;\n },\n handleEvent: function handleEvent( /**Event*/evt) {\n switch (evt.type) {\n case 'drop':\n case 'dragend':\n this._onDrop(evt);\n break;\n case 'dragenter':\n case 'dragover':\n if (dragEl) {\n this._onDragOver(evt);\n _globalDragOver(evt);\n }\n break;\n case 'selectstart':\n evt.preventDefault();\n break;\n }\n },\n /**\r\n * Serializes the item into an array of string.\r\n * @returns {String[]}\r\n */\n toArray: function toArray() {\n var order = [],\n el,\n children = this.el.children,\n i = 0,\n n = children.length,\n options = this.options;\n for (; i < n; i++) {\n el = children[i];\n if (closest(el, options.draggable, this.el, false)) {\n order.push(el.getAttribute(options.dataIdAttr) || _generateId(el));\n }\n }\n return order;\n },\n /**\r\n * Sorts the elements according to the array.\r\n * @param {String[]} order order of the items\r\n */\n sort: function sort(order, useAnimation) {\n var items = {},\n rootEl = this.el;\n this.toArray().forEach(function (id, i) {\n var el = rootEl.children[i];\n if (closest(el, this.options.draggable, rootEl, false)) {\n items[id] = el;\n }\n }, this);\n useAnimation && this.captureAnimationState();\n order.forEach(function (id) {\n if (items[id]) {\n rootEl.removeChild(items[id]);\n rootEl.appendChild(items[id]);\n }\n });\n useAnimation && this.animateAll();\n },\n /**\r\n * Save the current sorting\r\n */\n save: function save() {\n var store = this.options.store;\n store && store.set && store.set(this);\n },\n /**\r\n * For each element in the set, get the first element that matches the selector by testing the element itself and traversing up through its ancestors in the DOM tree.\r\n * @param {HTMLElement} el\r\n * @param {String} [selector] default: `options.draggable`\r\n * @returns {HTMLElement|null}\r\n */\n closest: function closest$1(el, selector) {\n return closest(el, selector || this.options.draggable, this.el, false);\n },\n /**\r\n * Set/get option\r\n * @param {string} name\r\n * @param {*} [value]\r\n * @returns {*}\r\n */\n option: function option(name, value) {\n var options = this.options;\n if (value === void 0) {\n return options[name];\n } else {\n var modifiedValue = PluginManager.modifyOption(this, name, value);\n if (typeof modifiedValue !== 'undefined') {\n options[name] = modifiedValue;\n } else {\n options[name] = value;\n }\n if (name === 'group') {\n _prepareGroup(options);\n }\n }\n },\n /**\r\n * Destroy\r\n */\n destroy: function destroy() {\n pluginEvent('destroy', this);\n var el = this.el;\n el[expando] = null;\n off(el, 'mousedown', this._onTapStart);\n off(el, 'touchstart', this._onTapStart);\n off(el, 'pointerdown', this._onTapStart);\n if (this.nativeDraggable) {\n off(el, 'dragover', this);\n off(el, 'dragenter', this);\n }\n // Remove draggable attributes\n Array.prototype.forEach.call(el.querySelectorAll('[draggable]'), function (el) {\n el.removeAttribute('draggable');\n });\n this._onDrop();\n this._disableDelayedDragEvents();\n sortables.splice(sortables.indexOf(this.el), 1);\n this.el = el = null;\n },\n _hideClone: function _hideClone() {\n if (!cloneHidden) {\n pluginEvent('hideClone', this);\n if (Sortable.eventCanceled) return;\n css(cloneEl, 'display', 'none');\n if (this.options.removeCloneOnHide && cloneEl.parentNode) {\n cloneEl.parentNode.removeChild(cloneEl);\n }\n cloneHidden = true;\n }\n },\n _showClone: function _showClone(putSortable) {\n if (putSortable.lastPutMode !== 'clone') {\n this._hideClone();\n return;\n }\n if (cloneHidden) {\n pluginEvent('showClone', this);\n if (Sortable.eventCanceled) return;\n\n // show clone at dragEl or original position\n if (dragEl.parentNode == rootEl && !this.options.group.revertClone) {\n rootEl.insertBefore(cloneEl, dragEl);\n } else if (nextEl) {\n rootEl.insertBefore(cloneEl, nextEl);\n } else {\n rootEl.appendChild(cloneEl);\n }\n if (this.options.group.revertClone) {\n this.animate(dragEl, cloneEl);\n }\n css(cloneEl, 'display', '');\n cloneHidden = false;\n }\n }\n};\nfunction _globalDragOver( /**Event*/evt) {\n if (evt.dataTransfer) {\n evt.dataTransfer.dropEffect = 'move';\n }\n evt.cancelable && evt.preventDefault();\n}\nfunction _onMove(fromEl, toEl, dragEl, dragRect, targetEl, targetRect, originalEvent, willInsertAfter) {\n var evt,\n sortable = fromEl[expando],\n onMoveFn = sortable.options.onMove,\n retVal;\n // Support for new CustomEvent feature\n if (window.CustomEvent && !IE11OrLess && !Edge) {\n evt = new CustomEvent('move', {\n bubbles: true,\n cancelable: true\n });\n } else {\n evt = document.createEvent('Event');\n evt.initEvent('move', true, true);\n }\n evt.to = toEl;\n evt.from = fromEl;\n evt.dragged = dragEl;\n evt.draggedRect = dragRect;\n evt.related = targetEl || toEl;\n evt.relatedRect = targetRect || getRect(toEl);\n evt.willInsertAfter = willInsertAfter;\n evt.originalEvent = originalEvent;\n fromEl.dispatchEvent(evt);\n if (onMoveFn) {\n retVal = onMoveFn.call(sortable, evt, originalEvent);\n }\n return retVal;\n}\nfunction _disableDraggable(el) {\n el.draggable = false;\n}\nfunction _unsilent() {\n _silent = false;\n}\nfunction _ghostIsFirst(evt, vertical, sortable) {\n var firstElRect = getRect(getChild(sortable.el, 0, sortable.options, true));\n var childContainingRect = getChildContainingRectFromElement(sortable.el, sortable.options, ghostEl);\n var spacer = 10;\n return vertical ? evt.clientX < childContainingRect.left - spacer || evt.clientY < firstElRect.top && evt.clientX < firstElRect.right : evt.clientY < childContainingRect.top - spacer || evt.clientY < firstElRect.bottom && evt.clientX < firstElRect.left;\n}\nfunction _ghostIsLast(evt, vertical, sortable) {\n var lastElRect = getRect(lastChild(sortable.el, sortable.options.draggable));\n var childContainingRect = getChildContainingRectFromElement(sortable.el, sortable.options, ghostEl);\n var spacer = 10;\n return vertical ? evt.clientX > childContainingRect.right + spacer || evt.clientY > lastElRect.bottom && evt.clientX > lastElRect.left : evt.clientY > childContainingRect.bottom + spacer || evt.clientX > lastElRect.right && evt.clientY > lastElRect.top;\n}\nfunction _getSwapDirection(evt, target, targetRect, vertical, swapThreshold, invertedSwapThreshold, invertSwap, isLastTarget) {\n var mouseOnAxis = vertical ? evt.clientY : evt.clientX,\n targetLength = vertical ? targetRect.height : targetRect.width,\n targetS1 = vertical ? targetRect.top : targetRect.left,\n targetS2 = vertical ? targetRect.bottom : targetRect.right,\n invert = false;\n if (!invertSwap) {\n // Never invert or create dragEl shadow when target movemenet causes mouse to move past the end of regular swapThreshold\n if (isLastTarget && targetMoveDistance < targetLength * swapThreshold) {\n // multiplied only by swapThreshold because mouse will already be inside target by (1 - threshold) * targetLength / 2\n // check if past first invert threshold on side opposite of lastDirection\n if (!pastFirstInvertThresh && (lastDirection === 1 ? mouseOnAxis > targetS1 + targetLength * invertedSwapThreshold / 2 : mouseOnAxis < targetS2 - targetLength * invertedSwapThreshold / 2)) {\n // past first invert threshold, do not restrict inverted threshold to dragEl shadow\n pastFirstInvertThresh = true;\n }\n if (!pastFirstInvertThresh) {\n // dragEl shadow (target move distance shadow)\n if (lastDirection === 1 ? mouseOnAxis < targetS1 + targetMoveDistance // over dragEl shadow\n : mouseOnAxis > targetS2 - targetMoveDistance) {\n return -lastDirection;\n }\n } else {\n invert = true;\n }\n } else {\n // Regular\n if (mouseOnAxis > targetS1 + targetLength * (1 - swapThreshold) / 2 && mouseOnAxis < targetS2 - targetLength * (1 - swapThreshold) / 2) {\n return _getInsertDirection(target);\n }\n }\n }\n invert = invert || invertSwap;\n if (invert) {\n // Invert of regular\n if (mouseOnAxis < targetS1 + targetLength * invertedSwapThreshold / 2 || mouseOnAxis > targetS2 - targetLength * invertedSwapThreshold / 2) {\n return mouseOnAxis > targetS1 + targetLength / 2 ? 1 : -1;\n }\n }\n return 0;\n}\n\n/**\r\n * Gets the direction dragEl must be swapped relative to target in order to make it\r\n * seem that dragEl has been \"inserted\" into that element's position\r\n * @param {HTMLElement} target The target whose position dragEl is being inserted at\r\n * @return {Number} Direction dragEl must be swapped\r\n */\nfunction _getInsertDirection(target) {\n if (index(dragEl) < index(target)) {\n return 1;\n } else {\n return -1;\n }\n}\n\n/**\r\n * Generate id\r\n * @param {HTMLElement} el\r\n * @returns {String}\r\n * @private\r\n */\nfunction _generateId(el) {\n var str = el.tagName + el.className + el.src + el.href + el.textContent,\n i = str.length,\n sum = 0;\n while (i--) {\n sum += str.charCodeAt(i);\n }\n return sum.toString(36);\n}\nfunction _saveInputCheckedState(root) {\n savedInputChecked.length = 0;\n var inputs = root.getElementsByTagName('input');\n var idx = inputs.length;\n while (idx--) {\n var el = inputs[idx];\n el.checked && savedInputChecked.push(el);\n }\n}\nfunction _nextTick(fn) {\n return setTimeout(fn, 0);\n}\nfunction _cancelNextTick(id) {\n return clearTimeout(id);\n}\n\n// Fixed #973:\nif (documentExists) {\n on(document, 'touchmove', function (evt) {\n if ((Sortable.active || awaitingDragStarted) && evt.cancelable) {\n evt.preventDefault();\n }\n });\n}\n\n// Export utils\nSortable.utils = {\n on: on,\n off: off,\n css: css,\n find: find,\n is: function is(el, selector) {\n return !!closest(el, selector, el, false);\n },\n extend: extend,\n throttle: throttle,\n closest: closest,\n toggleClass: toggleClass,\n clone: clone,\n index: index,\n nextTick: _nextTick,\n cancelNextTick: _cancelNextTick,\n detectDirection: _detectDirection,\n getChild: getChild,\n expando: expando\n};\n\n/**\r\n * Get the Sortable instance of an element\r\n * @param {HTMLElement} element The element\r\n * @return {Sortable|undefined} The instance of Sortable\r\n */\nSortable.get = function (element) {\n return element[expando];\n};\n\n/**\r\n * Mount a plugin to Sortable\r\n * @param {...SortablePlugin|SortablePlugin[]} plugins Plugins being mounted\r\n */\nSortable.mount = function () {\n for (var _len = arguments.length, plugins = new Array(_len), _key = 0; _key < _len; _key++) {\n plugins[_key] = arguments[_key];\n }\n if (plugins[0].constructor === Array) plugins = plugins[0];\n plugins.forEach(function (plugin) {\n if (!plugin.prototype || !plugin.prototype.constructor) {\n throw \"Sortable: Mounted plugin must be a constructor function, not \".concat({}.toString.call(plugin));\n }\n if (plugin.utils) Sortable.utils = _objectSpread2(_objectSpread2({}, Sortable.utils), plugin.utils);\n PluginManager.mount(plugin);\n });\n};\n\n/**\r\n * Create sortable instance\r\n * @param {HTMLElement} el\r\n * @param {Object} [options]\r\n */\nSortable.create = function (el, options) {\n return new Sortable(el, options);\n};\n\n// Export\nSortable.version = version;\n\nvar autoScrolls = [],\n scrollEl,\n scrollRootEl,\n scrolling = false,\n lastAutoScrollX,\n lastAutoScrollY,\n touchEvt$1,\n pointerElemChangedInterval;\nfunction AutoScrollPlugin() {\n function AutoScroll() {\n this.defaults = {\n scroll: true,\n forceAutoScrollFallback: false,\n scrollSensitivity: 30,\n scrollSpeed: 10,\n bubbleScroll: true\n };\n\n // Bind all private methods\n for (var fn in this) {\n if (fn.charAt(0) === '_' && typeof this[fn] === 'function') {\n this[fn] = this[fn].bind(this);\n }\n }\n }\n AutoScroll.prototype = {\n dragStarted: function dragStarted(_ref) {\n var originalEvent = _ref.originalEvent;\n if (this.sortable.nativeDraggable) {\n on(document, 'dragover', this._handleAutoScroll);\n } else {\n if (this.options.supportPointer) {\n on(document, 'pointermove', this._handleFallbackAutoScroll);\n } else if (originalEvent.touches) {\n on(document, 'touchmove', this._handleFallbackAutoScroll);\n } else {\n on(document, 'mousemove', this._handleFallbackAutoScroll);\n }\n }\n },\n dragOverCompleted: function dragOverCompleted(_ref2) {\n var originalEvent = _ref2.originalEvent;\n // For when bubbling is canceled and using fallback (fallback 'touchmove' always reached)\n if (!this.options.dragOverBubble && !originalEvent.rootEl) {\n this._handleAutoScroll(originalEvent);\n }\n },\n drop: function drop() {\n if (this.sortable.nativeDraggable) {\n off(document, 'dragover', this._handleAutoScroll);\n } else {\n off(document, 'pointermove', this._handleFallbackAutoScroll);\n off(document, 'touchmove', this._handleFallbackAutoScroll);\n off(document, 'mousemove', this._handleFallbackAutoScroll);\n }\n clearPointerElemChangedInterval();\n clearAutoScrolls();\n cancelThrottle();\n },\n nulling: function nulling() {\n touchEvt$1 = scrollRootEl = scrollEl = scrolling = pointerElemChangedInterval = lastAutoScrollX = lastAutoScrollY = null;\n autoScrolls.length = 0;\n },\n _handleFallbackAutoScroll: function _handleFallbackAutoScroll(evt) {\n this._handleAutoScroll(evt, true);\n },\n _handleAutoScroll: function _handleAutoScroll(evt, fallback) {\n var _this = this;\n var x = (evt.touches ? evt.touches[0] : evt).clientX,\n y = (evt.touches ? evt.touches[0] : evt).clientY,\n elem = document.elementFromPoint(x, y);\n touchEvt$1 = evt;\n\n // IE does not seem to have native autoscroll,\n // Edge's autoscroll seems too conditional,\n // MACOS Safari does not have autoscroll,\n // Firefox and Chrome are good\n if (fallback || this.options.forceAutoScrollFallback || Edge || IE11OrLess || Safari) {\n autoScroll(evt, this.options, elem, fallback);\n\n // Listener for pointer element change\n var ogElemScroller = getParentAutoScrollElement(elem, true);\n if (scrolling && (!pointerElemChangedInterval || x !== lastAutoScrollX || y !== lastAutoScrollY)) {\n pointerElemChangedInterval && clearPointerElemChangedInterval();\n // Detect for pointer elem change, emulating native DnD behaviour\n pointerElemChangedInterval = setInterval(function () {\n var newElem = getParentAutoScrollElement(document.elementFromPoint(x, y), true);\n if (newElem !== ogElemScroller) {\n ogElemScroller = newElem;\n clearAutoScrolls();\n }\n autoScroll(evt, _this.options, newElem, fallback);\n }, 10);\n lastAutoScrollX = x;\n lastAutoScrollY = y;\n }\n } else {\n // if DnD is enabled (and browser has good autoscrolling), first autoscroll will already scroll, so get parent autoscroll of first autoscroll\n if (!this.options.bubbleScroll || getParentAutoScrollElement(elem, true) === getWindowScrollingElement()) {\n clearAutoScrolls();\n return;\n }\n autoScroll(evt, this.options, getParentAutoScrollElement(elem, false), false);\n }\n }\n };\n return _extends(AutoScroll, {\n pluginName: 'scroll',\n initializeByDefault: true\n });\n}\nfunction clearAutoScrolls() {\n autoScrolls.forEach(function (autoScroll) {\n clearInterval(autoScroll.pid);\n });\n autoScrolls = [];\n}\nfunction clearPointerElemChangedInterval() {\n clearInterval(pointerElemChangedInterval);\n}\nvar autoScroll = throttle(function (evt, options, rootEl, isFallback) {\n // Bug: https://bugzilla.mozilla.org/show_bug.cgi?id=505521\n if (!options.scroll) return;\n var x = (evt.touches ? evt.touches[0] : evt).clientX,\n y = (evt.touches ? evt.touches[0] : evt).clientY,\n sens = options.scrollSensitivity,\n speed = options.scrollSpeed,\n winScroller = getWindowScrollingElement();\n var scrollThisInstance = false,\n scrollCustomFn;\n\n // New scroll root, set scrollEl\n if (scrollRootEl !== rootEl) {\n scrollRootEl = rootEl;\n clearAutoScrolls();\n scrollEl = options.scroll;\n scrollCustomFn = options.scrollFn;\n if (scrollEl === true) {\n scrollEl = getParentAutoScrollElement(rootEl, true);\n }\n }\n var layersOut = 0;\n var currentParent = scrollEl;\n do {\n var el = currentParent,\n rect = getRect(el),\n top = rect.top,\n bottom = rect.bottom,\n left = rect.left,\n right = rect.right,\n width = rect.width,\n height = rect.height,\n canScrollX = void 0,\n canScrollY = void 0,\n scrollWidth = el.scrollWidth,\n scrollHeight = el.scrollHeight,\n elCSS = css(el),\n scrollPosX = el.scrollLeft,\n scrollPosY = el.scrollTop;\n if (el === winScroller) {\n canScrollX = width < scrollWidth && (elCSS.overflowX === 'auto' || elCSS.overflowX === 'scroll' || elCSS.overflowX === 'visible');\n canScrollY = height < scrollHeight && (elCSS.overflowY === 'auto' || elCSS.overflowY === 'scroll' || elCSS.overflowY === 'visible');\n } else {\n canScrollX = width < scrollWidth && (elCSS.overflowX === 'auto' || elCSS.overflowX === 'scroll');\n canScrollY = height < scrollHeight && (elCSS.overflowY === 'auto' || elCSS.overflowY === 'scroll');\n }\n var vx = canScrollX && (Math.abs(right - x) <= sens && scrollPosX + width < scrollWidth) - (Math.abs(left - x) <= sens && !!scrollPosX);\n var vy = canScrollY && (Math.abs(bottom - y) <= sens && scrollPosY + height < scrollHeight) - (Math.abs(top - y) <= sens && !!scrollPosY);\n if (!autoScrolls[layersOut]) {\n for (var i = 0; i <= layersOut; i++) {\n if (!autoScrolls[i]) {\n autoScrolls[i] = {};\n }\n }\n }\n if (autoScrolls[layersOut].vx != vx || autoScrolls[layersOut].vy != vy || autoScrolls[layersOut].el !== el) {\n autoScrolls[layersOut].el = el;\n autoScrolls[layersOut].vx = vx;\n autoScrolls[layersOut].vy = vy;\n clearInterval(autoScrolls[layersOut].pid);\n if (vx != 0 || vy != 0) {\n scrollThisInstance = true;\n /* jshint loopfunc:true */\n autoScrolls[layersOut].pid = setInterval(function () {\n // emulate drag over during autoscroll (fallback), emulating native DnD behaviour\n if (isFallback && this.layer === 0) {\n Sortable.active._onTouchMove(touchEvt$1); // To move ghost if it is positioned absolutely\n }\n var scrollOffsetY = autoScrolls[this.layer].vy ? autoScrolls[this.layer].vy * speed : 0;\n var scrollOffsetX = autoScrolls[this.layer].vx ? autoScrolls[this.layer].vx * speed : 0;\n if (typeof scrollCustomFn === 'function') {\n if (scrollCustomFn.call(Sortable.dragged.parentNode[expando], scrollOffsetX, scrollOffsetY, evt, touchEvt$1, autoScrolls[this.layer].el) !== 'continue') {\n return;\n }\n }\n scrollBy(autoScrolls[this.layer].el, scrollOffsetX, scrollOffsetY);\n }.bind({\n layer: layersOut\n }), 24);\n }\n }\n layersOut++;\n } while (options.bubbleScroll && currentParent !== winScroller && (currentParent = getParentAutoScrollElement(currentParent, false)));\n scrolling = scrollThisInstance; // in case another function catches scrolling as false in between when it is not\n}, 30);\n\nvar drop = function drop(_ref) {\n var originalEvent = _ref.originalEvent,\n putSortable = _ref.putSortable,\n dragEl = _ref.dragEl,\n activeSortable = _ref.activeSortable,\n dispatchSortableEvent = _ref.dispatchSortableEvent,\n hideGhostForTarget = _ref.hideGhostForTarget,\n unhideGhostForTarget = _ref.unhideGhostForTarget;\n if (!originalEvent) return;\n var toSortable = putSortable || activeSortable;\n hideGhostForTarget();\n var touch = originalEvent.changedTouches && originalEvent.changedTouches.length ? originalEvent.changedTouches[0] : originalEvent;\n var target = document.elementFromPoint(touch.clientX, touch.clientY);\n unhideGhostForTarget();\n if (toSortable && !toSortable.el.contains(target)) {\n dispatchSortableEvent('spill');\n this.onSpill({\n dragEl: dragEl,\n putSortable: putSortable\n });\n }\n};\nfunction Revert() {}\nRevert.prototype = {\n startIndex: null,\n dragStart: function dragStart(_ref2) {\n var oldDraggableIndex = _ref2.oldDraggableIndex;\n this.startIndex = oldDraggableIndex;\n },\n onSpill: function onSpill(_ref3) {\n var dragEl = _ref3.dragEl,\n putSortable = _ref3.putSortable;\n this.sortable.captureAnimationState();\n if (putSortable) {\n putSortable.captureAnimationState();\n }\n var nextSibling = getChild(this.sortable.el, this.startIndex, this.options);\n if (nextSibling) {\n this.sortable.el.insertBefore(dragEl, nextSibling);\n } else {\n this.sortable.el.appendChild(dragEl);\n }\n this.sortable.animateAll();\n if (putSortable) {\n putSortable.animateAll();\n }\n },\n drop: drop\n};\n_extends(Revert, {\n pluginName: 'revertOnSpill'\n});\nfunction Remove() {}\nRemove.prototype = {\n onSpill: function onSpill(_ref4) {\n var dragEl = _ref4.dragEl,\n putSortable = _ref4.putSortable;\n var parentSortable = putSortable || this.sortable;\n parentSortable.captureAnimationState();\n dragEl.parentNode && dragEl.parentNode.removeChild(dragEl);\n parentSortable.animateAll();\n },\n drop: drop\n};\n_extends(Remove, {\n pluginName: 'removeOnSpill'\n});\n\nvar lastSwapEl;\nfunction SwapPlugin() {\n function Swap() {\n this.defaults = {\n swapClass: 'sortable-swap-highlight'\n };\n }\n Swap.prototype = {\n dragStart: function dragStart(_ref) {\n var dragEl = _ref.dragEl;\n lastSwapEl = dragEl;\n },\n dragOverValid: function dragOverValid(_ref2) {\n var completed = _ref2.completed,\n target = _ref2.target,\n onMove = _ref2.onMove,\n activeSortable = _ref2.activeSortable,\n changed = _ref2.changed,\n cancel = _ref2.cancel;\n if (!activeSortable.options.swap) return;\n var el = this.sortable.el,\n options = this.options;\n if (target && target !== el) {\n var prevSwapEl = lastSwapEl;\n if (onMove(target) !== false) {\n toggleClass(target, options.swapClass, true);\n lastSwapEl = target;\n } else {\n lastSwapEl = null;\n }\n if (prevSwapEl && prevSwapEl !== lastSwapEl) {\n toggleClass(prevSwapEl, options.swapClass, false);\n }\n }\n changed();\n completed(true);\n cancel();\n },\n drop: function drop(_ref3) {\n var activeSortable = _ref3.activeSortable,\n putSortable = _ref3.putSortable,\n dragEl = _ref3.dragEl;\n var toSortable = putSortable || this.sortable;\n var options = this.options;\n lastSwapEl && toggleClass(lastSwapEl, options.swapClass, false);\n if (lastSwapEl && (options.swap || putSortable && putSortable.options.swap)) {\n if (dragEl !== lastSwapEl) {\n toSortable.captureAnimationState();\n if (toSortable !== activeSortable) activeSortable.captureAnimationState();\n swapNodes(dragEl, lastSwapEl);\n toSortable.animateAll();\n if (toSortable !== activeSortable) activeSortable.animateAll();\n }\n }\n },\n nulling: function nulling() {\n lastSwapEl = null;\n }\n };\n return _extends(Swap, {\n pluginName: 'swap',\n eventProperties: function eventProperties() {\n return {\n swapItem: lastSwapEl\n };\n }\n });\n}\nfunction swapNodes(n1, n2) {\n var p1 = n1.parentNode,\n p2 = n2.parentNode,\n i1,\n i2;\n if (!p1 || !p2 || p1.isEqualNode(n2) || p2.isEqualNode(n1)) return;\n i1 = index(n1);\n i2 = index(n2);\n if (p1.isEqualNode(p2) && i1 < i2) {\n i2++;\n }\n p1.insertBefore(n2, p1.children[i1]);\n p2.insertBefore(n1, p2.children[i2]);\n}\n\nvar multiDragElements = [],\n multiDragClones = [],\n lastMultiDragSelect,\n // for selection with modifier key down (SHIFT)\n multiDragSortable,\n initialFolding = false,\n // Initial multi-drag fold when drag started\n folding = false,\n // Folding any other time\n dragStarted = false,\n dragEl$1,\n clonesFromRect,\n clonesHidden;\nfunction MultiDragPlugin() {\n function MultiDrag(sortable) {\n // Bind all private methods\n for (var fn in this) {\n if (fn.charAt(0) === '_' && typeof this[fn] === 'function') {\n this[fn] = this[fn].bind(this);\n }\n }\n if (!sortable.options.avoidImplicitDeselect) {\n if (sortable.options.supportPointer) {\n on(document, 'pointerup', this._deselectMultiDrag);\n } else {\n on(document, 'mouseup', this._deselectMultiDrag);\n on(document, 'touchend', this._deselectMultiDrag);\n }\n }\n on(document, 'keydown', this._checkKeyDown);\n on(document, 'keyup', this._checkKeyUp);\n this.defaults = {\n selectedClass: 'sortable-selected',\n multiDragKey: null,\n avoidImplicitDeselect: false,\n setData: function setData(dataTransfer, dragEl) {\n var data = '';\n if (multiDragElements.length && multiDragSortable === sortable) {\n multiDragElements.forEach(function (multiDragElement, i) {\n data += (!i ? '' : ', ') + multiDragElement.textContent;\n });\n } else {\n data = dragEl.textContent;\n }\n dataTransfer.setData('Text', data);\n }\n };\n }\n MultiDrag.prototype = {\n multiDragKeyDown: false,\n isMultiDrag: false,\n delayStartGlobal: function delayStartGlobal(_ref) {\n var dragged = _ref.dragEl;\n dragEl$1 = dragged;\n },\n delayEnded: function delayEnded() {\n this.isMultiDrag = ~multiDragElements.indexOf(dragEl$1);\n },\n setupClone: function setupClone(_ref2) {\n var sortable = _ref2.sortable,\n cancel = _ref2.cancel;\n if (!this.isMultiDrag) return;\n for (var i = 0; i < multiDragElements.length; i++) {\n multiDragClones.push(clone(multiDragElements[i]));\n multiDragClones[i].sortableIndex = multiDragElements[i].sortableIndex;\n multiDragClones[i].draggable = false;\n multiDragClones[i].style['will-change'] = '';\n toggleClass(multiDragClones[i], this.options.selectedClass, false);\n multiDragElements[i] === dragEl$1 && toggleClass(multiDragClones[i], this.options.chosenClass, false);\n }\n sortable._hideClone();\n cancel();\n },\n clone: function clone(_ref3) {\n var sortable = _ref3.sortable,\n rootEl = _ref3.rootEl,\n dispatchSortableEvent = _ref3.dispatchSortableEvent,\n cancel = _ref3.cancel;\n if (!this.isMultiDrag) return;\n if (!this.options.removeCloneOnHide) {\n if (multiDragElements.length && multiDragSortable === sortable) {\n insertMultiDragClones(true, rootEl);\n dispatchSortableEvent('clone');\n cancel();\n }\n }\n },\n showClone: function showClone(_ref4) {\n var cloneNowShown = _ref4.cloneNowShown,\n rootEl = _ref4.rootEl,\n cancel = _ref4.cancel;\n if (!this.isMultiDrag) return;\n insertMultiDragClones(false, rootEl);\n multiDragClones.forEach(function (clone) {\n css(clone, 'display', '');\n });\n cloneNowShown();\n clonesHidden = false;\n cancel();\n },\n hideClone: function hideClone(_ref5) {\n var _this = this;\n var sortable = _ref5.sortable,\n cloneNowHidden = _ref5.cloneNowHidden,\n cancel = _ref5.cancel;\n if (!this.isMultiDrag) return;\n multiDragClones.forEach(function (clone) {\n css(clone, 'display', 'none');\n if (_this.options.removeCloneOnHide && clone.parentNode) {\n clone.parentNode.removeChild(clone);\n }\n });\n cloneNowHidden();\n clonesHidden = true;\n cancel();\n },\n dragStartGlobal: function dragStartGlobal(_ref6) {\n var sortable = _ref6.sortable;\n if (!this.isMultiDrag && multiDragSortable) {\n multiDragSortable.multiDrag._deselectMultiDrag();\n }\n multiDragElements.forEach(function (multiDragElement) {\n multiDragElement.sortableIndex = index(multiDragElement);\n });\n\n // Sort multi-drag elements\n multiDragElements = multiDragElements.sort(function (a, b) {\n return a.sortableIndex - b.sortableIndex;\n });\n dragStarted = true;\n },\n dragStarted: function dragStarted(_ref7) {\n var _this2 = this;\n var sortable = _ref7.sortable;\n if (!this.isMultiDrag) return;\n if (this.options.sort) {\n // Capture rects,\n // hide multi drag elements (by positioning them absolute),\n // set multi drag elements rects to dragRect,\n // show multi drag elements,\n // animate to rects,\n // unset rects & remove from DOM\n\n sortable.captureAnimationState();\n if (this.options.animation) {\n multiDragElements.forEach(function (multiDragElement) {\n if (multiDragElement === dragEl$1) return;\n css(multiDragElement, 'position', 'absolute');\n });\n var dragRect = getRect(dragEl$1, false, true, true);\n multiDragElements.forEach(function (multiDragElement) {\n if (multiDragElement === dragEl$1) return;\n setRect(multiDragElement, dragRect);\n });\n folding = true;\n initialFolding = true;\n }\n }\n sortable.animateAll(function () {\n folding = false;\n initialFolding = false;\n if (_this2.options.animation) {\n multiDragElements.forEach(function (multiDragElement) {\n unsetRect(multiDragElement);\n });\n }\n\n // Remove all auxiliary multidrag items from el, if sorting enabled\n if (_this2.options.sort) {\n removeMultiDragElements();\n }\n });\n },\n dragOver: function dragOver(_ref8) {\n var target = _ref8.target,\n completed = _ref8.completed,\n cancel = _ref8.cancel;\n if (folding && ~multiDragElements.indexOf(target)) {\n completed(false);\n cancel();\n }\n },\n revert: function revert(_ref9) {\n var fromSortable = _ref9.fromSortable,\n rootEl = _ref9.rootEl,\n sortable = _ref9.sortable,\n dragRect = _ref9.dragRect;\n if (multiDragElements.length > 1) {\n // Setup unfold animation\n multiDragElements.forEach(function (multiDragElement) {\n sortable.addAnimationState({\n target: multiDragElement,\n rect: folding ? getRect(multiDragElement) : dragRect\n });\n unsetRect(multiDragElement);\n multiDragElement.fromRect = dragRect;\n fromSortable.removeAnimationState(multiDragElement);\n });\n folding = false;\n insertMultiDragElements(!this.options.removeCloneOnHide, rootEl);\n }\n },\n dragOverCompleted: function dragOverCompleted(_ref10) {\n var sortable = _ref10.sortable,\n isOwner = _ref10.isOwner,\n insertion = _ref10.insertion,\n activeSortable = _ref10.activeSortable,\n parentEl = _ref10.parentEl,\n putSortable = _ref10.putSortable;\n var options = this.options;\n if (insertion) {\n // Clones must be hidden before folding animation to capture dragRectAbsolute properly\n if (isOwner) {\n activeSortable._hideClone();\n }\n initialFolding = false;\n // If leaving sort:false root, or already folding - Fold to new location\n if (options.animation && multiDragElements.length > 1 && (folding || !isOwner && !activeSortable.options.sort && !putSortable)) {\n // Fold: Set all multi drag elements's rects to dragEl's rect when multi-drag elements are invisible\n var dragRectAbsolute = getRect(dragEl$1, false, true, true);\n multiDragElements.forEach(function (multiDragElement) {\n if (multiDragElement === dragEl$1) return;\n setRect(multiDragElement, dragRectAbsolute);\n\n // Move element(s) to end of parentEl so that it does not interfere with multi-drag clones insertion if they are inserted\n // while folding, and so that we can capture them again because old sortable will no longer be fromSortable\n parentEl.appendChild(multiDragElement);\n });\n folding = true;\n }\n\n // Clones must be shown (and check to remove multi drags) after folding when interfering multiDragElements are moved out\n if (!isOwner) {\n // Only remove if not folding (folding will remove them anyways)\n if (!folding) {\n removeMultiDragElements();\n }\n if (multiDragElements.length > 1) {\n var clonesHiddenBefore = clonesHidden;\n activeSortable._showClone(sortable);\n\n // Unfold animation for clones if showing from hidden\n if (activeSortable.options.animation && !clonesHidden && clonesHiddenBefore) {\n multiDragClones.forEach(function (clone) {\n activeSortable.addAnimationState({\n target: clone,\n rect: clonesFromRect\n });\n clone.fromRect = clonesFromRect;\n clone.thisAnimationDuration = null;\n });\n }\n } else {\n activeSortable._showClone(sortable);\n }\n }\n }\n },\n dragOverAnimationCapture: function dragOverAnimationCapture(_ref11) {\n var dragRect = _ref11.dragRect,\n isOwner = _ref11.isOwner,\n activeSortable = _ref11.activeSortable;\n multiDragElements.forEach(function (multiDragElement) {\n multiDragElement.thisAnimationDuration = null;\n });\n if (activeSortable.options.animation && !isOwner && activeSortable.multiDrag.isMultiDrag) {\n clonesFromRect = _extends({}, dragRect);\n var dragMatrix = matrix(dragEl$1, true);\n clonesFromRect.top -= dragMatrix.f;\n clonesFromRect.left -= dragMatrix.e;\n }\n },\n dragOverAnimationComplete: function dragOverAnimationComplete() {\n if (folding) {\n folding = false;\n removeMultiDragElements();\n }\n },\n drop: function drop(_ref12) {\n var evt = _ref12.originalEvent,\n rootEl = _ref12.rootEl,\n parentEl = _ref12.parentEl,\n sortable = _ref12.sortable,\n dispatchSortableEvent = _ref12.dispatchSortableEvent,\n oldIndex = _ref12.oldIndex,\n putSortable = _ref12.putSortable;\n var toSortable = putSortable || this.sortable;\n if (!evt) return;\n var options = this.options,\n children = parentEl.children;\n\n // Multi-drag selection\n if (!dragStarted) {\n if (options.multiDragKey && !this.multiDragKeyDown) {\n this._deselectMultiDrag();\n }\n toggleClass(dragEl$1, options.selectedClass, !~multiDragElements.indexOf(dragEl$1));\n if (!~multiDragElements.indexOf(dragEl$1)) {\n multiDragElements.push(dragEl$1);\n dispatchEvent({\n sortable: sortable,\n rootEl: rootEl,\n name: 'select',\n targetEl: dragEl$1,\n originalEvent: evt\n });\n\n // Modifier activated, select from last to dragEl\n if (evt.shiftKey && lastMultiDragSelect && sortable.el.contains(lastMultiDragSelect)) {\n var lastIndex = index(lastMultiDragSelect),\n currentIndex = index(dragEl$1);\n if (~lastIndex && ~currentIndex && lastIndex !== currentIndex) {\n (function () {\n // Must include lastMultiDragSelect (select it), in case modified selection from no selection\n // (but previous selection existed)\n var n, i;\n if (currentIndex > lastIndex) {\n i = lastIndex;\n n = currentIndex;\n } else {\n i = currentIndex;\n n = lastIndex + 1;\n }\n var filter = options.filter;\n for (; i < n; i++) {\n if (~multiDragElements.indexOf(children[i])) continue;\n // Check if element is draggable\n if (!closest(children[i], options.draggable, parentEl, false)) continue;\n // Check if element is filtered\n var filtered = filter && (typeof filter === 'function' ? filter.call(sortable, evt, children[i], sortable) : filter.split(',').some(function (criteria) {\n return closest(children[i], criteria.trim(), parentEl, false);\n }));\n if (filtered) continue;\n toggleClass(children[i], options.selectedClass, true);\n multiDragElements.push(children[i]);\n dispatchEvent({\n sortable: sortable,\n rootEl: rootEl,\n name: 'select',\n targetEl: children[i],\n originalEvent: evt\n });\n }\n })();\n }\n } else {\n lastMultiDragSelect = dragEl$1;\n }\n multiDragSortable = toSortable;\n } else {\n multiDragElements.splice(multiDragElements.indexOf(dragEl$1), 1);\n lastMultiDragSelect = null;\n dispatchEvent({\n sortable: sortable,\n rootEl: rootEl,\n name: 'deselect',\n targetEl: dragEl$1,\n originalEvent: evt\n });\n }\n }\n\n // Multi-drag drop\n if (dragStarted && this.isMultiDrag) {\n folding = false;\n // Do not \"unfold\" after around dragEl if reverted\n if ((parentEl[expando].options.sort || parentEl !== rootEl) && multiDragElements.length > 1) {\n var dragRect = getRect(dragEl$1),\n multiDragIndex = index(dragEl$1, ':not(.' + this.options.selectedClass + ')');\n if (!initialFolding && options.animation) dragEl$1.thisAnimationDuration = null;\n toSortable.captureAnimationState();\n if (!initialFolding) {\n if (options.animation) {\n dragEl$1.fromRect = dragRect;\n multiDragElements.forEach(function (multiDragElement) {\n multiDragElement.thisAnimationDuration = null;\n if (multiDragElement !== dragEl$1) {\n var rect = folding ? getRect(multiDragElement) : dragRect;\n multiDragElement.fromRect = rect;\n\n // Prepare unfold animation\n toSortable.addAnimationState({\n target: multiDragElement,\n rect: rect\n });\n }\n });\n }\n\n // Multi drag elements are not necessarily removed from the DOM on drop, so to reinsert\n // properly they must all be removed\n removeMultiDragElements();\n multiDragElements.forEach(function (multiDragElement) {\n if (children[multiDragIndex]) {\n parentEl.insertBefore(multiDragElement, children[multiDragIndex]);\n } else {\n parentEl.appendChild(multiDragElement);\n }\n multiDragIndex++;\n });\n\n // If initial folding is done, the elements may have changed position because they are now\n // unfolding around dragEl, even though dragEl may not have his index changed, so update event\n // must be fired here as Sortable will not.\n if (oldIndex === index(dragEl$1)) {\n var update = false;\n multiDragElements.forEach(function (multiDragElement) {\n if (multiDragElement.sortableIndex !== index(multiDragElement)) {\n update = true;\n return;\n }\n });\n if (update) {\n dispatchSortableEvent('update');\n dispatchSortableEvent('sort');\n }\n }\n }\n\n // Must be done after capturing individual rects (scroll bar)\n multiDragElements.forEach(function (multiDragElement) {\n unsetRect(multiDragElement);\n });\n toSortable.animateAll();\n }\n multiDragSortable = toSortable;\n }\n\n // Remove clones if necessary\n if (rootEl === parentEl || putSortable && putSortable.lastPutMode !== 'clone') {\n multiDragClones.forEach(function (clone) {\n clone.parentNode && clone.parentNode.removeChild(clone);\n });\n }\n },\n nullingGlobal: function nullingGlobal() {\n this.isMultiDrag = dragStarted = false;\n multiDragClones.length = 0;\n },\n destroyGlobal: function destroyGlobal() {\n this._deselectMultiDrag();\n off(document, 'pointerup', this._deselectMultiDrag);\n off(document, 'mouseup', this._deselectMultiDrag);\n off(document, 'touchend', this._deselectMultiDrag);\n off(document, 'keydown', this._checkKeyDown);\n off(document, 'keyup', this._checkKeyUp);\n },\n _deselectMultiDrag: function _deselectMultiDrag(evt) {\n if (typeof dragStarted !== \"undefined\" && dragStarted) return;\n\n // Only deselect if selection is in this sortable\n if (multiDragSortable !== this.sortable) return;\n\n // Only deselect if target is not item in this sortable\n if (evt && closest(evt.target, this.options.draggable, this.sortable.el, false)) return;\n\n // Only deselect if left click\n if (evt && evt.button !== 0) return;\n while (multiDragElements.length) {\n var el = multiDragElements[0];\n toggleClass(el, this.options.selectedClass, false);\n multiDragElements.shift();\n dispatchEvent({\n sortable: this.sortable,\n rootEl: this.sortable.el,\n name: 'deselect',\n targetEl: el,\n originalEvent: evt\n });\n }\n },\n _checkKeyDown: function _checkKeyDown(evt) {\n if (evt.key === this.options.multiDragKey) {\n this.multiDragKeyDown = true;\n }\n },\n _checkKeyUp: function _checkKeyUp(evt) {\n if (evt.key === this.options.multiDragKey) {\n this.multiDragKeyDown = false;\n }\n }\n };\n return _extends(MultiDrag, {\n // Static methods & properties\n pluginName: 'multiDrag',\n utils: {\n /**\r\n * Selects the provided multi-drag item\r\n * @param {HTMLElement} el The element to be selected\r\n */\n select: function select(el) {\n var sortable = el.parentNode[expando];\n if (!sortable || !sortable.options.multiDrag || ~multiDragElements.indexOf(el)) return;\n if (multiDragSortable && multiDragSortable !== sortable) {\n multiDragSortable.multiDrag._deselectMultiDrag();\n multiDragSortable = sortable;\n }\n toggleClass(el, sortable.options.selectedClass, true);\n multiDragElements.push(el);\n },\n /**\r\n * Deselects the provided multi-drag item\r\n * @param {HTMLElement} el The element to be deselected\r\n */\n deselect: function deselect(el) {\n var sortable = el.parentNode[expando],\n index = multiDragElements.indexOf(el);\n if (!sortable || !sortable.options.multiDrag || !~index) return;\n toggleClass(el, sortable.options.selectedClass, false);\n multiDragElements.splice(index, 1);\n }\n },\n eventProperties: function eventProperties() {\n var _this3 = this;\n var oldIndicies = [],\n newIndicies = [];\n multiDragElements.forEach(function (multiDragElement) {\n oldIndicies.push({\n multiDragElement: multiDragElement,\n index: multiDragElement.sortableIndex\n });\n\n // multiDragElements will already be sorted if folding\n var newIndex;\n if (folding && multiDragElement !== dragEl$1) {\n newIndex = -1;\n } else if (folding) {\n newIndex = index(multiDragElement, ':not(.' + _this3.options.selectedClass + ')');\n } else {\n newIndex = index(multiDragElement);\n }\n newIndicies.push({\n multiDragElement: multiDragElement,\n index: newIndex\n });\n });\n return {\n items: _toConsumableArray(multiDragElements),\n clones: [].concat(multiDragClones),\n oldIndicies: oldIndicies,\n newIndicies: newIndicies\n };\n },\n optionListeners: {\n multiDragKey: function multiDragKey(key) {\n key = key.toLowerCase();\n if (key === 'ctrl') {\n key = 'Control';\n } else if (key.length > 1) {\n key = key.charAt(0).toUpperCase() + key.substr(1);\n }\n return key;\n }\n }\n });\n}\nfunction insertMultiDragElements(clonesInserted, rootEl) {\n multiDragElements.forEach(function (multiDragElement, i) {\n var target = rootEl.children[multiDragElement.sortableIndex + (clonesInserted ? Number(i) : 0)];\n if (target) {\n rootEl.insertBefore(multiDragElement, target);\n } else {\n rootEl.appendChild(multiDragElement);\n }\n });\n}\n\n/**\r\n * Insert multi-drag clones\r\n * @param {[Boolean]} elementsInserted Whether the multi-drag elements are inserted\r\n * @param {HTMLElement} rootEl\r\n */\nfunction insertMultiDragClones(elementsInserted, rootEl) {\n multiDragClones.forEach(function (clone, i) {\n var target = rootEl.children[clone.sortableIndex + (elementsInserted ? Number(i) : 0)];\n if (target) {\n rootEl.insertBefore(clone, target);\n } else {\n rootEl.appendChild(clone);\n }\n });\n}\nfunction removeMultiDragElements() {\n multiDragElements.forEach(function (multiDragElement) {\n if (multiDragElement === dragEl$1) return;\n multiDragElement.parentNode && multiDragElement.parentNode.removeChild(multiDragElement);\n });\n}\n\nSortable.mount(new AutoScrollPlugin());\nSortable.mount(Remove, Revert);\n\nexport default Sortable;\nexport { MultiDragPlugin as MultiDrag, Sortable, SwapPlugin as Swap };\n","<script lang=\"ts\">\n import type { Component, Snippet } from 'svelte';\n import { typography } from '../../../tokens/typography';\n\n interface Props {\n /** Title text (alias for message) */\n title?: string;\n /** Main message to display */\n message?: string;\n /** Description text (alias for subtext) */\n description?: string;\n /** Secondary descriptive text */\n subtext?: string;\n /** Icon component (when iconType='component') */\n icon?: Component<any> | null;\n /** Image path (when iconType='image') */\n imageSrc?: string;\n /** Type of icon provided */\n iconType?: 'component' | 'image';\n /** Size classes for the icon */\n iconSize?: string;\n /** Additional CSS classes */\n class?: string;\n /** Optional action content (buttons, links, etc.) */\n children?: Snippet;\n }\n\n let {\n title = '',\n message = '',\n description = '',\n subtext = '',\n icon = null,\n imageSrc = '',\n iconType = 'component',\n iconSize = 'w-20 h-20',\n class: className = '',\n children\n }: Props = $props();\n \n // Support both naming conventions\n let displayTitle = $derived(title || message || 'No results found');\n let displaySubtext = $derived(description || subtext);\n</script>\n\n<div class=\"flex flex-col items-center justify-center px-6 py-10 text-center {className}\">\n {#if icon || imageSrc}\n {#if iconType === 'component' && icon}\n {@const IconComponent = icon}\n <IconComponent class=\"mb-3 text-gray-400 dark:text-gray-500 {iconSize}\" />\n {:else if iconType === 'image' && imageSrc}\n <img src={imageSrc} alt=\"\" class=\"mb-3 {iconSize}\" />\n {/if}\n {/if}\n\n <h3 class={typography.h3}>{displayTitle}</h3>\n {#if displaySubtext}\n <p class={`${typography.smMuted} mt-1`}>{displaySubtext}</p>\n {/if}\n \n {#if children}\n <div class=\"mt-4\">\n {@render children()}\n </div>\n {/if}\n</div>\n","/*\n * Copyright 2025 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\nfunction setScriptSrc(script, src) {\n script.src = src;\n}\n\n/*\n * Copyright 2025 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\n\nconst bootstrap = bootstrapParams => {\n var bootstrapPromise;\n var script;\n var bootstrapParamsKey;\n var PRODUCT_NAME = \"The Google Maps JavaScript API\";\n var GOOGLE = \"google\";\n var IMPORT_API_NAME = \"importLibrary\";\n var PENDING_BOOTSTRAP_KEY = \"__ib__\";\n var doc = document;\n var global_ = window;\n var google_ = global_[GOOGLE] || (global_[GOOGLE] = {});\n var namespace = google_.maps || (google_.maps = {});\n var libraries = new Set();\n var searchParams = new URLSearchParams();\n var triggerBootstrap = () => bootstrapPromise || (bootstrapPromise = new Promise(async(resolve, reject) => {\n await (script = doc.createElement(\"script\"));\n searchParams.set(\"libraries\", [...libraries] + \"\");\n for (bootstrapParamsKey in bootstrapParams) {\n searchParams.set(bootstrapParamsKey.replace(/[A-Z]/g, g => \"_\" + g[0].toLowerCase()), bootstrapParams[bootstrapParamsKey]);\n }\n searchParams.set(\"callback\", GOOGLE + \".maps.\" + PENDING_BOOTSTRAP_KEY);\n setScriptSrc(script, \"https://maps.googleapis.com/maps/api/js?\" + searchParams);\n namespace[PENDING_BOOTSTRAP_KEY] = resolve;\n script.onerror = () => bootstrapPromise = reject(Error(PRODUCT_NAME + \" could not load.\"));\n script.nonce = doc.querySelector(\"script[nonce]\")?.nonce || \"\";\n doc.head.append(script);\n }));\n namespace[IMPORT_API_NAME] ? console.warn(PRODUCT_NAME + \" only loads once. Ignoring:\", bootstrapParams) : namespace[IMPORT_API_NAME] = (libraryName, ...args) => libraries.add(libraryName) && triggerBootstrap().then(() => namespace[IMPORT_API_NAME](libraryName, ...args));\n};\n\nconst MSG_DEPRECATED_LOADER = \"The Loader class is no longer available in this version.\" +\n \"\\nPlease use the new functional API: setOptions() and importLibrary().\" +\n \"\\nFor more information, see the updated documentation at: \" +\n \"https://github.com/googlemaps/js-api-loader/blob/main/README.md\";\nconst MSG_REPEATED_SET_OPTIONS = (options) => `The setOptions() function should only be called once. The options passed ` +\n `to the additional call (${JSON.stringify(options)}) will be ignored.`;\nconst MSG_IMPORT_LIBRARY_EXISTS = (options) => `The google.maps.importLibrary() function is already defined, and ` +\n `@googlemaps/js-api-loader will use the existing function instead of ` +\n `overwriting it. The options passed to setOptions ` +\n `(${JSON.stringify(options)}) will be ignored.`;\nconst MSG_SET_OPTIONS_NOT_CALLED = \"No options were set before calling importLibrary. Make sure to configure \" +\n \"the loader using setOptions().\";\nconst MSG_SCRIPT_ELEMENT_EXISTS = \"There already is a script loading the Google Maps JavaScript \" +\n \"API, and no google.maps.importLibrary function is defined. \" +\n \"@googlemaps/js-api-loader will proceed to bootstrap the API \" +\n \"with the specified options, but the existing script might cause \" +\n \"problems using the API. Make sure to remove the script \" +\n \"loading the API.\";\nconst __DEV__$1 = process.env.NODE_ENV !== 'production';\nconst logDevWarning = __DEV__$1\n ? (message) => {\n console.warn(`[@googlemaps/js-api-loader] ${message}`);\n }\n : () => { };\nconst logDevNotice = __DEV__$1\n ? (message) => {\n console.info(`[@googlemaps/js-api-loader] ${message}`);\n }\n : () => { };\n\n/*\n * Copyright 2025 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n/* eslint-disable @typescript-eslint/no-explicit-any, @typescript-eslint/no-unused-vars */\n/**\n * @deprecated Use the new functional API: `setOptions()` and `importLibrary()`.\n * See the migration guide for more details: MIGRATION.md\n */\nclass Loader {\n constructor(...args) {\n throw new Error(`[@googlemaps/js-api-loader]: ${MSG_DEPRECATED_LOADER}`);\n }\n}\n\n/*\n * Copyright 2025 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nconst __DEV__ = process.env.NODE_ENV !== 'production';\nlet setOptionsWasCalled_ = false;\n/**\n * Sets the options for the Maps JavaScript API.\n *\n * Has to be called before any library is loaded.\n *\n * See https://developers.google.com/maps/documentation/javascript/load-maps-js-api#required_parameters\n * for the full documentation of available options.\n *\n * @param options The options to set.\n */\nfunction setOptions(options) {\n if (setOptionsWasCalled_) {\n logDevWarning(MSG_REPEATED_SET_OPTIONS(options));\n return;\n }\n installImportLibrary_(options);\n setOptionsWasCalled_ = true;\n}\nasync function importLibrary(libraryName) {\n if (!setOptionsWasCalled_) {\n logDevWarning(MSG_SET_OPTIONS_NOT_CALLED);\n }\n if (!window?.google?.maps?.importLibrary) {\n throw new Error(\"google.maps.importLibrary is not installed.\");\n }\n return (await google.maps.importLibrary(libraryName));\n}\n/**\n * The installImportLibrary_ function makes sure that a usable version of the\n * `google.maps.importLibrary` function exists.\n */\nfunction installImportLibrary_(options) {\n const importLibraryExists = Boolean(window.google?.maps?.importLibrary);\n if (importLibraryExists) {\n logDevNotice(MSG_IMPORT_LIBRARY_EXISTS(options));\n }\n else if (__DEV__) {\n const scriptEl = document.querySelector('script[src*=\"maps.googleapis.com/maps/api/js\"]');\n if (scriptEl) {\n logDevWarning(MSG_SCRIPT_ELEMENT_EXISTS);\n }\n }\n // If the google.maps.importLibrary function already exists, bootstrap()\n // won't do anything, so we won't call it\n if (!importLibraryExists) {\n bootstrap(options);\n }\n}\n\nexport { Loader, importLibrary, setOptions };\n//# sourceMappingURL=index.js.map\n","export default \"data:image/svg+xml,%3csvg%20width='14'%20height='14'%20viewBox='0%200%2014%2014'%20fill='none'%20xmlns='http://www.w3.org/2000/svg'%3e%3cg%20id='cancel'%3e%3cpath%20id='Vector'%20d='M11.0846%202.91797L2.91797%2011.0846M2.91797%202.91797L11.0846%2011.0846'%20stroke='%23FF6666'%20stroke-width='2'%20stroke-linecap='round'%20stroke-linejoin='round'/%3e%3c/g%3e%3c/svg%3e\"","<script>\n import { ExclamationTriangleOutline } from \"../../primitives/Icons\";\n import Button from \"../../primitives/Button/Button.svelte\";\n import Cancel from \"../../assets/svg/cancel.svg\";\n import Modal from \"../../primitives/Modal/Modal.svelte\";\n import { typography } from '../../tokens/typography';\n\n let {\n open = $bindable(false),\n size = \"md\", // \"sm\" | \"md\" | \"lg\" | \"xl\"\n title = \"\",\n description = \"\",\n closeBtn = false, // To show close button\n persistent = false, // When true, prevents closing by clicking backdrop or pressing Escape\n\n // Input configuration\n inputLabel = \"\",\n inputPlaceholder = \"\",\n inputType = \"text\", // text | email | password | textarea\n inputValue = $bindable(\"\"),\n inputRequired = false,\n inputRows = 4, // For textarea\n inputIcon = null, // SVG component for input prefix icon\n helpText = \"\", // Helper text below input\n\n // Validation\n errorMessage = \"\",\n showError = false,\n validateEmail = false, // Auto-validate email format\n\n // Buttons\n primaryButtonText = \"Confirm\",\n secondaryButtonText = \"Cancel\",\n primaryButtonVariant = \"blue-solid\", // blue-solid | red-solid\n\n // State\n disabled = false,\n loading = false,\n\n // Callbacks\n onconfirm,\n oncancel,\n onclose,\n } = $props();\n\n // Email validation\n const isValidEmail = (email) => {\n const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n return emailRegex.test(email);\n };\n\n let emailError = $derived(validateEmail && inputValue && !isValidEmail(inputValue));\n let isEmpty = $derived(inputRequired && (!inputValue || inputValue.trim() === \"\"));\n let hasError = $derived(showError || emailError);\n let isDisabled = $derived(disabled || loading || isEmpty || emailError);\n\n const handlePrimaryAction = () => {\n if (!isDisabled) {\n onconfirm?.({ value: inputValue });\n }\n };\n\n const handleSecondaryAction = () => {\n if (!disabled && !loading) {\n oncancel?.();\n closeModal();\n }\n };\n\n const closeModal = () => {\n open = false;\n onclose?.();\n };\n\n const handleClose = () => {\n if (disabled || loading) return;\n closeModal();\n };\n</script>\n\n<Modal bind:open {size} {persistent}>\n {#snippet header()}\n <div class=\"text-left\">\n {#if closeBtn}\n <div class=\"flex justify-end -mt-2 -mr-2 mb-2\">\n <Button variant=\"icon\" size=\"xs\" onclick={handleClose} {disabled}>\n <img src={Cancel} alt=\"Close\" class=\"w-5 h-5\" />\n </Button>\n </div>\n {/if}\n {#if title}\n <h3 class={typography.h2}>{title}</h3>\n {/if}\n </div>\n {/snippet}\n\n {#snippet body()}\n <div class=\"text-left mt-4\">\n {#if description}\n <p class={`${typography.smMuted} leading-relaxed mb-4`}>\n {description}\n </p>\n {/if}\n\n <div>\n {#if inputLabel}\n <label\n for=\"modal-input\"\n class={`${typography.label} block mb-2`}\n >\n {inputLabel}\n </label>\n {/if}\n\n {#if inputType === \"textarea\"}\n <textarea\n id=\"modal-input\"\n bind:value={inputValue}\n placeholder={inputPlaceholder}\n rows={inputRows}\n class=\"w-full px-3 py-2 border {hasError ? 'border-red-500' : 'border-gray-300 dark:border-gray-600'} bg-gray-50 dark:bg-gray-700 {typography.body} rounded-lg focus:outline-hidden focus:ring-2 focus:ring-blue-500 focus:border-transparent resize-none\"\n disabled={disabled || loading}\n ></textarea>\n {:else}\n <div class=\"relative\">\n {#if inputIcon}\n {@const InputIconComponent = inputIcon}\n <div class=\"absolute inset-y-0 left-0 flex items-center pl-3 pointer-events-none\">\n <InputIconComponent class={`w-5 h-5 ${typography.iconMuted}`} />\n </div>\n {/if}\n <input\n id=\"modal-input\"\n type={inputType}\n bind:value={inputValue}\n placeholder={inputPlaceholder}\n required={inputRequired}\n disabled={disabled || loading}\n class=\"w-full {inputIcon ? 'pl-10' : 'px-3'} py-2 border {hasError ? 'border-red-500' : 'border-gray-300 dark:border-gray-600'} rounded-lg {typography.body} bg-white dark:bg-gray-700 focus:ring-2 focus:ring-blue-500 focus:border-transparent disabled:opacity-50 disabled:cursor-not-allowed\"\n />\n </div>\n {/if}\n\n {#if hasError && (errorMessage || emailError)}\n <p class={`${typography.label} text-red-600 dark:text-red-400 mt-2 flex items-center gap-1`}>\n <ExclamationTriangleOutline class=\"w-4 h-4\" />\n {emailError ? \"Please enter a valid email address\" : errorMessage}\n </p>\n {:else if helpText && !hasError}\n <p class={`${typography.xsMuted} pt-2`}>\n {helpText}\n </p>\n {/if}\n </div>\n </div>\n {/snippet}\n\n {#snippet footer()}\n <div class=\"flex gap-3\">\n {#if secondaryButtonText}\n <Button\n size=\"full\"\n variant=\"alternative\"\n onclick={handleSecondaryAction}\n disabled={disabled || loading}\n >\n {secondaryButtonText}\n </Button>\n {/if}\n\n <Button\n size=\"full\"\n variant={primaryButtonVariant}\n onclick={handlePrimaryAction}\n disabled={isDisabled}\n {loading}\n >\n {primaryButtonText}\n </Button>\n </div>\n {/snippet}\n</Modal>\n","<script>\n export let size = 16;\n\n export let title = undefined;\n\n $: labelled = $$props[\"aria-label\"] || $$props[\"aria-labelledby\"] || title;\n $: attributes = {\n \"aria-hidden\": labelled ? undefined : true,\n role: labelled ? \"img\" : undefined,\n focusable: Number($$props[\"tabindex\"]) === 0 ? true : undefined\n };\n</script>\n\n<svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 32 32\"\n fill=\"currentColor\"\n preserveAspectRatio=\"xMidYMid meet\"\n width={size}\n height={size}\n {...attributes}\n {...$$restProps}>\n {#if title}<title>{title}</title>{/if}\n <path d=\"M12 10H6.78A11 11 0 0127 16h2A13 13 0 006 7.68V4H4v8h8zM20 22h5.22A11 11 0 015 16H3a13 13 0 0023 8.32V28h2V20H20z\"></path>\n</svg>","<script>\n export let size = 16;\n\n export let title = undefined;\n\n $: labelled = $$props[\"aria-label\"] || $$props[\"aria-labelledby\"] || title;\n $: attributes = {\n \"aria-hidden\": labelled ? undefined : true,\n role: labelled ? \"img\" : undefined,\n focusable: Number($$props[\"tabindex\"]) === 0 ? true : undefined\n };\n</script>\n\n<svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 32 32\"\n fill=\"currentColor\"\n preserveAspectRatio=\"xMidYMid meet\"\n width={size}\n height={size}\n {...attributes}\n {...$$restProps}>\n {#if title}<title>{title}</title>{/if}\n <path d=\"M16,2A14,14,0,1,0,30,16,14,14,0,0,0,16,2ZM14,21.5908l-5-5L10.5906,15,14,18.4092,21.41,11l1.5957,1.5859Z\"></path><path fill=\"none\" d=\"M14 21.591L9 16.591 10.591 15 14 18.409 21.41 11 23.005 12.585 14 21.591z\" data-icon-path=\"inner-path\"></path>\n</svg>","import { writable } from 'svelte/store';\n\n// Create a reactive page store that updates on navigation\nconst createPageStore = () => {\n const getPageState = () => ({\n url: typeof window !== 'undefined' ? new URL(window.location.href) : new URL('http://localhost'),\n params: {},\n route: { id: null },\n status: 200,\n error: null,\n data: {},\n form: null,\n state: {}\n });\n\n const { subscribe, set } = writable(getPageState());\n\n // Listen for navigation events in the browser\n if (typeof window !== 'undefined') {\n // Update on popstate (back/forward navigation)\n window.addEventListener('popstate', () => set(getPageState()));\n\n // Intercept pushState and replaceState to detect programmatic navigation\n const originalPushState = history.pushState;\n const originalReplaceState = history.replaceState;\n\n history.pushState = function(...args) {\n originalPushState.apply(this, args);\n set(getPageState());\n };\n\n history.replaceState = function(...args) {\n originalReplaceState.apply(this, args);\n set(getPageState());\n };\n\n // Also listen for click events on links to catch SvelteKit navigation\n window.addEventListener('click', (e) => {\n // Small delay to let the navigation complete\n setTimeout(() => set(getPageState()), 0);\n });\n }\n\n return { subscribe };\n};\n\nexport const page = createPageStore();\n\nexport const navigating = writable(null);\nexport const updated = writable(false);","<script>\n import { ChevronLeftOutline, ChevronRightOutline } from '../../primitives/Icons';\n import { typography } from '../../tokens/typography';\n\n const today = new Date();\n const todayLocalMonth = today.getMonth();\n const todayLocalYear = today.getFullYear();\n\n let {\n currentYear = todayLocalYear,\n currentMonth = todayLocalMonth,\n handleNext = () => {},\n handlePrev = () => {},\n handleToday = () => {},\n disablePastNavigation = true,\n } = $props();\n\n let isAtCurrentMonth = $derived(\n currentYear === todayLocalYear && currentMonth === todayLocalMonth\n );\n\n let canGoPrev = $derived(!disablePastNavigation || !isAtCurrentMonth);\n\n let prevPressed = $state(false);\n let nextPressed = $state(false);\n let todayPressed = $state(false);\n\n function triggerHaptic(style = 'light') {\n if (typeof window === 'undefined') return;\n\n if (window.webkit?.messageHandlers?.haptic) {\n window.webkit.messageHandlers.haptic.postMessage(style);\n return;\n }\n\n if (window.TapticEngine) {\n window.TapticEngine.impact({ style });\n return;\n }\n\n if (navigator.vibrate) {\n navigator.vibrate(style === 'light' ? 10 : 20);\n }\n }\n\n function handlePrevClick() {\n if (canGoPrev) {\n triggerHaptic('light');\n handlePrev();\n }\n }\n\n function handleNextClick() {\n triggerHaptic('light');\n handleNext();\n }\n\n function handleTodayClick() {\n triggerHaptic('light');\n handleToday();\n }\n</script>\n\n<header class=\"w-full flex items-center justify-between select-none\">\n <h2 class=\"{typography.h1} text-3xl\">\n {new Intl.DateTimeFormat(\"en\", {\n month: \"long\",\n }).format(new Date(currentYear, currentMonth, 1))}\n </h2>\n <div class=\"flex items-center gap-2\">\n <button\n class=\"p-3 -m-1.5 flex items-center justify-center border-0 rounded-full bg-transparent text-gray-500 dark:text-gray-400 cursor-pointer select-none transition-transform duration-100 ease-out hover:bg-gray-100 dark:hover:bg-gray-700 hover:text-gray-900 dark:hover:text-white focus:outline-hidden focus-visible:ring-2 focus-visible:ring-blue-600 focus-visible:ring-offset-2 disabled:opacity-50 disabled:cursor-not-allowed\"\n class:scale-90={prevPressed}\n class:bg-gray-100={prevPressed}\n class:dark:bg-gray-700={prevPressed}\n class:text-gray-900={prevPressed}\n class:dark:text-white={prevPressed}\n onclick={handlePrevClick}\n ontouchstart={() => prevPressed = true}\n ontouchend={() => prevPressed = false}\n ontouchcancel={() => prevPressed = false}\n onmousedown={() => prevPressed = true}\n onmouseup={() => prevPressed = false}\n onmouseleave={() => prevPressed = false}\n disabled={!canGoPrev}\n aria-label=\"Previous month\"\n >\n <ChevronLeftOutline class=\"w-5 h-5\" />\n </button>\n <button\n class=\"{`${typography.label} px-3 py-1 border border-gray-300 dark:border-gray-600 rounded-lg bg-transparent cursor-pointer select-none transition-transform duration-100 ease-out hover:bg-blue-700 hover:text-white hover:border-blue-700 focus:outline-hidden focus-visible:ring-2 focus-visible:ring-blue-600 focus-visible:ring-offset-2 disabled:opacity-40 disabled:cursor-not-allowed disabled:text-gray-500 dark:disabled:text-gray-400`}\"\n class:scale-95={todayPressed}\n class:bg-blue-700={todayPressed}\n class:text-white={todayPressed}\n onclick={handleTodayClick}\n ontouchstart={() => todayPressed = true}\n ontouchend={() => todayPressed = false}\n ontouchcancel={() => todayPressed = false}\n onmousedown={() => todayPressed = true}\n onmouseup={() => todayPressed = false}\n onmouseleave={() => todayPressed = false}\n disabled={isAtCurrentMonth}\n aria-label=\"Go to current month\"\n >\n Today\n </button>\n <button\n class=\"p-3 -m-1.5 flex items-center justify-center border-0 rounded-full bg-transparent text-gray-500 dark:text-gray-400 cursor-pointer select-none transition-transform duration-100 ease-out hover:bg-gray-100 dark:hover:bg-gray-700 hover:text-gray-900 dark:hover:text-white focus:outline-hidden focus-visible:ring-2 focus-visible:ring-blue-600 focus-visible:ring-offset-2\"\n class:scale-90={nextPressed}\n class:bg-gray-100={nextPressed}\n class:dark:bg-gray-700={nextPressed}\n class:text-gray-900={nextPressed}\n class:dark:text-white={nextPressed}\n onclick={handleNextClick}\n ontouchstart={() => nextPressed = true}\n ontouchend={() => nextPressed = false}\n ontouchcancel={() => nextPressed = false}\n onmousedown={() => nextPressed = true}\n onmouseup={() => nextPressed = false}\n onmouseleave={() => nextPressed = false}\n aria-label=\"Next month\"\n >\n <ChevronRightOutline class=\"w-5 h-5\" />\n </button>\n </div>\n</header>\n","<script>\n import { fly, fade } from 'svelte/transition';\n import { cubicOut } from 'svelte/easing';\n import { ChevronDownOutline, CloseOutline } from '../../primitives/Icons';\n import Spinner from '../../primitives/Spinner/Spinner.svelte';\n import { typography } from '../../tokens/typography';\n\n /**\n * Default labels for all user-visible strings in OrderSummary.\n * Consumers can override any string via the `labels` prop.\n */\n const defaultLabels = {\n orderSummary: 'Order summary',\n selectTickets: 'Select tickets to continue',\n free: 'Free',\n fullPrice: 'Full Price',\n discount: 'Discount',\n subtotal: 'Subtotal',\n fees: 'Fees',\n taxes: 'Taxes',\n giftCardAppliedLabel: 'Gift Card Applied',\n giftCardBalanceAfterOrder: 'Gift card balance after order',\n amountDue: 'Amount Due',\n fullyCoveredByGiftCard: 'Fully covered by gift card',\n total: 'Total',\n placeOrderTos: 'By selecting Place order, I agree to the',\n termsOfService: 'terms of service',\n checkout: 'Checkout',\n ticketSingular: 'ticket',\n ticketPlural: 'tickets',\n closeOrderSummary: 'Close order summary',\n };\n\n let {\n loading = false,\n quantities = {},\n donationAmounts = {}, // Map of ticketId -> donation amount string\n eventTickets = [],\n checkoutTicket = null,\n isAgreed = true,\n btnText = 'Checkout',\n promoApplied = false,\n promoDiscount = 0,\n currentPromoRule = null,\n executePurchase = null,\n elements = null,\n venueServiceCharge = {\n serviceFeeCents: 0,\n serviceFeePercentage: 0,\n serviceFeeChargeType: 'both',\n maxServiceFeeCents: 0,\n taxPercentage: 0,\n },\n onPriceUpdate,\n giftCardApplied = null, // { code, giftCardAmount, giftCardBalance, stripeAmount, paymentType, requiresStripe }\n /** @type {Partial<typeof defaultLabels>} Override any user-visible string */\n labels: userLabels = {},\n } = $props();\n\n let labels = $derived({ ...defaultLabels, ...userLabels });\n\n // Helper to get effective price for a ticket (handles donation tickets)\n function getEffectivePrice(ticket) {\n // Donation ticket (type 2): use user-entered donation amount\n if (isDonationTicket(ticket)) {\n const donationAmount = donationAmounts[ticket.ID];\n return parseFloat(donationAmount) || 0;\n }\n // Regular ticket: use ticket price\n return parseFloat(ticket.price) || 0;\n }\n\n // Check if ticket is a donation ticket\n // Handle both 'type' and 'ticketType' fields, and coerce to number for comparison\n function isDonationTicket(ticket) {\n const ticketType = ticket.type ?? ticket.ticketType ?? 0;\n return Number(ticketType) === 2;\n }\n\n let showOrderSummaryOnMobile = $state(false);\n\n function feeFor(price) {\n const chargeType = venueServiceCharge.serviceFeeChargeType || 'both';\n let fee = 0;\n\n if (chargeType === 'flat' || chargeType === 'both') {\n fee += (venueServiceCharge.serviceFeeCents || 0) / 100;\n }\n if (chargeType === 'percent' || chargeType === 'both') {\n fee += ((venueServiceCharge.serviceFeePercentage || 0) / 100) * price;\n }\n\n const maxFee = venueServiceCharge.maxServiceFeeCents || 0;\n if (maxFee > 0 && fee > maxFee / 100) {\n fee = maxFee / 100;\n }\n\n return fee;\n }\n\n function makeOrderSummaryVisible() {\n showOrderSummaryOnMobile = !showOrderSummaryOnMobile;\n }\n\n function getDiscountedPrice(ticket) {\n if (!currentPromoRule?.provideDiscount) return null;\n\n const discountTicketIds = currentPromoRule.discountTicketIds || [];\n if (discountTicketIds.length > 0 && !discountTicketIds.includes(ticket.ID)) {\n return null;\n }\n\n const basePrice = parseFloat(ticket.price) || 0;\n const discountAmount = parseFloat(currentPromoRule?.amount || '0') || 0;\n if (currentPromoRule.discountType === '%') {\n return (basePrice * (1 - discountAmount / 100)).toFixed(2);\n } else if (currentPromoRule.discountType === '$') {\n return Math.max(0, basePrice - discountAmount).toFixed(2);\n }\n return null;\n }\n\n let totalQuantity = $derived(Object.values(quantities).reduce((sum, q) => sum + q, 0));\n let showFooter = $derived(totalQuantity > 0);\n\n let subtotalWithoutDiscount = $derived(Object.keys(quantities).reduce((acc, key) => {\n const ticket = eventTickets.find(t => t.ID == key);\n if (!ticket) return acc;\n // For donation tickets, use the donation amount; otherwise use ticket price\n const effectivePrice = getEffectivePrice(ticket);\n return acc + quantities[key] * effectivePrice;\n }, 0));\n\n let subtotal = $derived(Object.keys(quantities).reduce((acc, key) => {\n const ticket = eventTickets.find(t => t.ID == key);\n if (!ticket) return acc;\n // For donation tickets, use the donation amount (no discounts apply)\n if (isDonationTicket(ticket)) {\n const effectivePrice = getEffectivePrice(ticket);\n return acc + quantities[key] * effectivePrice;\n }\n // For regular tickets, apply discounts as usual\n const discountedPrice = getDiscountedPrice(ticket);\n const priceToUse = discountedPrice !== null ? parseFloat(discountedPrice) : ticket.price;\n return acc + quantities[key] * priceToUse;\n }, 0));\n\n let promoSavings = $derived(currentPromoRule?.provideDiscount ? (subtotalWithoutDiscount - subtotal) : 0);\n\n let fees = $derived(Object.keys(quantities).reduce((acc, key) => {\n const ticket = eventTickets.find(t => t.ID == key);\n // Skip fees for: no ticket, free tickets, and donation tickets (type 2)\n if (!ticket || ticket.price == 0 || isDonationTicket(ticket)) return acc;\n const discountedPrice = getDiscountedPrice(ticket);\n const priceToUse = discountedPrice !== null ? parseFloat(discountedPrice) : ticket.price;\n return acc + quantities[key] * feeFor(priceToUse);\n }, 0));\n\n let taxRate = $derived((venueServiceCharge.taxPercentage || 0) / 100);\n let taxes = $derived(subtotal > 0 ? subtotal * taxRate : 0);\n\n // Gift card derived values\n let giftCardAmountDisplay = $derived(\n giftCardApplied ? (giftCardApplied.giftCardAmount / 100).toFixed(2) : null\n );\n let giftCardRemainingBalance = $derived(\n giftCardApplied ? ((giftCardApplied.giftCardBalance - giftCardApplied.giftCardAmount) / 100).toFixed(2) : null\n );\n\n // Total accounts for gift card deduction\n let total = $derived(\n Math.max(0, subtotal + fees + taxes\n - (promoApplied && !currentPromoRule?.provideDiscount ? promoDiscount : 0)\n - (giftCardApplied ? giftCardApplied.giftCardAmount / 100 : 0)\n )\n );\n\n $effect(() => {\n onPriceUpdate?.({ subtotal, fees, taxes, total, promoSavings });\n });\n</script>\n\n<div\n id=\"orderSummary\"\n class=\"hidden min-[872px]:block h-fit rounded-lg bg-white dark:bg-gray-800 border border-gray-200 dark:border-gray-600\"\n>\n <div class=\"px-5 py-4 border-b border-gray-200 dark:border-gray-600\">\n <h3 class={typography.h3}>\n {labels.orderSummary}\n </h3>\n </div>\n\n <div class=\"px-5 pb-5\">\n {#if totalQuantity === 0}\n <div class=\"py-8 text-center\">\n <p class=\"{typography.smMuted}\">{labels.selectTickets}</p>\n </div>\n {:else}\n {#each Object.keys(quantities) as key}\n {#if quantities[key] > 0}\n {#each eventTickets as ticket}\n {#if ticket.ID == key}\n {@const effectivePrice = getEffectivePrice(ticket)}\n {@const isDonation = isDonationTicket(ticket)}\n <div class=\"flex justify-between py-3 border-b border-gray-200/50 dark:border-gray-600/50\">\n <div>\n <p class=\"{typography.label}\">{ticket.name}</p>\n <p class=\"{typography.smMuted}\">\n {#if ticket.price === 0 && !isDonation}\n {labels.free} x {quantities[key]}\n {:else if isDonation}\n ${effectivePrice.toFixed(2)} x {quantities[key]}\n {:else}\n ${ticket.price.toFixed(2)} x {quantities[key]}\n {/if}\n </p>\n </div>\n <div class=\"{typography.label}\">\n {#if ticket.price === 0 && !isDonation}\n {labels.free}\n {:else}\n ${(effectivePrice * quantities[key]).toFixed(2)}\n {/if}\n </div>\n </div>\n {/if}\n {/each}\n {/if}\n {/each}\n\n <div class=\"{`${typography.sm} flex flex-col py-3 gap-2`}\">\n {#if promoSavings > 0 || (promoDiscount > 0 && !currentPromoRule?.provideDiscount)}\n <div class=\"flex justify-between text-gray-600 dark:text-gray-300\">\n <span>{labels.fullPrice}</span><span>${subtotalWithoutDiscount.toFixed(2)}</span>\n </div>\n {/if}\n {#if promoSavings > 0}\n <div class=\"flex justify-between text-green-600 dark:text-green-500\">\n <span>{labels.discount}</span><span>-${promoSavings.toFixed(2)}</span>\n </div>\n {:else if promoDiscount > 0 && !currentPromoRule?.provideDiscount}\n <div class=\"flex justify-between text-green-600 dark:text-green-500\">\n <span>{labels.discount}</span><span>-${promoDiscount.toFixed(2)}</span>\n </div>\n {/if}\n <div class=\"flex justify-between text-gray-600 dark:text-gray-300\">\n <span>{labels.subtotal}</span><span>${subtotal.toFixed(2)}</span>\n </div>\n <div class=\"flex justify-between text-gray-600 dark:text-gray-300\">\n <span>{labels.fees}</span><span>${fees.toFixed(2)}</span>\n </div>\n <div class=\"flex justify-between text-gray-600 dark:text-gray-300\">\n <span>{labels.taxes}</span><span>${taxes.toFixed(2)}</span>\n </div>\n {#if giftCardApplied}\n <div class=\"flex justify-between text-green-600 dark:text-green-500\">\n <span>{labels.giftCardAppliedLabel}</span>\n <span>-${giftCardAmountDisplay}</span>\n </div>\n {#if giftCardRemainingBalance && parseFloat(giftCardRemainingBalance) > 0}\n <div class=\"flex justify-between text-gray-500 dark:text-gray-400 text-xs\">\n <span>{labels.giftCardBalanceAfterOrder}</span>\n <span>${giftCardRemainingBalance}</span>\n </div>\n {/if}\n {/if}\n </div>\n\n {#if giftCardApplied?.paymentType === 'gift_card_only'}\n <div class=\"flex justify-between py-4 text-lg border-t border-gray-200 dark:border-gray-600\">\n <span class=\"font-semibold text-gray-900 dark:text-white\">{labels.amountDue}</span>\n <span class=\"font-bold text-green-600 dark:text-green-400\">$0.00</span>\n </div>\n <p class=\"text-xs text-gray-500 dark:text-gray-400 text-center -mt-2 mb-2\">\n {labels.fullyCoveredByGiftCard}\n </p>\n {:else}\n <div class=\"flex justify-between {typography.h3} py-4 text-lg border-t border-gray-200 dark:border-gray-600\">\n <span>{labels.total}</span><span>${total.toFixed(2)}</span>\n </div>\n {/if}\n {/if}\n\n {#if totalQuantity > 0 && btnText === 'Place order'}\n <p class=\"{typography.xsMuted} text-center mb-3\">\n {labels.placeOrderTos} <a href=\"https://get-micdrop.com/tos\" class=\"text-blue-700 dark:text-blue-500 underline hover:opacity-80\" target=\"_blank\" rel=\"noopener noreferrer\">{labels.termsOfService}</a>\n </p>\n {/if}\n\n <button\n class=\"w-full h-12 font-semibold rounded-lg flex items-center justify-center transition-colors select-none touch-manipulation {totalQuantity === 0 ? 'bg-gray-200 dark:bg-gray-700 text-gray-500 dark:text-gray-400 cursor-not-allowed' : 'bg-blue-700 dark:bg-blue-600 text-white hover:bg-blue-800 dark:hover:bg-blue-700'}\"\n onclick={() => {\n if (totalQuantity === 0) return;\n if (executePurchase) {\n executePurchase(elements);\n } else if (checkoutTicket) {\n checkoutTicket();\n }\n }}\n disabled={totalQuantity === 0}\n >\n {#if loading}\n <Spinner size=\"sm\" color=\"white\" />\n {:else}\n <span translate=\"no\">{btnText}</span>\n {/if}\n </button>\n </div>\n</div>\n\n{#if showOrderSummaryOnMobile}\n <button\n class=\"min-[872px]:hidden fixed inset-0 bg-black/50 z-40 border-none cursor-pointer\"\n onclick={() => (showOrderSummaryOnMobile = false)}\n aria-label={labels.closeOrderSummary}\n transition:fade={{ duration: 200 }}\n ></button>\n <div\n in:fly={{ y: 800, duration: 300, easing: cubicOut }}\n out:fly={{ y: 800, duration: 300, easing: cubicOut }}\n class=\"min-[872px]:hidden fixed bottom-0 left-0 w-full overflow-x-hidden overflow-y-auto z-50 max-h-[80vh] rounded-t-lg shadow-xl bg-white dark:bg-gray-800\"\n >\n <div class=\"flex flex-row justify-between items-center px-5 py-4 border-b border-gray-200 dark:border-gray-600\">\n <h2 class=\"{typography.h2} text-xl\">\n {labels.orderSummary}\n </h2>\n <button\n onclick={() => (showOrderSummaryOnMobile = false)}\n class=\"transition-colors p-2 rounded-lg text-gray-500 dark:text-gray-400 hover:text-gray-900 dark:hover:text-white hover:bg-gray-50 dark:hover:bg-gray-700\"\n aria-label={labels.closeOrderSummary}\n >\n <CloseOutline class=\"w-7 h-7\" />\n </button>\n </div>\n\n <div class=\"px-5 pb-5\">\n {#each Object.keys(quantities) as key}\n {#if quantities[key] > 0}\n {#each eventTickets as ticket}\n {#if ticket.ID == key}\n {@const effectivePrice = getEffectivePrice(ticket)}\n {@const isDonation = isDonationTicket(ticket)}\n <div class=\"flex justify-between py-4 border-b border-gray-200 dark:border-gray-600\">\n <div>\n <p class=\"{typography.h5}\">{ticket.name}</p>\n <p class=\"{typography.smMuted}\">\n {#if ticket.price === 0 && !isDonation}\n {labels.free} x {quantities[key]}\n {:else if isDonation}\n ${effectivePrice.toFixed(2)} x {quantities[key]}\n {:else}\n ${ticket.price.toFixed(2)} x {quantities[key]}\n {/if}\n </p>\n </div>\n <div class=\"{typography.h5}\">\n {#if ticket.price === 0 && !isDonation}\n {labels.free}\n {:else}\n ${(effectivePrice * quantities[key]).toFixed(2)}\n {/if}\n </div>\n </div>\n {/if}\n {/each}\n {/if}\n {/each}\n\n <div class=\"flex flex-col py-4 gap-3 text-gray-600 dark:text-gray-300\">\n {#if promoSavings > 0 || (promoDiscount > 0 && !currentPromoRule?.provideDiscount)}\n <div class=\"flex justify-between\">\n <span>{labels.fullPrice}</span><span>${subtotalWithoutDiscount.toFixed(2)}</span>\n </div>\n {/if}\n {#if promoSavings > 0}\n <div class=\"flex justify-between text-green-600 dark:text-green-500\">\n <span>{labels.discount}</span><span>-${promoSavings.toFixed(2)}</span>\n </div>\n {:else if promoDiscount > 0 && !currentPromoRule?.provideDiscount}\n <div class=\"flex justify-between text-green-600 dark:text-green-500\">\n <span>{labels.discount}</span><span>-${promoDiscount.toFixed(2)}</span>\n </div>\n {/if}\n <div class=\"flex justify-between\">\n <span>{labels.subtotal}</span><span>${subtotal.toFixed(2)}</span>\n </div>\n <div class=\"flex justify-between\">\n <span>{labels.fees}</span><span>${fees.toFixed(2)}</span>\n </div>\n <div class=\"flex justify-between\">\n <span>{labels.taxes}</span><span>${taxes.toFixed(2)}</span>\n </div>\n {#if giftCardApplied}\n <div class=\"flex justify-between text-green-600 dark:text-green-500\">\n <span>{labels.giftCardAppliedLabel}</span>\n <span>-${giftCardAmountDisplay}</span>\n </div>\n {#if giftCardRemainingBalance && parseFloat(giftCardRemainingBalance) > 0}\n <div class=\"flex justify-between text-gray-500 dark:text-gray-400 text-xs\">\n <span>{labels.giftCardBalanceAfterOrder}</span>\n <span>${giftCardRemainingBalance}</span>\n </div>\n {/if}\n {/if}\n </div>\n\n {#if giftCardApplied?.paymentType === 'gift_card_only'}\n <div class=\"flex justify-between py-5 border-t border-gray-200 dark:border-gray-600\">\n <span class=\"font-semibold text-gray-900 dark:text-white\">{labels.amountDue}</span>\n <span class=\"font-bold text-green-600 dark:text-green-400\">$0.00</span>\n </div>\n <p class=\"text-xs text-gray-500 dark:text-gray-400 text-center -mt-2 mb-2\">\n {labels.fullyCoveredByGiftCard}\n </p>\n {:else}\n <div class=\"flex justify-between {typography.h3} py-5 border-t border-gray-200 dark:border-gray-600\">\n <span>{labels.total}</span><span>${total.toFixed(2)}</span>\n </div>\n {/if}\n </div>\n </div>\n{/if}\n\n{#if showFooter}\n <div\n transition:fly={{ y: 100, duration: 200 }}\n class=\"min-[872px]:hidden fixed bottom-0 left-0 right-0 z-40 bg-white dark:bg-gray-800 border-t border-gray-200 dark:border-gray-600 shadow-xl p-4 pb-[max(16px,calc(env(safe-area-inset-bottom)+8px))] select-none touch-manipulation\"\n >\n <div class=\"flex items-stretch gap-3\">\n <button class=\"flex flex-col justify-between items-start shrink-0 whitespace-nowrap bg-transparent border-none p-0 cursor-pointer touch-manipulation\" onclick={makeOrderSummaryVisible}>\n <span class=\"{`${typography.sm} flex items-center gap-1 text-gray-600 dark:text-gray-300`}\">\n {totalQuantity} {totalQuantity > 1 ? labels.ticketPlural : labels.ticketSingular}\n <ChevronDownOutline class={`w-4 h-4 ${typography.iconMuted} transition-transform duration-200 ${showOrderSummaryOnMobile ? 'rotate-180' : ''}`} />\n </span>\n <span class=\"{typography.h2} text-xl\">${total.toFixed(2)}</span>\n </button>\n\n <button\n class=\"{`${typography.label} flex-1 min-w-36 h-12 rounded-lg touch-manipulation flex items-center justify-center ${totalQuantity === 0 || !isAgreed ? 'bg-gray-200 dark:bg-gray-700 text-gray-500 dark:text-gray-400 cursor-not-allowed' : 'bg-blue-700 dark:bg-blue-600 text-white hover:bg-blue-800 dark:hover:bg-blue-700'}`}\"\n onclick={() => {\n if (executePurchase) {\n executePurchase(elements);\n } else if (checkoutTicket) {\n checkoutTicket();\n }\n }}\n disabled={totalQuantity === 0 || !isAgreed}\n >\n {#if loading}\n <Spinner size=\"sm\" color=\"white\" />\n {:else}\n <span translate=\"no\">{labels.checkout}</span>\n {/if}\n </button>\n </div>\n </div>\n{/if}\n","<script>\n import { typography } from '../../tokens/typography';\n\n let {\n day = '',\n date = '',\n time = '',\n isSelected = false,\n onselect,\n } = $props();\n\n function handleCardClick() {\n onselect?.({ date });\n }\n\n function handleKeydown(e) {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n handleCardClick();\n }\n }\n\n function formatHour(timeStr) {\n if (!timeStr) return '';\n const d = new Date(`1970-01-01T${timeStr}`);\n if (isNaN(d.getTime())) return timeStr;\n return d.toLocaleTimeString('en-US', {\n hour: 'numeric',\n minute: '2-digit',\n hour12: true\n });\n }\n\n function formatDate(dateStr) {\n if (!dateStr) return '';\n const d = new Date(dateStr);\n if (isNaN(d.getTime())) return dateStr;\n return d.toLocaleDateString('en-US', {\n month: 'short',\n day: 'numeric',\n });\n }\n</script>\n\n<div\n class=\"w-full h-28 rounded-lg flex flex-col justify-center items-center gap-1.5 cursor-pointer border-2 px-1 transition-colors bg-white dark:bg-gray-800 {isSelected\n ? 'border-blue-700 dark:border-blue-500'\n : 'border-gray-200 dark:border-gray-700 hover:border-blue-700 dark:hover:border-blue-500'}\"\n onclick={handleCardClick}\n onkeydown={handleKeydown}\n tabindex=\"0\"\n role=\"button\"\n aria-label={`${day} ${formatDate(date)} at ${formatHour(time)}${isSelected ? ', selected' : ''}`}\n aria-pressed={isSelected}\n>\n <span class=\"{typography.label} text-sm {typography.textMuted}\">{day}</span>\n <span class=\"{typography.label} text-base {isSelected ? 'text-blue-700 dark:text-blue-500' : ''}\">\n {formatDate(date)}\n </span>\n <span class=\"{typography.label} text-sm {typography.textMuted}\">{formatHour(time)}</span>\n</div>\n","<script>\n import { ShareOutline, CheckOutline } from '../../primitives/Icons';\n import ShowTimeCard from '../ShowTimeCard/ShowTimeCard.svelte';\n import { typography } from '../../tokens/typography';\n\n let {\n event = {},\n showtimes = [],\n showTitle = true,\n formatDateTime = (dateStr) => {\n if (!dateStr) return '';\n const date = new Date(dateStr);\n if (isNaN(date.getTime())) return dateStr;\n return date.toLocaleDateString('en-US', {\n weekday: 'long',\n year: 'numeric',\n month: 'long',\n day: 'numeric',\n hour: 'numeric',\n minute: '2-digit'\n });\n },\n formatTimeline = (timeStr) => {\n if (!timeStr) return '';\n const date = new Date(timeStr);\n if (!isNaN(date.getTime())) {\n return date.toLocaleTimeString('en-US', {\n hour: 'numeric',\n minute: '2-digit',\n hour12: true\n });\n }\n return timeStr;\n },\n onShowtimeSelect,\n } = $props();\n\n let selectedDate = $state(null);\n let shareSuccess = $state(false);\n\n function handleSelect(e) {\n selectedDate = e.date;\n onShowtimeSelect?.({ date: e.date, ...e });\n }\n\n async function handleShare() {\n const shareData = {\n title: event.name,\n text: `Check out ${event.name} at ${event.venue?.name || 'this venue'}!`,\n url: typeof window !== 'undefined' ? window.location.href : ''\n };\n\n try {\n if (typeof navigator !== 'undefined' && navigator.share && navigator.canShare && navigator.canShare(shareData)) {\n await navigator.share(shareData);\n } else if (typeof navigator !== 'undefined' && navigator.clipboard) {\n await navigator.clipboard.writeText(shareData.url);\n shareSuccess = true;\n setTimeout(() => {\n shareSuccess = false;\n }, 2000);\n }\n } catch (err) {\n if (err.name !== 'AbortError' && typeof navigator !== 'undefined' && navigator.clipboard) {\n try {\n await navigator.clipboard.writeText(shareData.url);\n shareSuccess = true;\n setTimeout(() => {\n shareSuccess = false;\n }, 2000);\n } catch {\n console.error('Share failed:', err);\n }\n }\n }\n }\n</script>\n\n<div class=\"h-fit rounded-lg sm:px-5 py-4 md:border md:border-gray-200 md:dark:border-gray-700 bg-white dark:bg-gray-800\">\n {#if showTitle}\n <div class=\"flex justify-between items-start gap-2 mb-4\">\n <h2 class=\"{typography.h2} flex-1 text-left\">\n {event.name || ''}\n </h2>\n <button\n class=\"shrink-0 p-2 rounded-lg transition-colors hover:bg-gray-100 dark:hover:bg-gray-700 relative\"\n aria-label=\"Share event\"\n onclick={handleShare}\n >\n {#if shareSuccess}\n <CheckOutline class=\"w-5 h-5 text-green-600 dark:text-green-500\" />\n {:else}\n <ShareOutline class=\"w-5 h-5 text-gray-500 dark:text-gray-400 hover:text-gray-700 dark:hover:text-gray-300 cursor-pointer\" />\n {/if}\n </button>\n </div>\n {/if}\n\n <div class=\"space-y-1\">\n <p class=\"{typography.label}\">{formatDateTime(event.startDateTime)}</p>\n {#if event.displayStartTime && event.doorsOpenTime}\n <p class=\"{typography.smMuted}\">Doors open {formatTimeline(event.doorsOpenTime)}</p>\n {/if}\n {#if event.displayEndTime && event.endDateTime}\n <p class=\"{typography.smMuted}\">Ends {formatTimeline(event.endDateTime)}</p>\n {/if}\n </div>\n\n {#if showtimes && showtimes.length > 1}\n <div class=\"mt-4 pt-4 border-t border-gray-200 dark:border-gray-700\">\n <p class=\"{typography.smMuted} mb-2\">More showtimes</p>\n <div class=\"flex flex-wrap gap-2\">\n {#each showtimes as showtime}\n <div class=\"w-24\">\n <ShowTimeCard\n day={showtime.day}\n date={showtime.date}\n time={showtime.time}\n isSelected={selectedDate === showtime.date}\n onselect={handleSelect}\n />\n </div>\n {/each}\n </div>\n </div>\n {/if}\n\n {#if event.venue}\n <div class=\"mt-4 pt-4 border-t border-gray-200 dark:border-gray-700\">\n <a\n href=\"https://www.google.com/maps/search/?api=1&query={encodeURIComponent(event.venue.googleLocationNameCache || event.venue.address || event.venue.name)}\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n class=\"group block\"\n >\n <p class=\"{typography.label} transition-colors group-hover:text-blue-700 dark:group-hover:text-blue-500\">\n {event.venue.name}\n </p>\n <p class=\"{typography.smMuted} transition-colors group-hover:text-blue-700 dark:group-hover:text-blue-500\">\n {event.venue.address || ''}\n </p>\n </a>\n\n {#if event.hasAgeRestriction || event.ageRequirement || event.minimumAge}\n <p class=\"{typography.smMuted} mt-2\">\n {#if event.ageRequirement != null}\n {event.ageRequirement <= 1 ? 'All ages' : `${event.ageRequirement}+`}\n {:else if event.minimumAge != null}\n {event.minimumAge <= 1 ? 'All ages' : `${event.minimumAge}+`}\n {:else if event.ageRestriction != null}\n {event.ageRestriction <= 1 ? 'All ages' : `${event.ageRestriction}+`}\n {/if}\n </p>\n {/if}\n </div>\n {/if}\n</div>\n","<script>\n import { CloseOutline, LogoInstagram } from '../../primitives/Icons';\n import { typography } from '../../tokens/typography';\n\n /**\n * Default labels for user-visible strings in AboutShow.\n * Consumers can override via the `labels` prop.\n */\n const defaultLabels = {\n followLabel: (name) => `Follow ${name}:`,\n showLess: 'Show less',\n showMore: 'Show more',\n closePopover: 'Close',\n };\n\n let {\n performers = [],\n ShowImage = '',\n description = '',\n showTitle = true,\n title = \"About the Show\",\n showReadMore = true,\n getImageUrl = (url) => url,\n /** @type {Partial<typeof defaultLabels>} Override any user-visible string */\n labels: userLabels = {},\n } = $props();\n\n let labels = $derived({ ...defaultLabels, ...userLabels });\n\n let activePerformer = $state(null);\n let characterLimit = 1500;\n let showFullDescription = $state(false);\n\n let validPerformers = $derived(performers.filter(performer => {\n const isConfirmed = performer.acceptedState === 2;\n const isNotHidden = !performer.shouldBeHidden;\n const profile = performer.RosterPerformer?.User?.performerProfile;\n const hasName = profile?.firstName || profile?.lastName || profile?.stageName;\n return isConfirmed && isNotHidden && hasName;\n }));\n\n function togglePerformer(id) {\n if (activePerformer === id) {\n activePerformer = null;\n } else {\n activePerformer = id;\n }\n }\n\n function closePerformer() {\n activePerformer = null;\n }\n\n function toggleDescription() {\n showFullDescription = !showFullDescription;\n }\n</script>\n\n<div class=\"flex flex-col gap-3\">\n {#if showTitle}\n <h2 class=\"{typography.h2} text-xl\">{title}</h2>\n {/if}\n\n {#if ShowImage && description}\n <div>\n <img src={ShowImage} alt=\"\" class=\"rounded-lg object-contain w-full bg-gray-50 dark:bg-gray-800\" />\n </div>\n {/if}\n\n {#if description}\n {#if showFullDescription || description.length <= characterLimit || !showReadMore}\n <p class={`${typography.sm} leading-relaxed whitespace-pre-line`}>{description}</p>\n {#if showReadMore && description.length > characterLimit}\n <button\n onclick={toggleDescription}\n class={`${typography.label} text-left hover:underline text-blue-700 dark:text-blue-500`}\n >\n {labels.showLess}\n </button>\n {/if}\n {:else}\n <p class={`${typography.sm} leading-relaxed whitespace-pre-line`}>\n {description.slice(0, characterLimit)}...\n </p>\n <button\n onclick={toggleDescription}\n class={`${typography.label} text-left hover:underline text-blue-700 dark:text-blue-500`}\n >\n {labels.showMore}\n </button>\n {/if}\n {/if}\n\n {#if validPerformers.length > 0}\n <div class=\"py-2\">\n {#if activePerformer !== null}\n <!-- svelte-ignore a11y_click_events_have_key_events -->\n <!-- svelte-ignore a11y_no_static_element_interactions -->\n <div class=\"fixed inset-0 z-40\" onclick={closePerformer}></div>\n {/if}\n\n <div class=\"flex flex-wrap justify-start gap-4\">\n {#each validPerformers as performer, index}\n {@const profile = performer.RosterPerformer?.User?.performerProfile}\n {@const displayName = profile?.useStageName && profile?.stageName\n ? profile.stageName\n : `${profile?.firstName || ''} ${profile?.lastName || ''}`.trim()}\n {@const firstName = profile?.firstName || displayName.split(' ')[0] || displayName}\n <div class=\"relative\">\n {#if activePerformer === performer.ID && !performer.shouldBeHidden}\n <!-- svelte-ignore a11y_click_events_have_key_events -->\n <!-- svelte-ignore a11y_no_static_element_interactions -->\n <div\n 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'}\"\n onclick={(e) => e.stopPropagation()}\n >\n <div\n 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\"\n ></div>\n\n <button\n 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\"\n onclick={closePerformer}\n aria-label={labels.closePopover}\n >\n <CloseOutline class=\"w-5 h-5\" />\n </button>\n\n <p class=\"{typography.sm} leading-relaxed pr-6\">\n {profile?.biography || ''}\n </p>\n\n {#if profile?.instagram || profile?.twitter}\n <div class=\"flex gap-2 items-center {typography.smMuted} mt-3 pt-3 border-t border-gray-200 dark:border-gray-600\">\n <span>{typeof labels.followLabel === 'function' ? labels.followLabel(firstName) : labels.followLabel}</span>\n {#if profile?.instagram}\n <a\n href={profile.instagram}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n class=\"text-blue-700 dark:text-blue-500 hover:opacity-70 transition-opacity\"\n aria-label=\"Instagram profile\"\n >\n <LogoInstagram size={20} />\n </a>\n {/if}\n {#if profile?.twitter}\n <a\n href={profile.twitter}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n class=\"text-blue-700 dark:text-blue-500 hover:opacity-70 transition-opacity\"\n aria-label=\"Twitter profile\"\n >\n <svg class=\"w-5 h-5\" fill=\"currentColor\" viewBox=\"0 0 24 24\">\n <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\"/>\n </svg>\n </a>\n {/if}\n </div>\n {/if}\n </div>\n {/if}\n\n <!-- svelte-ignore a11y_click_events_have_key_events -->\n <!-- svelte-ignore a11y_no_static_element_interactions -->\n <div\n 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'}\"\n onclick={() => togglePerformer(performer.ID)}\n >\n <img\n src={performer.shouldBeHidden ? '' : profile?.profileImage ? getImageUrl(profile.profileImage) : ''}\n alt={displayName || 'Performer'}\n class=\"size-16 rounded object-cover {!profile?.profileImage || performer.shouldBeHidden ? 'bg-gray-50 dark:bg-gray-700' : ''}\"\n />\n <p class=\"{typography.xs} text-center leading-tight line-clamp-2\">\n {#if !performer.shouldBeHidden}\n {displayName}\n {/if}\n </p>\n </div>\n </div>\n {/each}\n </div>\n </div>\n {/if}\n</div>\n","<script>\n import { ChevronUpOutline } from \"../../primitives/Icons\";\n import { typography } from '../../tokens/typography';\n\n let {\n faqs = [],\n title = \"FAQs\",\n showTitle = true,\n accordion = false,\n /** @type {string} Text shown when no FAQs are available */\n emptyMessage = 'No FAQs available.',\n } = $props();\n\n let openIndex = $state(null);\n\n let items = $derived(faqs.map((f) =>\n typeof f === 'string' ? { question: '', answer: f } : f\n ));\n\n function toggleAccordion(index) {\n openIndex = openIndex === index ? null : index;\n }\n</script>\n\n<div class=\"flex flex-col gap-3\">\n {#if showTitle}\n <h2 class={typography.h2}>{title}</h2>\n {/if}\n\n {#if items.length}\n {#if accordion}\n <div class=\"border border-gray-200 rounded-lg dark:border-gray-700\">\n {#each items as { question, answer }, index}\n <div>\n <h3>\n <button\n type=\"button\"\n class=\"flex items-center justify-between w-full p-5 font-medium text-left text-gray-500 border-b border-gray-200 hover:bg-gray-100 focus:ring-4 focus:ring-gray-200 dark:border-gray-700 dark:text-gray-400 dark:hover:bg-gray-800 dark:focus:ring-gray-800 gap-3\n {index === 0 ? 'rounded-t-lg' : ''}\n {index === items.length - 1 && openIndex !== index ? 'border-b-0 rounded-b-lg' : ''}\n {openIndex === index ? 'text-gray-900 bg-gray-100 dark:bg-gray-800 dark:text-white' : ''}\"\n onclick={() => toggleAccordion(index)}\n aria-expanded={openIndex === index}\n aria-controls=\"accordion-body-{index}\"\n >\n <span>{question || `Item ${index + 1}`}</span>\n <ChevronUpOutline class=\"w-3 h-3 shrink-0 transition-transform duration-200 {openIndex === index ? 'rotate-180' : ''}\" aria-hidden=\"true\" />\n </button>\n </h3>\n <div\n id=\"accordion-body-{index}\"\n class=\"{openIndex === index ? '' : 'hidden'}\"\n aria-labelledby=\"accordion-heading-{index}\"\n >\n <div class=\"p-5 border-b border-gray-200 dark:border-gray-700 {index === items.length - 1 ? 'border-b-0 rounded-b-lg' : ''}\">\n <p class=\"{typography.smMuted} leading-relaxed\">{answer}</p>\n </div>\n </div>\n </div>\n {/each}\n </div>\n {:else}\n <div class=\"space-y-4\">\n {#each items as { question, answer }}\n <div>\n {#if question}\n <p class=\"{typography.label} mb-1\">{question}</p>\n {/if}\n <p class=\"{typography.smMuted} leading-relaxed\">{answer}</p>\n </div>\n {/each}\n </div>\n {/if}\n {:else}\n <p class=\"{typography.smMuted}\">{emptyMessage}</p>\n {/if}\n</div>\n","/**\r\n * Browse Widgets — Defaults & Constants\r\n * Shared configuration values across all variants.\r\n */\r\n\r\nimport type { WidgetType } from './types';\r\n\r\n// === Widget Types ===\r\n\r\nexport const WIDGET_TYPES = [\r\n\t'calendar',\r\n\t'list',\r\n\t'gallery',\r\n\t'carousel',\r\n\t'featured'\r\n] as const satisfies readonly WidgetType[];\r\n\r\nexport const WIDGET_LABELS: Record<WidgetType, string> = {\r\n\tcalendar: 'Calendar',\r\n\tlist: 'List',\r\n\tgallery: 'Gallery',\r\n\tcarousel: 'Carousel',\r\n\tfeatured: 'Featured'\r\n};\r\n\r\n// === Skeleton Timing ===\r\n\r\n/** Delay before showing skeleton (ms) — prevents flash on fast loads */\r\nexport const SKELETON_DELAY_MS = 250;\r\n\r\n// === Scarcity Thresholds ===\r\n\r\n/** Browse context only shows vague badge at or below this percentage */\r\nexport const SCARCITY_LOW_PCT = 15;\r\n\r\n/** Never show scarcity badge below this absolute floor */\r\nexport const SCARCITY_ABSOLUTE_FLOOR = 5;\r\n\r\n/** Never show scarcity badge above this absolute cap (even if % is low) */\r\nexport const SCARCITY_ABSOLUTE_CAP = 30;\r\n\r\n// === Touch / Gesture ===\r\n\r\n/** Minimum touch target size (px) — Apple HIG */\r\nexport const MIN_TOUCH_TARGET = 56;\r\n\r\n/** Haptic durations (ms) */\r\nexport const HAPTIC_LIGHT = 10;\r\nexport const HAPTIC_MEDIUM = 20;\r\n\r\n// === Swipe Physics ===\r\n\r\nexport const SWIPE_THRESHOLD = 50; // px\r\nexport const SWIPE_VELOCITY_THRESHOLD = 0.3; // px/ms\r\nexport const MOMENTUM_FRICTION = 0.92;\r\n\r\n// === Calendar ===\r\n\r\nexport const DAYS_OF_WEEK = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'] as const;\r\n\r\n// === Animation Durations ===\r\n\r\nexport const DURATION_FAST = 150; // ms — UI controls\r\nexport const DURATION_DEFAULT = 300; // ms — general transitions\r\nexport const DURATION_SLOW = 500; // ms — page-level transitions\r\n\r\n// === Image ===\r\n\r\nexport const PLACEHOLDER_IMAGE =\r\n\t'https://images.unsplash.com/photo-1514525253161-7a46d19cd819?w=800&h=600&fit=crop';\r\n\r\n// === Status Badge Priority ===\r\n\r\nexport const STATUS_PRIORITY = [\r\n\t'cancelled',\r\n\t'past',\r\n\t'sold_out',\r\n\t'sales_ended',\r\n\t'coming_soon',\r\n\t'scarcity'\r\n] as const;\r\n","/**\n * Browse Widgets — Canonical Status Utilities\n *\n * Single source of truth for status computation, dimming, badge variants,\n * and event filtering. Merges the best of browse-status.js, ScarcityBadge,\n * and all variant-specific utils into one file.\n *\n * All variants should import from here instead of maintaining local copies.\n */\n\nimport type { BrowseEvent, BrowseStatus, BrowseStatusType } from './types';\nimport {\n\tSCARCITY_LOW_PCT,\n\tSCARCITY_ABSOLUTE_FLOOR,\n\tSCARCITY_ABSOLUTE_CAP,\n\tSTATUS_PRIORITY\n} from './defaults';\n\n// === Status Computation ===\n\n/**\n * Normalize an event status string for comparison.\n * Handles variations like \"sold_out\", \"soldout\", \"sold-out\", \"Sold Out\", etc.\n */\nfunction normalizeStatus(status: string): string {\n\treturn status.toLowerCase().replace(/[\\s_-]+/g, '');\n}\n\n/**\n * Sliding-scale scarcity threshold (from ScarcityBadge).\n * Adjusts base percentage for venue/pool size:\n * - Large venues (1000+): caps at 30 remaining regardless of %\n * - Small venues (10 seats): floors at 5 remaining regardless of %\n */\nfunction effectiveThreshold(basePct: number, total: number): number {\n\tif (total === 0) return 0;\n\tconst capPct = (SCARCITY_ABSOLUTE_CAP / total) * 100;\n\tconst floorPct = (SCARCITY_ABSOLUTE_FLOOR / total) * 100;\n\treturn Math.max(Math.min(basePct, capPct), floorPct);\n}\n\n/**\n * Check if an event qualifies for a scarcity badge in browse context.\n *\n * Conditions (all must be true):\n * - Event is on_sale\n * - Has ticket data (remaining + total)\n * - Not a free event (total > 0)\n * - Remaining > 0 (not sold out)\n * - Percentage remaining <= effective threshold (sliding scale)\n * - Remaining >= ABSOLUTE_FLOOR (5) — don't badge near-zero\n * - Remaining <= ABSOLUTE_CAP (30) — don't badge large counts even if % is low\n */\nfunction isScarcityEvent(event: BrowseEvent): boolean {\n\tconst normalized = normalizeStatus(event.status);\n\tif (normalized !== 'onsale') return false;\n\tif (event.ticketsRemaining == null || event.ticketsTotal == null) return false;\n\tif (event.ticketsTotal === 0) return false; // free event\n\tif (event.ticketsRemaining <= 0) return false;\n\n\tconst pct = (event.ticketsRemaining / event.ticketsTotal) * 100;\n\tconst threshold = effectiveThreshold(SCARCITY_LOW_PCT, event.ticketsTotal);\n\n\treturn (\n\t\tpct <= threshold &&\n\t\tevent.ticketsRemaining >= SCARCITY_ABSOLUTE_FLOOR &&\n\t\tevent.ticketsRemaining <= SCARCITY_ABSOLUTE_CAP\n\t);\n}\n\n/**\n * Derive the single highest-priority browse-level status for an event.\n *\n * Priority: cancelled > past > sold_out > sales_ended > coming_soon > scarcity\n *\n * Features merged from all sources:\n * - Status normalization (handles \"sold_out\", \"soldout\", \"sold-out\", etc.)\n * - Past event detection via endDateTime (from browse-status.js)\n * - Ticket-data sold-out detection: remaining=0 with known total (from browse-status.js)\n * - Scarcity with sliding-scale thresholds (from ScarcityBadge)\n * - Free event suppression for scarcity (from ScarcityBadge)\n * - ABSOLUTE_FLOOR/CAP enforcement (from minimal-clean)\n */\nexport function getBrowseStatus(event: BrowseEvent): BrowseStatus | null {\n\tconst normalized = normalizeStatus(event.status);\n\n\tfor (const status of STATUS_PRIORITY) {\n\t\tswitch (status) {\n\t\t\tcase 'cancelled':\n\t\t\t\tif (normalized === 'cancelled' || normalized === 'canceled') {\n\t\t\t\t\treturn { text: 'Cancelled', type: 'cancelled' };\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase 'past':\n\t\t\t\tif (event.startDateTime) {\n\t\t\t\t\tconst eventEnd = event.endDateTime || event.startDateTime;\n\t\t\t\t\tif (new Date(eventEnd) < new Date()) {\n\t\t\t\t\t\treturn { text: 'Past event', type: 'past' };\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase 'sold_out':\n\t\t\t\tif (normalized === 'soldout') {\n\t\t\t\t\treturn { text: 'Sold out', type: 'sold_out' };\n\t\t\t\t}\n\t\t\t\t// Detect sold-out from ticket data even when status says on_sale\n\t\t\t\tif (\n\t\t\t\t\tevent.ticketsRemaining != null &&\n\t\t\t\t\tevent.ticketsRemaining <= 0 &&\n\t\t\t\t\tevent.ticketsTotal != null &&\n\t\t\t\t\tevent.ticketsTotal > 0\n\t\t\t\t) {\n\t\t\t\t\treturn { text: 'Sold out', type: 'sold_out' };\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase 'sales_ended':\n\t\t\t\tif (normalized === 'salesended') {\n\t\t\t\t\treturn { text: 'Sales ended', type: 'sales_ended' };\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase 'coming_soon':\n\t\t\t\tif (normalized === 'comingsoon') {\n\t\t\t\t\treturn { text: 'Coming soon', type: 'coming_soon' };\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase 'scarcity':\n\t\t\t\tif (isScarcityEvent(event)) {\n\t\t\t\t\treturn { text: 'Few tickets left', type: 'scarcity' };\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\treturn null;\n}\n\n// === Availability & Dimming ===\n\n/**\n * Check if an event is unavailable (cannot be purchased).\n * Used for disabling click actions and general unavailability indicators.\n */\nexport function isEventUnavailable(browseStatus: BrowseStatus | null): boolean {\n\tif (!browseStatus) return false;\n\tconst t = browseStatus.type;\n\treturn t === 'cancelled' || t === 'past' || t === 'sold_out' || t === 'sales_ended';\n}\n\n/**\n * Check if an event should be visually dimmed (reduced opacity, grayscale).\n *\n * Only sold_out and cancelled are dimmed — NOT sales_ended.\n * Sales ended events may still have their status change back, so they stay\n * visually prominent. Past events are filtered out rather than dimmed.\n */\nexport function isEventDimmed(event: BrowseEvent): boolean {\n\tconst status = getBrowseStatus(event);\n\tif (!status) return false;\n\treturn status.type === 'sold_out' || status.type === 'cancelled';\n}\n\n/**\n * Check if a pre-computed browse status should trigger visual dimming.\n * Use this when you already have the BrowseStatus and don't want to recompute.\n */\nexport function isDimmedStatus(status: BrowseStatus | null): boolean {\n\tif (!status) return false;\n\treturn status.type === 'sold_out' || status.type === 'cancelled';\n}\n\n// === Group-Level Status ===\n\n/**\n * Compute one badge for a group of events (e.g., a series with multiple showtimes).\n * Returns the highest-priority status found across all events.\n *\n * From rounded-soft/utils.ts browseStatusForEvents().\n */\nexport function getGroupStatus(events: BrowseEvent[]): BrowseStatus | null {\n\tconst found = new Set<BrowseStatusType>();\n\n\tfor (const e of events) {\n\t\tconst status = getBrowseStatus(e);\n\t\tif (status) found.add(status.type);\n\t}\n\n\tfor (const t of STATUS_PRIORITY) {\n\t\tif (found.has(t)) {\n\t\t\treturn { type: t, text: statusText(t) };\n\t\t}\n\t}\n\n\treturn null;\n}\n\n/**\n * Map a BrowseStatusType to its display text.\n */\nexport function statusText(type: BrowseStatusType): string {\n\tswitch (type) {\n\t\tcase 'cancelled':\n\t\t\treturn 'Cancelled';\n\t\tcase 'past':\n\t\t\treturn 'Past event';\n\t\tcase 'sold_out':\n\t\t\treturn 'Sold out';\n\t\tcase 'sales_ended':\n\t\t\treturn 'Sales ended';\n\t\tcase 'coming_soon':\n\t\t\treturn 'Coming soon';\n\t\tcase 'scarcity':\n\t\t\treturn 'Few tickets left';\n\t}\n}\n\n// === Badge Variant ===\n\n/**\n * Badge variant union from @getmicdrop/svelte-components.\n */\ntype BadgeVariant =\n\t| 'error'\n\t| 'neutral'\n\t| 'info'\n\t| 'warning'\n\t| 'success'\n\t| 'danger'\n\t| 'red'\n\t| 'gray'\n\t| 'blue'\n\t| 'orange'\n\t| 'purple'\n\t| 'green'\n\t| 'yellow'\n\t| 'pink'\n\t| 'indigo'\n\t| 'cyan'\n\t| 'notification';\n\n/**\n * Map a browse status type to a Badge component variant.\n *\n * Canonical mapping (from minimal-clean, the cleanest semantic match):\n * - cancelled → 'error' (red, attention-grabbing)\n * - sold_out → 'neutral' (gray, no action possible)\n * - sales_ended → 'neutral' (gray, no action possible)\n * - coming_soon → 'info' (blue, informational)\n * - scarcity → 'warning' (orange/amber, urgency)\n * - past → 'neutral' (gray)\n */\nexport function badgeVariant(type: BrowseStatusType): BadgeVariant {\n\tswitch (type) {\n\t\tcase 'cancelled':\n\t\t\treturn 'error';\n\t\tcase 'past':\n\t\t\treturn 'neutral';\n\t\tcase 'sold_out':\n\t\t\treturn 'neutral';\n\t\tcase 'sales_ended':\n\t\t\treturn 'neutral';\n\t\tcase 'coming_soon':\n\t\t\treturn 'info';\n\t\tcase 'scarcity':\n\t\t\treturn 'warning';\n\t\tdefault:\n\t\t\treturn 'neutral';\n\t}\n}\n\n// === Filtering ===\n\n/**\n * Filter an event list to today and future dates, sorted chronologically.\n * From browse-status.js, now typed.\n */\nexport function filterTodayAndFuture(events: BrowseEvent[]): BrowseEvent[] {\n\tconst today = new Date();\n\ttoday.setHours(0, 0, 0, 0);\n\tconst todayStr = today.toISOString().split('T')[0];\n\n\treturn events\n\t\t.filter((event) => event.date >= todayStr)\n\t\t.sort((a, b) => a.date.localeCompare(b.date));\n}\n","<script>\n export let size = 16;\n\n export let title = undefined;\n\n $: labelled = $$props[\"aria-label\"] || $$props[\"aria-labelledby\"] || title;\n $: attributes = {\n \"aria-hidden\": labelled ? undefined : true,\n role: labelled ? \"img\" : undefined,\n focusable: Number($$props[\"tabindex\"]) === 0 ? true : undefined\n };\n</script>\n\n<svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 32 32\"\n fill=\"currentColor\"\n preserveAspectRatio=\"xMidYMid meet\"\n width={size}\n height={size}\n {...attributes}\n {...$$restProps}>\n {#if title}<title>{title}</title>{/if}\n <path d=\"M21.7788,8a11.4843,11.4843,0,0,0-3.0547.5342,14.5665,14.5665,0,0,1-1.8225.4126A6.0054,6.0054,0,0,0,11,4V6a3.9933,3.9933,0,0,1,3.8267,2.9c-.5181-.0879-1.0569-.2207-1.6172-.3648A12.89,12.89,0,0,0,10.0317,8C6.311,8,4,11.0652,4,16c0,7.51,4.0679,11.999,8.0005,12h.0015a7.1576,7.1576,0,0,0,2.49-.59A5.0128,5.0128,0,0,1,16,27a5.0266,5.0266,0,0,1,1.5112.41A7.15,7.15,0,0,0,20,28h0c3.9307-.001,8-4.49,8-12C28,12.3094,26.3706,8,21.7788,8ZM20,26h0a5.5038,5.5038,0,0,1-1.7905-.4639A6.4168,6.4168,0,0,0,16,25a6.4043,6.4043,0,0,0-2.2061.5361A5.5343,5.5343,0,0,1,12,26h.0015C9.0513,25.9988,6,22.2586,6,16c0-1.8037.3931-6,4.0317-6a11.2363,11.2363,0,0,1,2.6807.4726A12.9819,12.9819,0,0,0,15.7612,11h.4922a11.7955,11.7955,0,0,0,2.9956-.5361A9.8483,9.8483,0,0,1,21.7788,10C25.7964,10,26,14.9978,26,16,26,22.2586,22.9482,25.9988,20,26Z\"></path><path d=\"M18,7H17V6a2.0021,2.0021,0,0,1,2-2h1V5A2.0021,2.0021,0,0,1,18,7Z\"></path>\n</svg>","<script>\n export let size = 16;\n\n export let title = undefined;\n\n $: labelled = $$props[\"aria-label\"] || $$props[\"aria-labelledby\"] || title;\n $: attributes = {\n \"aria-hidden\": labelled ? undefined : true,\n role: labelled ? \"img\" : undefined,\n focusable: Number($$props[\"tabindex\"]) === 0 ? true : undefined\n };\n</script>\n\n<svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 32 32\"\n fill=\"currentColor\"\n preserveAspectRatio=\"xMidYMid meet\"\n width={size}\n height={size}\n {...attributes}\n {...$$restProps}>\n {#if title}<title>{title}</title>{/if}\n <path d=\"M14 26L15.41 24.59 7.83 17 28 17 28 15 7.83 15 15.41 7.41 14 6 4 16 14 26z\"></path>\n</svg>","<script>\n export let size = 16;\n\n export let title = undefined;\n\n $: labelled = $$props[\"aria-label\"] || $$props[\"aria-labelledby\"] || title;\n $: attributes = {\n \"aria-hidden\": labelled ? undefined : true,\n role: labelled ? \"img\" : undefined,\n focusable: Number($$props[\"tabindex\"]) === 0 ? true : undefined\n };\n</script>\n\n<svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 32 32\"\n fill=\"currentColor\"\n preserveAspectRatio=\"xMidYMid meet\"\n width={size}\n height={size}\n {...attributes}\n {...$$restProps}>\n {#if title}<title>{title}</title>{/if}\n <path d=\"M26,4h-4V2h-2v2h-8V2h-2v2H6C4.9,4,4,4.9,4,6v20c0,1.1,0.9,2,2,2h20c1.1,0,2-0.9,2-2V6C28,4.9,27.1,4,26,4z M26,26H6V12h20\tV26z M26,10H6V6h4v2h2V6h8v2h2V6h4V10z\"></path>\n</svg>","<script>\n export let size = 16;\n\n export let title = undefined;\n\n $: labelled = $$props[\"aria-label\"] || $$props[\"aria-labelledby\"] || title;\n $: attributes = {\n \"aria-hidden\": labelled ? undefined : true,\n role: labelled ? \"img\" : undefined,\n focusable: Number($$props[\"tabindex\"]) === 0 ? true : undefined\n };\n</script>\n\n<svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 32 32\"\n fill=\"currentColor\"\n preserveAspectRatio=\"xMidYMid meet\"\n width={size}\n height={size}\n {...attributes}\n {...$$restProps}>\n {#if title}<title>{title}</title>{/if}\n <path d=\"M13 24L4 15 5.414 13.586 13 21.171 26.586 7.586 28 9 13 24z\"></path>\n</svg>","<script>\n export let size = 16;\n\n export let title = undefined;\n\n $: labelled = $$props[\"aria-label\"] || $$props[\"aria-labelledby\"] || title;\n $: attributes = {\n \"aria-hidden\": labelled ? undefined : true,\n role: labelled ? \"img\" : undefined,\n focusable: Number($$props[\"tabindex\"]) === 0 ? true : undefined\n };\n</script>\n\n<svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 32 32\"\n fill=\"currentColor\"\n preserveAspectRatio=\"xMidYMid meet\"\n width={size}\n height={size}\n {...attributes}\n {...$$restProps}>\n {#if title}<title>{title}</title>{/if}\n <path d=\"M16 22L6 12 7.4 10.6 16 19.2 24.6 10.6 26 12z\"></path>\n</svg>","<script>\n export let size = 16;\n\n export let title = undefined;\n\n $: labelled = $$props[\"aria-label\"] || $$props[\"aria-labelledby\"] || title;\n $: attributes = {\n \"aria-hidden\": labelled ? undefined : true,\n role: labelled ? \"img\" : undefined,\n focusable: Number($$props[\"tabindex\"]) === 0 ? true : undefined\n };\n</script>\n\n<svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 32 32\"\n fill=\"currentColor\"\n preserveAspectRatio=\"xMidYMid meet\"\n width={size}\n height={size}\n {...attributes}\n {...$$restProps}>\n {#if title}<title>{title}</title>{/if}\n <path d=\"M10 16L20 6 21.4 7.4 12.8 16 21.4 24.6 20 26z\"></path>\n</svg>","<script>\n export let size = 16;\n\n export let title = undefined;\n\n $: labelled = $$props[\"aria-label\"] || $$props[\"aria-labelledby\"] || title;\n $: attributes = {\n \"aria-hidden\": labelled ? undefined : true,\n role: labelled ? \"img\" : undefined,\n focusable: Number($$props[\"tabindex\"]) === 0 ? true : undefined\n };\n</script>\n\n<svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 32 32\"\n fill=\"currentColor\"\n preserveAspectRatio=\"xMidYMid meet\"\n width={size}\n height={size}\n {...attributes}\n {...$$restProps}>\n {#if title}<title>{title}</title>{/if}\n <path d=\"M17.4141 16L24 9.4141 22.5859 8 16 14.5859 9.4143 8 8 9.4141 14.5859 16 8 22.5859 9.4143 24 16 17.4141 22.5859 24 24 22.5859 17.4141 16z\"></path>\n</svg>","<script>\n export let size = 16;\n\n export let title = undefined;\n\n $: labelled = $$props[\"aria-label\"] || $$props[\"aria-labelledby\"] || title;\n $: attributes = {\n \"aria-hidden\": labelled ? undefined : true,\n role: labelled ? \"img\" : undefined,\n focusable: Number($$props[\"tabindex\"]) === 0 ? true : undefined\n };\n</script>\n\n<svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 32 32\"\n fill=\"currentColor\"\n preserveAspectRatio=\"xMidYMid meet\"\n width={size}\n height={size}\n {...attributes}\n {...$$restProps}>\n {#if title}<title>{title}</title>{/if}\n <path d=\"M28,6H4A2,2,0,0,0,2,8V24a2,2,0,0,0,2,2H28a2,2,0,0,0,2-2V8A2,2,0,0,0,28,6ZM25.8,8,16,14.78,6.2,8ZM4,24V8.91l11.43,7.91a1,1,0,0,0,1.14,0L28,8.91V24Z\"></path>\n</svg>","<script>\n export let size = 16;\n\n export let title = undefined;\n\n $: labelled = $$props[\"aria-label\"] || $$props[\"aria-labelledby\"] || title;\n $: attributes = {\n \"aria-hidden\": labelled ? undefined : true,\n role: labelled ? \"img\" : undefined,\n focusable: Number($$props[\"tabindex\"]) === 0 ? true : undefined\n };\n</script>\n\n<svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 32 32\"\n fill=\"currentColor\"\n preserveAspectRatio=\"xMidYMid meet\"\n width={size}\n height={size}\n {...attributes}\n {...$$restProps}>\n {#if title}<title>{title}</title>{/if}\n <path fill=\"none\" d=\"M14.9 7.2H17.1V24.799H14.9z\" data-icon-path=\"inner-path\" transform=\"rotate(-45 16 16)\"></path><path d=\"M16,2A13.914,13.914,0,0,0,2,16,13.914,13.914,0,0,0,16,30,13.914,13.914,0,0,0,30,16,13.914,13.914,0,0,0,16,2Zm5.4449,21L9,10.5557,10.5557,9,23,21.4448Z\"></path>\n</svg>","<script>\n export let size = 16;\n\n export let title = undefined;\n\n $: labelled = $$props[\"aria-label\"] || $$props[\"aria-labelledby\"] || title;\n $: attributes = {\n \"aria-hidden\": labelled ? undefined : true,\n role: labelled ? \"img\" : undefined,\n focusable: Number($$props[\"tabindex\"]) === 0 ? true : undefined\n };\n</script>\n\n<svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 32 32\"\n fill=\"currentColor\"\n preserveAspectRatio=\"xMidYMid meet\"\n width={size}\n height={size}\n {...attributes}\n {...$$restProps}>\n {#if title}<title>{title}</title>{/if}\n <path d=\"M24.832,16.9688c-.2724-.6465-.5815-1.38-.8833-2.2852-.79-2.3682,1.7344-4.9522,1.7583-4.9766L24.293,8.293c-.1407.1406-3.4234,3.4775-2.2417,7.0234.3261.978.6513,1.749.938,2.43A9.3812,9.3812,0,0,1,24,22a6.24,6.24,0,0,1-4.1892,5.293,8.52,8.52,0,0,0-2.1038-8l-1.0444-1.0445-.5815,1.3575C14.2449,23.89,12.06,25.76,10.7747,26.54A5.8437,5.8437,0,0,1,8,22a9.6239,9.6239,0,0,1,.9287-3.6289A11.3329,11.3329,0,0,0,10,14V12.2217c.8735.36,2,1.3037,2,3.7783v2.6035l1.7432-1.9341c3.1118-3.4546,2.4624-7.5678,1.206-10.3081A4.4859,4.4859,0,0,1,18,11h2c0-5.5371-4.5786-7-7-7H11l1.1992,1.5986c.1377.1856,2.8628,3.9278,1.3535,7.688A4.9426,4.9426,0,0,0,9,10H8v4a9.6239,9.6239,0,0,1-.9287,3.6289A11.3329,11.3329,0,0,0,6,22c0,3.8477,3.8232,8,10,8s10-4.1523,10-8A11.3771,11.3771,0,0,0,24.832,16.9688ZM12.8352,27.5264a16.4987,16.4987,0,0,0,4.3665-5.5987,6.1053,6.1053,0,0,1,.2573,5.9717A11.3213,11.3213,0,0,1,16,28,10.3278,10.3278,0,0,1,12.8352,27.5264Z\"></path>\n</svg>","<script>\n export let size = 16;\n\n export let title = undefined;\n\n $: labelled = $$props[\"aria-label\"] || $$props[\"aria-labelledby\"] || title;\n $: attributes = {\n \"aria-hidden\": labelled ? undefined : true,\n role: labelled ? \"img\" : undefined,\n focusable: Number($$props[\"tabindex\"]) === 0 ? true : undefined\n };\n</script>\n\n<svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 32 32\"\n fill=\"currentColor\"\n preserveAspectRatio=\"xMidYMid meet\"\n width={size}\n height={size}\n {...attributes}\n {...$$restProps}>\n {#if title}<title>{title}</title>{/if}\n <path d=\"M26,10H23.2383A4.4867,4.4867,0,0,0,16,4.7065,4.4873,4.4873,0,0,0,8.7617,10H6a2.0025,2.0025,0,0,0-2,2v4a2.0025,2.0025,0,0,0,2,2V28a2.0025,2.0025,0,0,0,2,2H24a2.0025,2.0025,0,0,0,2-2V18a2.0025,2.0025,0,0,0,2-2V12A2.0025,2.0025,0,0,0,26,10ZM17,7.5A2.5,2.5,0,1,1,19.5,10H17ZM12.5,5A2.503,2.503,0,0,1,15,7.5V10H12.5a2.5,2.5,0,0,1,0-5ZM6,12h9v4H6Zm2,6h7V28H8ZM24.0012,28H17V18h7ZM17,16V12h9l.0012,4Z\"></path>\n</svg>","<script>\n export let size = 16;\n\n export let title = undefined;\n\n $: labelled = $$props[\"aria-label\"] || $$props[\"aria-labelledby\"] || title;\n $: attributes = {\n \"aria-hidden\": labelled ? undefined : true,\n role: labelled ? \"img\" : undefined,\n focusable: Number($$props[\"tabindex\"]) === 0 ? true : undefined\n };\n</script>\n\n<svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 32 32\"\n fill=\"currentColor\"\n preserveAspectRatio=\"xMidYMid meet\"\n width={size}\n height={size}\n {...attributes}\n {...$$restProps}>\n {#if title}<title>{title}</title>{/if}\n <path d=\"M16,2A14,14,0,1,0,30,16,14,14,0,0,0,16,2Zm0,26A12,12,0,1,1,28,16,12,12,0,0,1,16,28Z\"></path><circle cx=\"16\" cy=\"23.5\" r=\"1.5\"></circle><path d=\"M17,8H15.5A4.49,4.49,0,0,0,11,12.5V13h2v-.5A2.5,2.5,0,0,1,15.5,10H17a2.5,2.5,0,0,1,0,5H15v4.5h2V17a4.5,4.5,0,0,0,0-9Z\"></path>\n</svg>","<script>\n export let size = 16;\n\n export let title = undefined;\n\n $: labelled = $$props[\"aria-label\"] || $$props[\"aria-labelledby\"] || title;\n $: attributes = {\n \"aria-hidden\": labelled ? undefined : true,\n role: labelled ? \"img\" : undefined,\n focusable: Number($$props[\"tabindex\"]) === 0 ? true : undefined\n };\n</script>\n\n<svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 32 32\"\n fill=\"currentColor\"\n preserveAspectRatio=\"xMidYMid meet\"\n width={size}\n height={size}\n {...attributes}\n {...$$restProps}>\n {#if title}<title>{title}</title>{/if}\n <path d=\"M16,2A11.0134,11.0134,0,0,0,5,13a10.8885,10.8885,0,0,0,2.2163,6.6s.3.3945.3482.4517L16,30l8.439-9.9526c.0444-.0533.3447-.4478.3447-.4478l.0015-.0024A10.8846,10.8846,0,0,0,27,13,11.0134,11.0134,0,0,0,16,2Zm0,15a4,4,0,1,1,4-4A4.0045,4.0045,0,0,1,16,17Z\"></path><circle cx=\"16\" cy=\"13\" r=\"4\" fill=\"none\"></circle>\n</svg>","<script>\n export let size = 16;\n\n export let title = undefined;\n\n $: labelled = $$props[\"aria-label\"] || $$props[\"aria-labelledby\"] || title;\n $: attributes = {\n \"aria-hidden\": labelled ? undefined : true,\n role: labelled ? \"img\" : undefined,\n focusable: Number($$props[\"tabindex\"]) === 0 ? true : undefined\n };\n</script>\n\n<svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 32 32\"\n fill=\"currentColor\"\n preserveAspectRatio=\"xMidYMid meet\"\n width={size}\n height={size}\n {...attributes}\n {...$$restProps}>\n {#if title}<title>{title}</title>{/if}\n <path d=\"M24,14H22V8A6,6,0,0,0,10,8v6H8a2,2,0,0,0-2,2V28a2,2,0,0,0,2,2H24a2,2,0,0,0,2-2V16A2,2,0,0,0,24,14ZM12,8a4,4,0,0,1,8,0v6H12ZM24,28H8V16H24Z\"></path>\n</svg>","<script>\n export let size = 16;\n\n export let title = undefined;\n\n $: labelled = $$props[\"aria-label\"] || $$props[\"aria-labelledby\"] || title;\n $: attributes = {\n \"aria-hidden\": labelled ? undefined : true,\n role: labelled ? \"img\" : undefined,\n focusable: Number($$props[\"tabindex\"]) === 0 ? true : undefined\n };\n</script>\n\n<svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 32 32\"\n fill=\"currentColor\"\n preserveAspectRatio=\"xMidYMid meet\"\n width={size}\n height={size}\n {...attributes}\n {...$$restProps}>\n {#if title}<title>{title}</title>{/if}\n <path d=\"M29,27.5859l-7.5521-7.5521a11.0177,11.0177,0,1,0-1.4141,1.4141L27.5859,29ZM4,13a9,9,0,1,1,9,9A9.01,9.01,0,0,1,4,13Z\"></path>\n</svg>","<script>\n export let size = 16;\n\n export let title = undefined;\n\n $: labelled = $$props[\"aria-label\"] || $$props[\"aria-labelledby\"] || title;\n $: attributes = {\n \"aria-hidden\": labelled ? undefined : true,\n role: labelled ? \"img\" : undefined,\n focusable: Number($$props[\"tabindex\"]) === 0 ? true : undefined\n };\n</script>\n\n<svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 32 32\"\n fill=\"currentColor\"\n preserveAspectRatio=\"xMidYMid meet\"\n width={size}\n height={size}\n {...attributes}\n {...$$restProps}>\n {#if title}<title>{title}</title>{/if}\n <path d=\"M23,20a5,5,0,0,0-3.89,1.89L11.8,17.32a4.46,4.46,0,0,0,0-2.64l7.31-4.57A5,5,0,1,0,18,7a4.79,4.79,0,0,0,.2,1.32l-7.31,4.57a5,5,0,1,0,0,6.22l7.31,4.57A4.79,4.79,0,0,0,18,25a5,5,0,1,0,5-5ZM23,4a3,3,0,1,1-3,3A3,3,0,0,1,23,4ZM7,19a3,3,0,1,1,3-3A3,3,0,0,1,7,19Zm16,9a3,3,0,1,1,3-3A3,3,0,0,1,23,28Z\"></path>\n</svg>","<script>\n export let size = 16;\n\n export let title = undefined;\n\n $: labelled = $$props[\"aria-label\"] || $$props[\"aria-labelledby\"] || title;\n $: attributes = {\n \"aria-hidden\": labelled ? undefined : true,\n role: labelled ? \"img\" : undefined,\n focusable: Number($$props[\"tabindex\"]) === 0 ? true : undefined\n };\n</script>\n\n<svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 32 32\"\n fill=\"currentColor\"\n preserveAspectRatio=\"xMidYMid meet\"\n width={size}\n height={size}\n {...attributes}\n {...$$restProps}>\n {#if title}<title>{title}</title>{/if}\n <path d=\"M29,14a1,1,0,0,0,1-1V8a2,2,0,0,0-2-2H4A2,2,0,0,0,2,8v5a1,1,0,0,0,1,1,2,2,0,0,1,0,4,1,1,0,0,0-1,1v5a2,2,0,0,0,2,2H28a2,2,0,0,0,2-2V19a1,1,0,0,0-1-1,2,2,0,0,1,0-4Zm-1,5.87V24H21V21H19v3H4V19.87a4,4,0,0,0,0-7.74V8H19v3h2V8h7v4.13a4,4,0,0,0,0,7.74Z\"></path><path d=\"M19 13H21V19H19z\"></path>\n</svg>","<script>\n export let size = 16;\n\n export let title = undefined;\n\n $: labelled = $$props[\"aria-label\"] || $$props[\"aria-labelledby\"] || title;\n $: attributes = {\n \"aria-hidden\": labelled ? undefined : true,\n role: labelled ? \"img\" : undefined,\n focusable: Number($$props[\"tabindex\"]) === 0 ? true : undefined\n };\n</script>\n\n<svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 32 32\"\n fill=\"currentColor\"\n preserveAspectRatio=\"xMidYMid meet\"\n width={size}\n height={size}\n {...attributes}\n {...$$restProps}>\n {#if title}<title>{title}</title>{/if}\n <path d=\"M16,30A14,14,0,1,1,30,16,14,14,0,0,1,16,30ZM16,4A12,12,0,1,0,28,16,12,12,0,0,0,16,4Z\"></path><path d=\"M20.59 22L15 16.41 15 7 17 7 17 15.58 22 20.59 20.59 22z\"></path>\n</svg>","<script>\n export let size = 16;\n\n export let title = undefined;\n\n $: labelled = $$props[\"aria-label\"] || $$props[\"aria-labelledby\"] || title;\n $: attributes = {\n \"aria-hidden\": labelled ? undefined : true,\n role: labelled ? \"img\" : undefined,\n focusable: Number($$props[\"tabindex\"]) === 0 ? true : undefined\n };\n</script>\n\n<svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 32 32\"\n fill=\"currentColor\"\n preserveAspectRatio=\"xMidYMid meet\"\n width={size}\n height={size}\n {...attributes}\n {...$$restProps}>\n {#if title}<title>{title}</title>{/if}\n <path d=\"M16,2A14,14,0,1,0,30,16,14,14,0,0,0,16,2Zm0,26A12,12,0,1,1,28,16,12,12,0,0,1,16,28Z\"></path><path d=\"M15 8H17V19H15zM16 22a1.5 1.5 0 101.5 1.5A1.5 1.5 0 0016 22z\"></path>\n</svg>","<script>\n export let size = 16;\n\n export let title = undefined;\n\n $: labelled = $$props[\"aria-label\"] || $$props[\"aria-labelledby\"] || title;\n $: attributes = {\n \"aria-hidden\": labelled ? undefined : true,\n role: labelled ? \"img\" : undefined,\n focusable: Number($$props[\"tabindex\"]) === 0 ? true : undefined\n };\n</script>\n\n<svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 32 32\"\n fill=\"currentColor\"\n preserveAspectRatio=\"xMidYMid meet\"\n width={size}\n height={size}\n {...attributes}\n {...$$restProps}>\n {#if title}<title>{title}</title>{/if}\n <path fill=\"none\" d=\"M16,26a1.5,1.5,0,1,1,1.5-1.5A1.5,1.5,0,0,1,16,26Zm-1.125-5h2.25V12h-2.25Z\" data-icon-path=\"inner-path\"></path><path d=\"M16.002,6.1714h-.004L4.6487,27.9966,4.6506,28H27.3494l.0019-.0034ZM14.875,12h2.25v9h-2.25ZM16,26a1.5,1.5,0,1,1,1.5-1.5A1.5,1.5,0,0,1,16,26Z\"></path><path d=\"M29,30H3a1,1,0,0,1-.8872-1.4614l13-25a1,1,0,0,1,1.7744,0l13,25A1,1,0,0,1,29,30ZM4.6507,28H27.3493l.002-.0033L16.002,6.1714h-.004L4.6487,27.9967Z\"></path>\n</svg>","<script>\n export let size = 16;\n\n export let title = undefined;\n\n $: labelled = $$props[\"aria-label\"] || $$props[\"aria-labelledby\"] || title;\n $: attributes = {\n \"aria-hidden\": labelled ? undefined : true,\n role: labelled ? \"img\" : undefined,\n focusable: Number($$props[\"tabindex\"]) === 0 ? true : undefined\n };\n</script>\n\n<svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 32 32\"\n fill=\"currentColor\"\n preserveAspectRatio=\"xMidYMid meet\"\n width={size}\n height={size}\n {...attributes}\n {...$$restProps}>\n {#if title}<title>{title}</title>{/if}\n <path d=\"M16,2C8.3,2,2,8.3,2,16s6.3,14,14,14s14-6.3,14-14C30,8.3,23.7,2,16,2z M14.9,8h2.2v11h-2.2V8z M16,25\tc-0.8,0-1.5-0.7-1.5-1.5S15.2,22,16,22c0.8,0,1.5,0.7,1.5,1.5S16.8,25,16,25z\"></path><path fill=\"none\" d=\"M17.5,23.5c0,0.8-0.7,1.5-1.5,1.5c-0.8,0-1.5-0.7-1.5-1.5S15.2,22,16,22\tC16.8,22,17.5,22.7,17.5,23.5z M17.1,8h-2.2v11h2.2V8z\" data-icon-path=\"inner-path\" opacity=\"0\"></path>\n</svg>","<script>\n export let size = 16;\n\n export let title = undefined;\n\n $: labelled = $$props[\"aria-label\"] || $$props[\"aria-labelledby\"] || title;\n $: attributes = {\n \"aria-hidden\": labelled ? undefined : true,\n role: labelled ? \"img\" : undefined,\n focusable: Number($$props[\"tabindex\"]) === 0 ? true : undefined\n };\n</script>\n\n<svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 32 32\"\n fill=\"currentColor\"\n preserveAspectRatio=\"xMidYMid meet\"\n width={size}\n height={size}\n {...attributes}\n {...$$restProps}>\n {#if title}<title>{title}</title>{/if}\n <circle cx=\"16\" cy=\"25\" r=\"2\"></circle><path d=\"M30 3.4141L28.5859 2 2 28.5859 3.4141 30 14.0962 19.3179a5.9359 5.9359 0 016.01 1.3193L21.52 19.2236a7.9669 7.9669 0 00-5.125-2.2041l3.3875-3.3877a11.9908 11.9908 0 014.5647 2.7647L25.76 14.9829A13.975 13.975 0 0021.334 12.08L24.3308 9.083a17.9364 17.9364 0 014.2546 3.0747L30 10.7432v-.002a20.02 20.02 0 00-4.1895-3.1377zM14.68 13.0776l2.0415-2.0415C16.481 11.0234 16.2437 11 16 11a13.9447 13.9447 0 00-9.771 3.9927l1.4136 1.4136A11.97 11.97 0 0114.68 13.0776zM16 7a17.87 17.87 0 014.2324.5254L21.875 5.8828A19.9537 19.9537 0 002 10.7412v.0225L3.4043 12.168A17.9193 17.9193 0 0116 7z\"></path>\n</svg>","<script>\n import { Fire } from 'carbon-icons-svelte';\n\n /**\n * ScarcityBadge - Shows urgency indicators based on ticket availability\n *\n * Thresholds (sliding scale — adjusts for pool size):\n * - 0 remaining: \"Sold out\" (red, no flame)\n * - ≤10% remaining: \"Only X left\" with exact count (orange with flame)\n * - ≤15% remaining: \"Few tickets left\" (orange with flame)\n * - >15% remaining: No badge\n *\n * Sliding scale caps at 30 remaining (large venues) and floors at 5 (small venues).\n *\n * Context determines behavior:\n * - \"browse\": Calendar/List/Gallery - only vague badges (\"Few tickets left\")\n * - \"event\": Event page - exact count at urgent, vague at low\n * - \"ticket\": Per-ticket type on ticket selection page - exact count at urgent\n *\n * @prop {number} remaining - Tickets remaining\n * @prop {number} total - Total ticket capacity\n * @prop {\"browse\"|\"event\"|\"ticket\"} context - Where the badge appears\n * @prop {string} variant - Visual variant: \"default\" (filled bg) or \"minimal\" (subtle)\n * @prop {boolean} isFree - Suppress scarcity badges for free events/tickets\n */\n let { remaining, total, context = 'browse', variant = 'default', isFree = false } = $props();\n\n const MAX_EXACT_COUNT = 20;\n const URGENT_PCT = 10; // ≤10% → urgent\n const LOW_PCT = 15; // ≤15% → low (was 25%)\n const ABSOLUTE_CAP = 30; // Sliding scale: never trigger above 30 remaining\n const ABSOLUTE_FLOOR = 5; // Sliding scale: always trigger at 5 or fewer\n\n // Sliding scale: adjusts thresholds for venue/pool size\n function effectiveThreshold(basePct, total) {\n if (total === 0) return 0;\n const capPct = (ABSOLUTE_CAP / total) * 100;\n const floorPct = (ABSOLUTE_FLOOR / total) * 100;\n return Math.max(Math.min(basePct, capPct), floorPct);\n }\n\n let percent = $derived(total > 0 ? (remaining / total) * 100 : 100);\n let urgentThreshold = $derived(effectiveThreshold(URGENT_PCT, total));\n let lowThreshold = $derived(effectiveThreshold(LOW_PCT, total));\n\n let badgeInfo = $derived.by(() => {\n // Sold out — shown everywhere (includes negative remaining as defensive check)\n if (remaining <= 0) {\n return { type: 'sold-out', text: 'Sold out', showFlame: false };\n }\n\n // No scarcity badges on free events/tickets — nothing to lose = no urgency\n if (isFree) return null;\n\n // Browse context (Calendar/List/Gallery): only vague badges\n if (context === 'browse') {\n if (percent <= lowThreshold) {\n return { type: 'scarcity', text: 'Few tickets left', showFlame: true };\n }\n return null;\n }\n\n // Event page / Ticket page: exact + vague\n if (percent <= urgentThreshold && remaining <= MAX_EXACT_COUNT) {\n return { type: 'scarcity', text: `Only ${remaining} left`, showFlame: true };\n }\n if (percent <= lowThreshold) {\n return { type: 'scarcity', text: 'Few tickets left', showFlame: true };\n }\n\n return null;\n });\n</script>\n\n{#if badgeInfo}\n <span\n class=\"badge-lg {badgeInfo.type === 'sold-out' ? 'badge-sold-out' : ''} {badgeInfo.type === 'scarcity' ? 'badge-scarcity' : ''} {variant === 'minimal' ? 'badge-minimal' : ''}\"\n role=\"status\"\n aria-live=\"polite\"\n aria-label=\"{badgeInfo.type === 'sold-out' ? 'Sold out' : `Low availability: ${badgeInfo.text}`}\"\n >\n {#if badgeInfo.showFlame}\n <Fire size={14} class=\"{variant === 'minimal' ? 'text-orange-600 dark:text-orange-400' : 'text-white'}\" aria-hidden=\"true\" />\n {/if}\n <span class=\"leading-none\">{badgeInfo.text}</span>\n </span>\n{/if}\n\n<style>\n /* Minimal variant override — subtle tinted bg, colored text, no heavy shadow */\n .badge-minimal {\n background: transparent !important;\n padding: 0.125rem 0 !important;\n box-shadow: none !important;\n text-transform: none !important;\n font-size: 0.75rem !important;\n letter-spacing: normal !important;\n }\n\n .badge-minimal.badge-scarcity {\n color: rgb(180 83 9) !important; /* amber-700 */\n }\n\n :global(.dark) .badge-minimal.badge-scarcity {\n color: rgb(251 191 36) !important; /* amber-400 */\n }\n\n .badge-minimal.badge-sold-out {\n color: rgb(185 28 28) !important; /* red-700 */\n }\n\n :global(.dark) .badge-minimal.badge-sold-out {\n color: rgb(252 165 165) !important; /* red-300 */\n }\n</style>\n","/**\n * Browse Widgets — Utilities\n * Production utilities for browse widget data processing.\n */\n\nimport type { BrowseEvent, GroupedEvent } from './types';\n\n/**\n * Group events by series + date. Same-day events with the same eventSeriesId\n * are bundled into a single GroupedEvent with multiple instances.\n * Non-series events appear as solo entries.\n *\n * Result is sorted chronologically by first instance.\n */\nexport function groupEventsBySeries(events: BrowseEvent[]): GroupedEvent[] {\n\tconst seriesDateMap = new Map<string, BrowseEvent[]>();\n\tconst result: GroupedEvent[] = [];\n\n\tfor (const event of events) {\n\t\tconst seriesId = event.eventSeriesId;\n\t\tif (seriesId && seriesId > 0) {\n\t\t\t// Key by seriesId + date so same series on different dates are separate groups\n\t\t\tconst key = `${seriesId}:${event.date}`;\n\t\t\tconst group = seriesDateMap.get(key) || [];\n\t\t\tgroup.push(event);\n\t\t\tseriesDateMap.set(key, group);\n\t\t} else {\n\t\t\tresult.push({ event, instances: [event], isSeries: false });\n\t\t}\n\t}\n\n\tfor (const instances of seriesDateMap.values()) {\n\t\tinstances.sort((a, b) => a.startDateTime.localeCompare(b.startDateTime));\n\t\tresult.push({\n\t\t\tevent: instances[0],\n\t\t\tinstances,\n\t\t\tisSeries: instances.length > 1\n\t\t});\n\t}\n\n\t// Sort all by first instance start time\n\tresult.sort((a, b) => a.instances[0].startDateTime.localeCompare(b.instances[0].startDateTime));\n\treturn result;\n}\n","<script lang=\"ts\">\r\n\t/**\r\n\t * Time Pills — List View\r\n\t * Evolved from GroupedListView.svelte. Groups by date with left date column.\r\n\t * Series with multiple showtimes on the same day are bundled into a single row\r\n\t * with clickable time pills. Single-showtime events render as normal rows.\r\n\t *\r\n\t * ALWAYS single-column. Desktop shows richer content: description, larger images.\r\n\t * Infinite scroll with IntersectionObserver.\r\n\t */\r\n\timport { onMount, onDestroy } from \"svelte\";\r\n\timport { PLACEHOLDER_IMAGE } from \"$lib/utils/constants.js\";\r\n\timport { getDateParts, formatFullDate, formatEventTime } from \"$lib/utils/datetime.js\";\r\n\timport { getBrowseStatus, isEventUnavailable, filterTodayAndFuture } from \"$lib/utils/browse-status.js\";\r\n\timport ScarcityBadge from \"../../../../components/ScarcityBadge.svelte\";\r\n\timport { groupEventsBySeries } from \"$lib/browse-widgets/utils\";\r\n\timport type { BrowseEvent } from \"$lib/browse-widgets/types\";\r\n\timport type { GroupedEvent } from \"$lib/browse-widgets/types\";\r\n\r\n\tinterface Props {\r\n\t\tevents?: any[];\r\n\t\tinitialCount?: number;\r\n\t\tloadMoreCount?: number;\r\n\t\tshowDateColumn?: boolean;\r\n\t\tfilterFutureOnly?: boolean;\r\n\t\toneventClick?: (event: any) => void;\r\n\t}\r\n\r\n\tlet {\r\n\t\tevents = [],\r\n\t\tinitialCount = 10,\r\n\t\tloadMoreCount = 10,\r\n\t\tshowDateColumn = true,\r\n\t\tfilterFutureOnly = true,\r\n\t\toneventClick\r\n\t}: Props = $props();\r\n\r\n\t// Normalize events to BrowseEvent field names (production uses `id`/`image`, browse uses `eventID`/`imageUrl`)\r\n\tlet normalizedEvents: BrowseEvent[] = $derived(\r\n\t\tevents.map((e: any) => ({\r\n\t\t\t...e,\r\n\t\t\teventID: e.eventID ?? e.id,\r\n\t\t\timageUrl: e.imageUrl ?? e.image\r\n\t\t}))\r\n\t);\r\n\r\n\tlet displayedCount = $state(initialCount);\r\n\tlet loadMoreTrigger = $state<HTMLDivElement | null>(null);\r\n\tlet observer: IntersectionObserver | undefined;\r\n\r\n\t// Filter to today and future (if enabled), group by series, then group by date\r\n\tlet filteredEvents = $derived(filterFutureOnly ? filterTodayAndFuture(normalizedEvents) : normalizedEvents);\r\n\tlet seriesGrouped: GroupedEvent[] = $derived(groupEventsBySeries(filteredEvents));\r\n\r\n\t// Group the series-grouped items by date\r\n\tlet groupedByDate = $derived(groupByDate(seriesGrouped));\r\n\tlet displayedGroups = $derived(sliceGroups(groupedByDate, displayedCount));\r\n\tlet totalItems = $derived(groupedByDate.reduce((sum, g) => sum + g.items.length, 0));\r\n\tlet hasMore = $derived(displayedCount < totalItems);\r\n\r\n\tinterface DateGroup {\r\n\t\tdate: string;\r\n\t\titems: GroupedEvent[];\r\n\t\tformattedDate: { month: string; day: string; weekday: string };\r\n\t}\r\n\r\n\tfunction groupByDate(items: GroupedEvent[]): DateGroup[] {\r\n\t\tconst groups: Record<string, GroupedEvent[]> = {};\r\n\r\n\t\tfor (const item of items) {\r\n\t\t\tconst dateKey = item.event.date;\r\n\t\t\tif (!groups[dateKey]) {\r\n\t\t\t\tgroups[dateKey] = [];\r\n\t\t\t}\r\n\t\t\tgroups[dateKey].push(item);\r\n\t\t}\r\n\r\n\t\treturn Object.entries(groups)\r\n\t\t\t.sort(([a], [b]) => a.localeCompare(b))\r\n\t\t\t.map(([date, items]) => ({\r\n\t\t\t\tdate,\r\n\t\t\t\titems,\r\n\t\t\t\tformattedDate: formatGroupDate(items[0].event)\r\n\t\t\t}));\r\n\t}\r\n\r\n\tfunction sliceGroups(groups: DateGroup[], count: number): DateGroup[] {\r\n\t\tlet remaining = count;\r\n\t\tconst result: DateGroup[] = [];\r\n\t\tfor (const group of groups) {\r\n\t\t\tif (remaining <= 0) break;\r\n\t\t\tconst visibleItems = group.items.slice(0, remaining);\r\n\t\t\tresult.push({ ...group, items: visibleItems });\r\n\t\t\tremaining -= visibleItems.length;\r\n\t\t}\r\n\t\treturn result;\r\n\t}\r\n\r\n\tfunction formatGroupDate(event: BrowseEvent) {\r\n\t\tif (!event?.startDateTime) return { month: \"\", day: \"\", weekday: \"\" };\r\n\t\tconst parts = getDateParts(event.startDateTime, event.timeZone);\r\n\t\treturn {\r\n\t\t\tmonth: parts.month.toUpperCase(),\r\n\t\t\tday: String(parts.date).padStart(2, \"0\"),\r\n\t\t\tweekday: parts.day.toUpperCase()\r\n\t\t};\r\n\t}\r\n\r\n\tfunction loadMore() {\r\n\t\tdisplayedCount += loadMoreCount;\r\n\t}\r\n\r\n\tonMount(() => {\r\n\t\tobserver = new IntersectionObserver(\r\n\t\t\t(entries) => {\r\n\t\t\t\tif (entries[0].isIntersecting && hasMore) {\r\n\t\t\t\t\tloadMore();\r\n\t\t\t\t}\r\n\t\t\t},\r\n\t\t\t{ rootMargin: \"100px\" }\r\n\t\t);\r\n\r\n\t\tif (loadMoreTrigger) {\r\n\t\t\tobserver.observe(loadMoreTrigger);\r\n\t\t}\r\n\t});\r\n\r\n\tonDestroy(() => {\r\n\t\tif (observer) {\r\n\t\t\tobserver.disconnect();\r\n\t\t}\r\n\t});\r\n\r\n\t$effect(() => {\r\n\t\tif (observer && loadMoreTrigger) {\r\n\t\t\tobserver.disconnect();\r\n\t\t\tobserver.observe(loadMoreTrigger);\r\n\t\t}\r\n\t});\r\n\r\n\tfunction handleEventClick(event: BrowseEvent) {\r\n\t\toneventClick?.(event);\r\n\t}\r\n\r\n\tfunction handleKeydown(e: KeyboardEvent, event: BrowseEvent) {\r\n\t\tif (e.key === \"Enter\" || e.key === \" \") {\r\n\t\t\te.preventDefault();\r\n\t\t\thandleEventClick(event);\r\n\t\t}\r\n\t}\r\n\r\n\tfunction handlePillClick(instance: BrowseEvent, e: MouseEvent) {\r\n\t\te.stopPropagation();\r\n\t\toneventClick?.(instance);\r\n\t}\r\n\r\n\tfunction handlePillKeydown(instance: BrowseEvent, e: KeyboardEvent) {\r\n\t\tif (e.key === \"Enter\" || e.key === \" \") {\r\n\t\t\te.preventDefault();\r\n\t\t\te.stopPropagation();\r\n\t\t\toneventClick?.(instance);\r\n\t\t}\r\n\t}\r\n</script>\r\n\r\n<section class=\"grouped-list\" class:no-date-column={!showDateColumn} aria-label=\"Event listings\">\r\n\t<h2 class=\"sr-only\">Event list grouped by date</h2>\r\n\t{#each displayedGroups as group (group.date)}\r\n\t\t<div\r\n\t\t\tclass=\"date-group\"\r\n\t\t\trole=\"group\"\r\n\t\t\taria-label=\"Events on {group.items[0]?.event.startDateTime ? formatFullDate(group.items[0].event.startDateTime, group.items[0].event.timeZone) : group.date}\"\r\n\t\t>\r\n\t\t\t<!-- Date Column -->\r\n\t\t\t{#if showDateColumn}\r\n\t\t\t\t<div class=\"date-column\" aria-hidden=\"true\">\r\n\t\t\t\t\t<span class=\"date-month\">{group.formattedDate.month}</span>\r\n\t\t\t\t\t<span class=\"date-day\">{group.formattedDate.day}</span>\r\n\t\t\t\t\t<span class=\"date-weekday\">{group.formattedDate.weekday}</span>\r\n\t\t\t\t</div>\r\n\t\t\t{/if}\r\n\r\n\t\t\t<!-- Events Column -->\r\n\t\t\t<ul class=\"events-column\">\r\n\t\t\t\t{#each group.items as grouped, itemIndex (grouped.event.eventID)}\r\n\t\t\t\t\t{@const eventStatus = getBrowseStatus(grouped.event)}\r\n\t\t\t\t\t{@const isUnavailable = isEventUnavailable(eventStatus)}\r\n\t\t\t\t\t<li class=\"event-list-item\">\r\n\t\t\t\t\t\t<div\r\n\t\t\t\t\t\t\tclass=\"event-row\"\r\n\t\t\t\t\t\t\tclass:event-row-first={itemIndex === 0}\r\n\t\t\t\t\t\t\tclass:event-row-last={itemIndex === group.items.length - 1}\r\n\t\t\t\t\t\t\tclass:row-unavailable={isUnavailable}\r\n\t\t\t\t\t\t\tonclick={() => handleEventClick(grouped.event)}\r\n\t\t\t\t\t\t\tonkeydown={(e) => handleKeydown(e, grouped.event)}\r\n\t\t\t\t\t\t\ttabindex=\"0\"\r\n\t\t\t\t\t\t\trole=\"button\"\r\n\t\t\t\t\t\t\taria-label=\"{grouped.event.name}, {grouped.isSeries ? `${grouped.instances.length} showtimes` : grouped.event.startDateTime ? formatEventTime(grouped.event.startDateTime, grouped.event.timeZone) : ''}, Press Enter to view details\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t<!-- Event Image -->\r\n\t\t\t\t\t\t\t<div class=\"event-image-container\" aria-hidden=\"true\">\r\n\t\t\t\t\t\t\t\t<img\r\n\t\t\t\t\t\t\t\t\tsrc={grouped.event.imageUrl || PLACEHOLDER_IMAGE}\r\n\t\t\t\t\t\t\t\t\talt=\"\"\r\n\t\t\t\t\t\t\t\t\tclass=\"event-image-blur\"\r\n\t\t\t\t\t\t\t\t\tloading=\"lazy\"\r\n\t\t\t\t\t\t\t\t/>\r\n\t\t\t\t\t\t\t\t<img\r\n\t\t\t\t\t\t\t\t\tsrc={grouped.event.imageUrl || PLACEHOLDER_IMAGE}\r\n\t\t\t\t\t\t\t\t\talt=\"\"\r\n\t\t\t\t\t\t\t\t\tclass=\"event-image\"\r\n\t\t\t\t\t\t\t\t\tloading=\"lazy\"\r\n\t\t\t\t\t\t\t\t/>\r\n\t\t\t\t\t\t\t</div>\r\n\r\n\t\t\t\t\t\t\t<!-- Event Details -->\r\n\t\t\t\t\t\t\t<div class=\"event-details\" aria-hidden=\"true\">\r\n\t\t\t\t\t\t\t\t<h3 class=\"event-title\">{grouped.event.name}</h3>\r\n\r\n\t\t\t\t\t\t\t\t{#if grouped.isSeries}\r\n\t\t\t\t\t\t\t\t\t<!-- Time pills for bundled series showtimes -->\r\n\t\t\t\t\t\t\t\t\t<div class=\"time-pills\">\r\n\t\t\t\t\t\t\t\t\t\t{#each grouped.instances as instance (instance.eventID)}\r\n\t\t\t\t\t\t\t\t\t\t\t<button\r\n\t\t\t\t\t\t\t\t\t\t\t\ttype=\"button\"\r\n\t\t\t\t\t\t\t\t\t\t\t\tclass=\"time-pill\"\r\n\t\t\t\t\t\t\t\t\t\t\t\tonclick={(e) => handlePillClick(instance, e)}\r\n\t\t\t\t\t\t\t\t\t\t\t\tonkeydown={(e) => handlePillKeydown(instance, e)}\r\n\t\t\t\t\t\t\t\t\t\t\t\taria-label=\"{grouped.event.name} at {formatEventTime(instance.startDateTime, instance.timeZone)}\"\r\n\t\t\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t\t\t{formatEventTime(instance.startDateTime, instance.timeZone)}\r\n\t\t\t\t\t\t\t\t\t\t\t</button>\r\n\t\t\t\t\t\t\t\t\t\t{/each}\r\n\t\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t\t\t\t{:else}\r\n\t\t\t\t\t\t\t\t\t\t\t<!-- Single showtime — same button style for consistency -->\r\n\t\t\t\t\t\t\t\t\t\t\t<div class=\"time-pills\">\r\n\t\t\t\t\t\t\t\t\t\t\t\t<button\r\n\t\t\t\t\t\t\t\t\t\t\t\t\ttype=\"button\"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tclass=\"time-pill\"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tonclick={(e) => handlePillClick(grouped.event, e)}\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tonkeydown={(e) => handlePillKeydown(grouped.event, e)}\r\n\t\t\t\t\t\t\t\t\t\t\t\t\taria-label=\"{grouped.event.name} at {formatEventTime(grouped.event.startDateTime, grouped.event.timeZone)}\"\r\n\t\t\t\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t{grouped.event.startDateTime ? formatEventTime(grouped.event.startDateTime, grouped.event.timeZone) : \"\"}\r\n\t\t\t\t\t\t\t\t\t\t\t\t</button>\r\n\t\t\t\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t\t\t\t{/if}\r\n\r\n\t\t\t\t\t\t\t\t{#if grouped.event.description}\r\n\t\t\t\t\t\t\t\t\t<p class=\"event-description\">{grouped.event.description}</p>\r\n\t\t\t\t\t\t\t\t{/if}\r\n\t\t\t\t\t\t\t</div>\r\n\r\n\t\t\t\t\t\t\t<!-- Status / Scarcity Badge -->\r\n\t\t\t\t\t\t\t<div class=\"event-badge-container\" aria-hidden=\"true\">\r\n\t\t\t\t\t\t\t\t{#if eventStatus}\r\n\t\t\t\t\t\t\t\t\t<span class=\"status-badge status-{eventStatus.type}\">{eventStatus.text}</span>\r\n\t\t\t\t\t\t\t\t{:else if grouped.event.ticketsTotal && (grouped.event.ticketsTotal > 0 || grouped.event.ticketsRemaining === 0)}\r\n\t\t\t\t\t\t\t\t\t<ScarcityBadge\r\n\t\t\t\t\t\t\t\t\t\tremaining={grouped.event.ticketsRemaining ?? 0}\r\n\t\t\t\t\t\t\t\t\t\ttotal={grouped.event.ticketsTotal ?? 0}\r\n\t\t\t\t\t\t\t\t\t\tcontext=\"browse\"\r\n\t\t\t\t\t\t\t\t\t/>\r\n\t\t\t\t\t\t\t\t{/if}\r\n\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t</div>\r\n\t\t\t\t\t</li>\r\n\t\t\t\t{/each}\r\n\t\t\t</ul>\r\n\t\t</div>\r\n\t{/each}\r\n\r\n\t<!-- Infinite scroll trigger -->\r\n\t{#if hasMore}\r\n\t\t<div bind:this={loadMoreTrigger} class=\"load-more-trigger\" role=\"status\" aria-live=\"polite\">\r\n\t\t\t<span class=\"loading-text\">Loading more events...</span>\r\n\t\t</div>\r\n\t{/if}\r\n</section>\r\n\r\n<style>\r\n\t@reference \"../../../../app.css\";\r\n\r\n\t.grouped-list {\r\n\t\t@apply flex flex-col gap-0;\r\n\t}\r\n\r\n\t.date-group {\r\n\t\t@apply flex border-b border-gray-200 dark:border-gray-700;\r\n\t}\r\n\r\n\t.date-group:last-child {\r\n\t\t@apply border-b-0;\r\n\t}\r\n\r\n\t/* When no date column */\r\n\t.no-date-column .date-group {\r\n\t\t@apply border-b-0;\r\n\t}\r\n\r\n\t.no-date-column .events-column {\r\n\t\t@apply border-l-0;\r\n\t}\r\n\r\n\t/* Date Column - Fixed width on left */\r\n\t.date-column {\r\n\t\t@apply w-16 min-w-16 py-4 px-2.5 flex flex-col items-center justify-start bg-gray-50 dark:bg-gray-900 border-r border-gray-200 dark:border-gray-700;\r\n\t}\r\n\r\n\t.date-month {\r\n\t\t@apply text-xs font-semibold text-gray-600 dark:text-gray-300 uppercase tracking-tight;\r\n\t}\r\n\r\n\t.date-day {\r\n\t\t@apply text-2xl font-bold text-gray-900 dark:text-white leading-tight;\r\n\t}\r\n\r\n\t.date-weekday {\r\n\t\t@apply text-xs font-semibold text-gray-600 dark:text-gray-300 uppercase tracking-tight;\r\n\t}\r\n\r\n\t/* Events Column - Flexible width */\r\n\tul.events-column {\r\n\t\t@apply flex-1 flex flex-col;\r\n\t}\r\n\r\n\t/* Individual Event Row */\r\n\t.event-row {\r\n\t\t@apply flex gap-4 p-5 cursor-pointer transition-colors duration-150 bg-white dark:bg-gray-800 border-b border-gray-200/50 dark:border-gray-700/50;\r\n\t}\r\n\r\n\t.event-row:last-child {\r\n\t\t@apply border-b-0;\r\n\t}\r\n\r\n\t.event-row:hover {\r\n\t\t@apply bg-gray-50 dark:bg-gray-700;\r\n\t}\r\n\r\n\t.event-row:focus {\r\n\t\t@apply outline-none;\r\n\t}\r\n\r\n\t.event-row:focus-visible {\r\n\t\t@apply outline-2 outline-blue-700 dark:outline-blue-500 outline-offset-2;\r\n\t}\r\n\r\n\t/* Reset list styles */\r\n\t.events-column {\r\n\t\t@apply list-none p-0 m-0;\r\n\t}\r\n\r\n\t.event-list-item {\r\n\t\t@apply list-none;\r\n\t}\r\n\r\n\t/* Event Image with blurred backdrop */\r\n\t.event-image-container {\r\n\t\t@apply relative w-36 h-24 min-w-36 rounded-lg overflow-hidden bg-gray-100 dark:bg-gray-800;\r\n\t}\r\n\r\n\t/* Blurred zoomed copy as backdrop */\r\n\t.event-image-blur {\r\n\t\t@apply absolute inset-0 w-full h-full;\r\n\t\tobject-fit: cover;\r\n\t\ttransform: scale(1.15);\r\n\t\tfilter: blur(16px) saturate(1.2);\r\n\t}\r\n\r\n\t/* Main image on top, contained */\r\n\t.event-image {\r\n\t\t@apply relative w-full h-full object-contain;\r\n\t}\r\n\r\n\t/* Event Details */\r\n\t.event-details {\r\n\t\t@apply flex-1 flex flex-col gap-1.5 min-w-0;\r\n\t}\r\n\r\n\t.event-title {\r\n\t\t@apply text-lg font-semibold text-gray-900 dark:text-white m-0 leading-snug;\r\n\t}\r\n\r\n\t.event-time {\r\n\t\t@apply text-sm font-medium text-gray-600 dark:text-gray-300;\r\n\t}\r\n\r\n\t.event-description {\r\n\t\t@apply text-sm text-gray-600 dark:text-gray-300 mt-1.5 mb-0 line-clamp-2;\r\n\t\tdisplay: -webkit-box;\r\n\t\t-webkit-box-orient: vertical;\r\n\t\toverflow: hidden;\r\n\t}\r\n\r\n\t/* Time buttons — gray, matching calendar */\r\n\t.time-pills {\r\n\t\t@apply flex flex-wrap gap-2;\r\n\t}\r\n\r\n\t.time-pill {\r\n\t\t@apply inline-flex items-center justify-center px-4 py-1.5 text-xs font-semibold rounded-lg;\r\n\t\t@apply text-gray-900 dark:text-white bg-gray-100 dark:bg-gray-700;\r\n\t\t@apply border border-gray-300 dark:border-gray-600;\r\n\t\t@apply cursor-pointer transition-all duration-150 ease-out select-none;\r\n\t}\r\n\r\n\t.time-pill:hover {\r\n\t\t@apply text-white;\r\n\t\tbackground-color: hsl(var(--Brand-Primary, 224 76% 48%));\r\n\t\tborder-color: hsl(var(--Brand-Primary, 224 76% 48%));\r\n\t}\r\n\r\n\t.time-pill:focus-visible {\r\n\t\t@apply outline-2 outline-blue-700 dark:outline-blue-500 outline-offset-2;\r\n\t}\r\n\r\n\t.time-pill:active {\r\n\t\ttransform: scale(0.97);\r\n\t\t@apply opacity-90;\r\n\t}\r\n\r\n\t/* Badge Container */\r\n\t.event-badge-container {\r\n\t\t@apply flex items-start pt-0.5;\r\n\t}\r\n\r\n\t/* Unavailable row dimming — badge stays full opacity */\r\n\t.row-unavailable .event-image-container,\r\n\t.row-unavailable .event-details {\r\n\t\t@apply opacity-60;\r\n\t}\r\n\r\n\t.row-unavailable .event-image {\r\n\t\tfilter: grayscale(0.5);\r\n\t}\r\n\r\n\t/* Status badges — matching GroupedListView treatments */\r\n\t.status-badge {\r\n\t\t@apply inline-flex items-center text-xs font-bold px-2.5 py-1 rounded whitespace-nowrap;\r\n\t\tletter-spacing: 0.02em;\r\n\t}\r\n\r\n\t.status-cancelled {\r\n\t\t@apply bg-red-100 text-red-800 dark:bg-red-900/40 dark:text-red-300;\r\n\t\ttext-decoration: line-through;\r\n\t\ttext-decoration-thickness: 1.5px;\r\n\t}\r\n\r\n\t.status-past {\r\n\t\t@apply bg-gray-100 text-gray-500 dark:bg-gray-800 dark:text-gray-400;\r\n\t}\r\n\r\n\t.status-sold_out {\r\n\t\t@apply bg-red-100 text-red-700 dark:bg-red-900/40 dark:text-red-400;\r\n\t}\r\n\r\n\t.status-sales_ended {\r\n\t\t@apply bg-gray-100 text-gray-500 dark:bg-gray-800 dark:text-gray-400;\r\n\t\tborder: 1px solid rgb(209 213 219);\r\n\t}\r\n\r\n\t:global(.dark) .status-sales_ended {\r\n\t\tborder-color: rgb(75 85 99);\r\n\t}\r\n\r\n\t.status-coming_soon {\r\n\t\t@apply bg-indigo-100 text-indigo-700 dark:bg-indigo-900/40 dark:text-indigo-300;\r\n\t}\r\n\r\n\t/* Mobile Responsiveness */\r\n\t@media (max-width: 640px) {\r\n\t\t.date-column {\r\n\t\t\t@apply w-12 min-w-12 py-2.5 px-1.5;\r\n\t\t}\r\n\r\n\t\t.date-month {\r\n\t\t\t@apply text-xs;\r\n\t\t}\r\n\r\n\t\t.date-day {\r\n\t\t\t@apply text-lg;\r\n\t\t}\r\n\r\n\t\t.date-weekday {\r\n\t\t\t@apply text-xs;\r\n\t\t}\r\n\r\n\t\t.event-row {\r\n\t\t\t@apply p-3 gap-2.5;\r\n\t\t}\r\n\r\n\t\t.event-image-container {\r\n\t\t\t@apply w-20 h-16 min-w-20;\r\n\t\t}\r\n\r\n\t\t.event-title {\r\n\t\t\t@apply text-sm;\r\n\t\t}\r\n\r\n\t\t.event-time {\r\n\t\t\t@apply text-xs;\r\n\t\t}\r\n\r\n\t\t.event-description {\r\n\t\t\t@apply hidden;\r\n\t\t}\r\n\r\n\t\t.time-pill {\r\n\t\t\t@apply px-3 py-1 text-xs;\r\n\t\t}\r\n\r\n\t\t.status-badge {\r\n\t\t\t@apply text-xs py-0.5 px-2;\r\n\t\t}\r\n\t}\r\n\r\n\t/* Desktop polish: larger images, more padding, generous spacing */\r\n\t@media (min-width: 1024px) {\r\n\t\t.event-row {\r\n\t\t\t@apply p-6 gap-5;\r\n\t\t}\r\n\r\n\t\t.event-image-container {\r\n\t\t\t@apply w-52 h-32 min-w-52 rounded-xl;\r\n\t\t}\r\n\r\n\t\t.event-title {\r\n\t\t\t@apply text-xl;\r\n\t\t}\r\n\r\n\t\t.event-description {\r\n\t\t\t@apply text-base mt-2;\r\n\t\t}\r\n\r\n\t\t.date-column {\r\n\t\t\t@apply w-20 min-w-20 py-5 px-3;\r\n\t\t}\r\n\r\n\t\t.date-day {\r\n\t\t\t@apply text-3xl;\r\n\t\t}\r\n\t}\r\n\r\n\t/* Reduced motion */\r\n\t@media (prefers-reduced-motion: reduce) {\r\n\t\t.event-row {\r\n\t\t\t@apply transition-none;\r\n\t\t}\r\n\t}\r\n\r\n\t/* Load more trigger */\r\n\t.load-more-trigger {\r\n\t\t@apply flex justify-center items-center p-6 text-gray-600 dark:text-gray-300;\r\n\t}\r\n\r\n\t.loading-text {\r\n\t\t@apply text-sm;\r\n\t}\r\n\r\n\t/* Screen reader only text */\r\n\t.sr-only {\r\n\t\tposition: absolute;\r\n\t\twidth: 1px;\r\n\t\theight: 1px;\r\n\t\tpadding: 0;\r\n\t\tmargin: -1px;\r\n\t\toverflow: hidden;\r\n\t\tclip: rect(0, 0, 0, 0);\r\n\t\twhite-space: nowrap;\r\n\t\tborder-width: 0;\r\n\t}\r\n</style>\r\n","<script>\n import { onMount, tick } from \"svelte\";\n import { getDaysInMonth } from \"$lib/utils/utils.js\";\n import { formatFullDate } from \"$lib/utils/datetime.js\";\n import { PLACEHOLDER_IMAGE } from \"$lib/utils/constants.js\";\n import { Button } from '@getmicdrop/svelte-components';\n import TimePillsListView from \"$lib/browse-widgets/variants/time-pills/TimePillsListView.svelte\";\n\n let currentDate = new Date();\n\n // Swipe gesture support for mobile (enhanced with shadows, reduced motion)\n let touchStartX = 0;\n let touchStartY = 0;\n let touchStartTime = 0;\n let lastTouchX = 0;\n let lastTouchTime = 0;\n let velocityX = 0;\n let isSwiping = false;\n let isAnimating = false;\n let swipeOffset = 0;\n let calendarElement;\n let calendarGridElement;\n let swipeDirection = 0; // -1 = left (prev), 1 = right (next), 0 = none\n let prefersReducedMotion = false;\n let momentumAnimationId = null; // For cancelling momentum animation\n\n // Check for reduced motion preference\n onMount(() => {\n if (typeof window !== 'undefined') {\n const mediaQuery = window.matchMedia('(prefers-reduced-motion: reduce)');\n prefersReducedMotion = mediaQuery.matches;\n mediaQuery.addEventListener('change', (e) => {\n prefersReducedMotion = e.matches;\n });\n }\n });\n\n // Thresholds for swipe detection\n const SWIPE_THRESHOLD = 0.15; // 15% of calendar width\n const VELOCITY_THRESHOLD = 0.3; // pixels per ms for quick flicks\n const DRAG_RESISTANCE = 0.8; // Slight resistance during drag\n const MOMENTUM_FRICTION = 0.92; // Deceleration factor for momentum\n const MOMENTUM_MIN_VELOCITY = 0.05; // Stop momentum when velocity drops below this\n\n let {\n isScheduledBtn = false,\n eventCalendar = false,\n embedCalendar = false,\n currentYear = currentDate.getFullYear(),\n currentMonth = currentDate.getMonth(),\n currentevents = [],\n showPartialPreview = true, // Show first week of next month as preview\n oneventClick,\n ondaySelect,\n onswipePrev,\n onswipeNext\n } = $props();\n\n let selectedEvent = $state([]);\n // Track the selected day along with its month/year so highlight only shows on correct month\n let selectedDayNum = $state(null);\n let selectedDayMonth = $state(null);\n let selectedDayYear = null;\n\n // Compute whether to show the day highlight (only when viewing the month of the selected day)\n let showDayHighlight = $derived((dayNum) => {\n return selectedDayNum === dayNum &&\n selectedDayMonth === currentMonth &&\n selectedDayYear === currentYear;\n });\n let focusedDayIndex = -1; // For keyboard navigation\n let dayElements = []; // Store references to day elements\n\n // Month names for accessibility\n const MONTH_NAMES = [\n \"January\", \"February\", \"March\", \"April\", \"May\", \"June\",\n \"July\", \"August\", \"September\", \"October\", \"November\", \"December\"\n ];\n\n const today = new Date();\n const todayLocal = new Date(\n today.getFullYear(),\n today.getMonth(),\n today.getDate()\n );\n\n\n let selectedDate = $derived(new Date(Date.UTC(currentYear, currentMonth, 1)));\n\n // Computed days in month - using $derived.by() instead of $effect + $state to avoid infinite loops\n // (writing to $state inside $effect causes re-trigger cycles)\n\n // Check if a day is today\n function isToday(day) {\n return (\n currentYear === todayLocal.getFullYear() &&\n currentMonth === todayLocal.getMonth() &&\n day === todayLocal.getDate()\n );\n }\n\n // Helper to extract start time from timeline string (e.g., \"8:00 PM - 10:00 PM\" -> \"8:00 PM\")\n function getStartTime(timeline) {\n if (!timeline) return '';\n const parts = timeline.split('-');\n let time = parts[0].trim();\n // Normalize to always show minutes (e.g., \"6 PM\" -> \"6:00 PM\")\n // Match pattern like \"6 PM\" or \"10 AM\" (number followed by space and AM/PM, no colon)\n const noMinutesMatch = time.match(/^(\\d{1,2})\\s*(AM|PM)$/i);\n if (noMinutesMatch) {\n time = `${noMinutesMatch[1]}:00 ${noMinutesMatch[2].toUpperCase()}`;\n }\n return time;\n }\n\n // Helper to parse time string to minutes for sorting (e.g., \"8:00 AM\" -> 480, \"10:30 AM\" -> 630)\n function parseTimeToMinutes(timeStr) {\n if (!timeStr) return 0;\n const match = timeStr.match(/(\\d{1,2}):(\\d{2})\\s*(AM|PM)/i);\n if (!match) return 0;\n let hours = parseInt(match[1], 10);\n const minutes = parseInt(match[2], 10);\n const period = match[3].toUpperCase();\n\n if (period === 'PM' && hours !== 12) hours += 12;\n if (period === 'AM' && hours === 12) hours = 0;\n\n return hours * 60 + minutes;\n }\n\n // Group events by eventSeriesId for recurring event consolidation\n // Only groups events that belong to the same series (eventSeriesId > 0)\n // Non-series events (eventSeriesId null/0) are never grouped\n function groupEventsBySeries(events) {\n const groups = new Map();\n const result = [];\n\n for (const event of events) {\n const seriesId = event.eventSeriesId;\n\n // Only group if event has a valid series ID (> 0)\n if (seriesId && seriesId > 0) {\n if (!groups.has(seriesId)) {\n groups.set(seriesId, {\n ...event,\n instances: [event]\n });\n } else {\n groups.get(seriesId).instances.push(event);\n }\n } else {\n // Non-series events: don't group, treat as single instance\n result.push({\n ...event,\n instances: [event]\n });\n }\n }\n\n // Sort instances within each series group by start time\n for (const group of groups.values()) {\n group.instances.sort((a, b) => {\n // Parse startDateTime for proper time comparison\n const dateA = a.startDateTime ? new Date(a.startDateTime) : null;\n const dateB = b.startDateTime ? new Date(b.startDateTime) : null;\n if (dateA && dateB) {\n return dateA.getTime() - dateB.getTime();\n }\n // Fallback to timeline parsing\n const timeA = parseTimeToMinutes(getStartTime(a.timeline));\n const timeB = parseTimeToMinutes(getStartTime(b.timeline));\n return timeA - timeB;\n });\n result.push(group);\n }\n\n // Sort all groups/events by their first instance's start time\n result.sort((a, b) => {\n const dateA = a.instances[0]?.startDateTime ? new Date(a.instances[0].startDateTime) : null;\n const dateB = b.instances[0]?.startDateTime ? new Date(b.instances[0].startDateTime) : null;\n if (dateA && dateB) {\n return dateA.getTime() - dateB.getTime();\n }\n return 0;\n });\n\n return result;\n }\n\n // Compute days in month as a derived value (not $effect + $state which causes infinite loops)\n let daysInMonth = $derived.by(() => {\n const days = getDaysInMonth(selectedDate);\n const startDay = new Date(\n Date.UTC(currentYear, currentMonth, 1)\n ).getUTCDay();\n\n const baseDays = Array.from({ length: days }, (_, i) => ({\n day: i + 1,\n startDay: startDay + i,\n events: [],\n groupedEvents: [],\n }));\n\n return baseDays.map((day) => {\n // Use local date for comparison (not UTC) to match todayLocal\n const dateOfDay = new Date(currentYear, currentMonth, day.day);\n const isPast = dateOfDay < todayLocal;\n const dayIsToday = isToday(day.day);\n\n const dayEvents = currentevents.filter((event) => {\n // Parse date string as local time (not UTC)\n // event.date is \"YYYY-MM-DD\" format\n const [year, month, dayNum] = event.date.split('-').map(Number);\n const eventDateLocal = new Date(year, month - 1, dayNum);\n\n // Show all events for this day (including past events - they'll be greyed out but visible)\n return (\n eventDateLocal.getFullYear() === currentYear &&\n eventDateLocal.getMonth() === currentMonth &&\n eventDateLocal.getDate() === day.day\n );\n });\n\n // Group events by series for recurring event consolidation\n const groupedEvents = groupEventsBySeries(dayEvents);\n\n return {\n ...day,\n isPast,\n isToday: dayIsToday,\n events: dayEvents,\n groupedEvents\n };\n });\n });\n\n // Compute partial preview of previous month (fill in days before the 1st)\n let prevMonthPreviewDays = $derived.by(() => {\n if (showPartialPreview && daysInMonth.length > 0) {\n // startDay is the day of week the current month starts on (0 = Sun, 6 = Sat)\n const startDay = new Date(Date.UTC(currentYear, currentMonth, 1)).getUTCDay();\n\n if (startDay > 0) {\n // Calculate previous month/year\n const prevMonth = currentMonth === 0 ? 11 : currentMonth - 1;\n const prevYear = currentMonth === 0 ? currentYear - 1 : currentYear;\n\n // Get number of days in previous month\n const daysInPrevMonth = new Date(prevYear, prevMonth + 1, 0).getDate();\n\n // Show the last `startDay` days of previous month\n return Array.from({ length: startDay }, (_, i) => ({\n day: daysInPrevMonth - startDay + i + 1,\n month: prevMonth,\n year: prevYear,\n monthName: MONTH_NAMES[prevMonth]\n }));\n } else {\n return [];\n }\n } else {\n return [];\n }\n });\n\n // Compute partial preview of next month (first week to complete the grid)\n let nextMonthPreviewDays = $derived.by(() => {\n if (showPartialPreview && daysInMonth.length > 0) {\n // Calculate what day of week the current month ends on\n const lastDayOfMonth = daysInMonth[daysInMonth.length - 1];\n const lastDayStartDay = lastDayOfMonth.startDay;\n const lastDayOfWeek = lastDayStartDay % 7; // 0 = Sun, 6 = Sat\n\n // If the month doesn't end on Saturday, show remaining days of that week\n if (lastDayOfWeek < 6) {\n const daysToShow = 6 - lastDayOfWeek; // Days needed to complete the week\n\n // Calculate next month/year\n const nextMonth = currentMonth === 11 ? 0 : currentMonth + 1;\n const nextYear = currentMonth === 11 ? currentYear + 1 : currentYear;\n\n return Array.from({ length: daysToShow }, (_, i) => ({\n day: i + 1,\n month: nextMonth,\n year: nextYear,\n monthName: MONTH_NAMES[nextMonth]\n }));\n } else {\n return [];\n }\n } else {\n return [];\n }\n });\n\n const dateFormatOptions = {\n weekday: \"short\",\n month: \"short\",\n day: \"numeric\",\n };\n\n function handleEventClick(event) {\n triggerHaptic('light');\n oneventClick?.(event);\n }\n\n let hoveredDay = $state(null);\n\n function handleHover(day) {\n hoveredDay = day;\n }\n\n function handleMouseLeave() {\n hoveredDay = null;\n }\n\n // Check if we're on mobile (for conditional day selection behavior)\n let isMobile = false;\n onMount(() => {\n if (typeof window !== 'undefined') {\n isMobile = window.innerWidth <= 640;\n window.addEventListener('resize', () => {\n isMobile = window.innerWidth <= 640;\n });\n }\n });\n\n function handleDayClick(day, isKeyboard = false) {\n // On desktop with mouse, don't select days - only event clicks work\n // On mobile or via keyboard, selecting a day shows events in the list below\n // Keyboard users need this to discover events without requiring a mouse\n if (day.events.length > 0 && (isMobile || isKeyboard)) {\n triggerHaptic('light');\n selectedEvent = day.events;\n selectedDayNum = day.day;\n selectedDayMonth = currentMonth;\n selectedDayYear = currentYear;\n }\n // Notify parent on mobile/keyboard (same condition as internal selection)\n if (day.events.length > 0 && (isMobile || isKeyboard) && ondaySelect) {\n ondaySelect({ day: day.day, month: currentMonth, year: currentYear, events: day.events });\n }\n }\n\n function handleDayKeydown(event, day, dayIndex) {\n const totalDays = daysInMonth.length;\n\n switch (event.key) {\n case \"Enter\":\n case \" \":\n event.preventDefault();\n handleDayClick(day, true); // isKeyboard = true for accessibility\n break;\n case \"ArrowRight\":\n event.preventDefault();\n focusNextDay(dayIndex, 1);\n break;\n case \"ArrowLeft\":\n event.preventDefault();\n focusNextDay(dayIndex, -1);\n break;\n case \"ArrowDown\":\n event.preventDefault();\n focusNextDay(dayIndex, 7);\n break;\n case \"ArrowUp\":\n event.preventDefault();\n focusNextDay(dayIndex, -7);\n break;\n case \"Home\":\n event.preventDefault();\n focusDay(0);\n break;\n case \"End\":\n event.preventDefault();\n focusDay(totalDays - 1);\n break;\n }\n }\n\n function focusNextDay(currentIndex, offset) {\n const totalDays = daysInMonth.length;\n let newIndex = currentIndex + offset;\n\n // Handle boundaries\n if (newIndex < 0) {\n onswipePrev?.();\n return;\n }\n if (newIndex >= totalDays) {\n onswipeNext?.();\n return;\n }\n\n focusDay(newIndex);\n }\n\n function focusDay(index) {\n focusedDayIndex = index;\n if (dayElements[index]) {\n dayElements[index].focus();\n }\n }\n\n // Generate accessible label for a day\n function getDayAriaLabel(day) {\n const isoStr = new Date(currentYear, currentMonth, day.day).toISOString();\n const dateStr = formatFullDate(isoStr, 'UTC');\n\n if (day.events.length === 0) {\n return day.isToday ? `${dateStr}, Today, No events` : `${dateStr}, No events`;\n }\n\n const eventCount = day.events.length;\n const eventText = eventCount === 1 ? '1 event' : `${eventCount} events`;\n const todayText = day.isToday ? ', Today' : '';\n\n return `${dateStr}${todayText}, ${eventText}. Press Enter to view.`;\n }\n\n function getStatusColor(status) {\n if (status === \"Sold out\") return \"status-sold-out\";\n if (status === \"Selling fast\") return \"status-selling-fast\";\n return \"status-on-sale\";\n }\n\n // Haptic feedback for mobile\n function triggerHaptic(style = 'light') {\n if (typeof window === 'undefined') return;\n\n // iOS WebKit\n if (window.webkit?.messageHandlers?.haptic) {\n window.webkit.messageHandlers.haptic.postMessage(style);\n return;\n }\n\n // Taptic Engine\n if (window.TapticEngine) {\n window.TapticEngine.impact({ style });\n return;\n }\n\n // Android fallback\n if (navigator.vibrate) {\n navigator.vibrate(style === 'light' ? 10 : 20);\n }\n }\n\n // Momentum animation - continues movement after touch release with deceleration\n function animateMomentum(initialVelocity) {\n if (prefersReducedMotion || !calendarGridElement) return;\n\n let currentVelocity = initialVelocity;\n const containerWidth = calendarGridElement.offsetWidth || 320;\n\n function tick() {\n // Apply friction\n currentVelocity *= MOMENTUM_FRICTION;\n\n // Update offset\n swipeOffset -= currentVelocity * 16; // ~16ms per frame\n\n // Apply transform\n calendarGridElement.style.transform = `translateX(${swipeOffset}px)`;\n calendarGridElement.style.transition = 'none';\n\n // Update shadow based on direction\n const shadowIntensity = Math.min(Math.abs(swipeOffset) / 80, 0.4);\n const blurRadius = 12 + shadowIntensity * 24;\n const spreadRadius = shadowIntensity * 4;\n\n if (swipeOffset < 0) {\n calendarGridElement.style.boxShadow = `-${spreadRadius}px 0 ${blurRadius}px rgba(0,0,0,${shadowIntensity})`;\n } else {\n calendarGridElement.style.boxShadow = `${spreadRadius}px 0 ${blurRadius}px rgba(0,0,0,${shadowIntensity})`;\n }\n\n // Check if we should trigger month change\n const swipePercent = Math.abs(swipeOffset) / containerWidth;\n if (swipePercent > SWIPE_THRESHOLD) {\n // Cancel momentum and trigger month change\n cancelAnimationFrame(momentumAnimationId);\n momentumAnimationId = null;\n\n const direction = swipeOffset > 0 ? -1 : 1; // -1 = prev, 1 = next\n completeMomentumSwipe(direction, containerWidth);\n return;\n }\n\n // Continue animation or stop\n if (Math.abs(currentVelocity) > MOMENTUM_MIN_VELOCITY) {\n momentumAnimationId = requestAnimationFrame(tick);\n } else {\n // Velocity too low, snap back\n momentumAnimationId = null;\n calendarGridElement.style.transition = 'transform 0.2s ease-out, box-shadow 0.2s ease-out';\n calendarGridElement.style.transform = 'translateX(0)';\n calendarGridElement.style.boxShadow = '';\n\n setTimeout(() => {\n if (calendarGridElement) {\n calendarGridElement.style.transition = '';\n }\n isAnimating = false;\n }, 200);\n }\n }\n\n isAnimating = true;\n momentumAnimationId = requestAnimationFrame(tick);\n }\n\n // Complete a momentum-triggered swipe with slide animation\n function completeMomentumSwipe(direction, containerWidth) {\n isAnimating = true;\n\n // Clone for slide-out animation\n const clone = calendarGridElement.cloneNode(true);\n clone.classList.add('calendar-clone');\n clone.style.position = 'absolute';\n clone.style.top = '0';\n clone.style.left = '0';\n clone.style.width = '100%';\n clone.style.transform = `translateX(${swipeOffset}px)`;\n clone.style.transition = 'none';\n clone.style.pointerEvents = 'none';\n clone.style.zIndex = '1';\n clone.style.boxShadow = '';\n\n const slideContainer = calendarGridElement.parentElement;\n slideContainer.style.position = 'relative';\n slideContainer.style.overflow = 'hidden';\n slideContainer.insertBefore(clone, calendarGridElement);\n\n // Dispatch month change\n if (direction > 0) {\n onswipeNext?.();\n } else {\n onswipePrev?.();\n }\n\n triggerHaptic('medium');\n\n // Position new calendar off-screen\n const enterFrom = direction > 0 ? containerWidth : -containerWidth;\n calendarGridElement.style.transition = 'none';\n calendarGridElement.style.transform = `translateX(${enterFrom}px)`;\n calendarGridElement.style.boxShadow = '';\n\n // Force reflow\n calendarGridElement.offsetHeight;\n\n // Animate\n const duration = 0.25;\n const easing = 'cubic-bezier(0.25, 0.46, 0.45, 0.94)';\n\n clone.style.transition = `transform ${duration}s ${easing}`;\n clone.style.transform = `translateX(${direction > 0 ? -containerWidth : containerWidth}px)`;\n\n calendarGridElement.style.transition = `transform ${duration}s ${easing}`;\n calendarGridElement.style.transform = 'translateX(0)';\n\n setTimeout(() => {\n if (clone.parentElement) {\n clone.remove();\n }\n calendarGridElement.style.transition = '';\n calendarGridElement.style.transform = '';\n isAnimating = false;\n swipeOffset = 0;\n }, duration * 1000 + 50);\n }\n\n // Swipe gesture handlers (with direction-aware shadows, reduced motion support)\n function handleTouchStart(e) {\n // Cancel any ongoing momentum animation\n if (momentumAnimationId) {\n cancelAnimationFrame(momentumAnimationId);\n momentumAnimationId = null;\n if (calendarGridElement) {\n calendarGridElement.style.transition = '';\n calendarGridElement.style.transform = '';\n calendarGridElement.style.boxShadow = '';\n }\n isAnimating = false;\n swipeOffset = 0;\n }\n\n if (isAnimating) return;\n\n touchStartX = e.touches[0].clientX;\n touchStartY = e.touches[0].clientY;\n touchStartTime = Date.now();\n lastTouchX = touchStartX;\n lastTouchTime = touchStartTime;\n velocityX = 0;\n isSwiping = false;\n swipeOffset = 0;\n swipeDirection = 0;\n }\n\n function handleTouchMove(e) {\n if (!touchStartX || isAnimating) return;\n\n const touchCurrentX = e.touches[0].clientX;\n const touchCurrentY = e.touches[0].clientY;\n const diffX = touchStartX - touchCurrentX;\n const diffY = touchStartY - touchCurrentY;\n const now = Date.now();\n\n // Determine if this is a horizontal swipe\n if (!isSwiping && Math.abs(diffX) > 10) {\n if (Math.abs(diffX) > Math.abs(diffY)) {\n isSwiping = true;\n } else {\n // Vertical scroll - don't handle\n touchStartX = 0;\n return;\n }\n }\n\n if (isSwiping) {\n e.preventDefault(); // Prevent page scroll during swipe\n\n // Calculate velocity (pixels per ms)\n const dt = now - lastTouchTime;\n if (dt > 0) {\n velocityX = (lastTouchX - touchCurrentX) / dt;\n }\n lastTouchX = touchCurrentX;\n lastTouchTime = now;\n\n // Determine swipe direction: positive diffX = swiping left (next month)\n // negative diffX = swiping right (previous month)\n swipeDirection = diffX > 0 ? 1 : -1;\n\n // Apply drag with slight resistance\n swipeOffset = -diffX * DRAG_RESISTANCE;\n\n // Apply transform and direction-aware shadow to calendar grid\n if (calendarGridElement) {\n calendarGridElement.style.transform = `translateX(${swipeOffset}px)`;\n calendarGridElement.style.transition = 'none';\n\n // Direction-aware shadow: shadow appears on the edge being \"lifted\"\n // Intensity increases with drag distance, max 0.4 opacity\n const shadowIntensity = Math.min(Math.abs(swipeOffset) / 80, 0.4);\n const blurRadius = 12 + shadowIntensity * 24;\n const spreadRadius = shadowIntensity * 4;\n\n if (swipeDirection > 0) {\n // Swiping left (to next month) - shadow on left edge (content lifting from left)\n calendarGridElement.style.boxShadow = `-${spreadRadius}px 0 ${blurRadius}px rgba(0,0,0,${shadowIntensity})`;\n } else {\n // Swiping right (to prev month) - shadow on right edge (content lifting from right)\n calendarGridElement.style.boxShadow = `${spreadRadius}px 0 ${blurRadius}px rgba(0,0,0,${shadowIntensity})`;\n }\n }\n }\n }\n\n function handleTouchEnd(e) {\n if (!touchStartX || !isSwiping || isAnimating) {\n touchStartX = 0;\n touchStartY = 0;\n isSwiping = false;\n swipeDirection = 0;\n return;\n }\n\n const containerWidth = calendarGridElement?.offsetWidth || 320;\n const swipePercent = Math.abs(swipeOffset) / containerWidth;\n\n // Determine if we should change month based on:\n // 1. Swipe distance threshold OR\n // 2. Velocity threshold (for quick flicks)\n const shouldChange = swipePercent > SWIPE_THRESHOLD || Math.abs(velocityX) > VELOCITY_THRESHOLD;\n const direction = swipeOffset > 0 ? -1 : 1; // -1 = prev, 1 = next\n\n isAnimating = true;\n\n // Clear shadow\n if (calendarGridElement) {\n calendarGridElement.style.boxShadow = '';\n }\n\n // Handle reduced motion preference\n if (prefersReducedMotion) {\n if (shouldChange) {\n // Instant transition for reduced motion\n if (direction > 0) {\n onswipeNext?.();\n } else {\n onswipePrev?.();\n }\n triggerHaptic('medium');\n }\n // Reset immediately (no animation)\n if (calendarGridElement) {\n calendarGridElement.style.transform = '';\n calendarGridElement.style.transition = '';\n }\n isAnimating = false;\n } else if (shouldChange) {\n // Clone the current calendar content for slide-out animation\n const clone = calendarGridElement.cloneNode(true);\n clone.classList.add('calendar-clone');\n clone.style.position = 'absolute';\n clone.style.top = '0';\n clone.style.left = '0';\n clone.style.width = '100%';\n clone.style.transform = `translateX(${swipeOffset}px)`;\n clone.style.transition = 'none';\n clone.style.pointerEvents = 'none';\n clone.style.zIndex = '1';\n clone.style.boxShadow = '';\n\n // Insert clone into the slide container\n const slideContainer = calendarGridElement.parentElement;\n slideContainer.style.position = 'relative';\n slideContainer.style.overflow = 'hidden';\n slideContainer.insertBefore(clone, calendarGridElement);\n\n // Dispatch the swipe event to change month\n if (direction > 0) {\n onswipeNext?.();\n } else {\n onswipePrev?.();\n }\n\n triggerHaptic('medium');\n\n // Position new calendar off-screen on opposite side\n const enterFrom = direction > 0 ? containerWidth : -containerWidth;\n calendarGridElement.style.transition = 'none';\n calendarGridElement.style.transform = `translateX(${enterFrom}px)`;\n\n // Force reflow\n calendarGridElement.offsetHeight;\n\n // Animate clone out and new calendar in\n const duration = 0.3;\n const easing = 'cubic-bezier(0.25, 0.46, 0.45, 0.94)';\n\n clone.style.transition = `transform ${duration}s ${easing}`;\n clone.style.transform = `translateX(${direction > 0 ? -containerWidth : containerWidth}px)`;\n\n calendarGridElement.style.transition = `transform ${duration}s ${easing}`;\n calendarGridElement.style.transform = 'translateX(0)';\n\n // Clean up after animation\n setTimeout(() => {\n if (clone.parentElement) {\n clone.remove();\n }\n calendarGridElement.style.transition = '';\n calendarGridElement.style.transform = '';\n isAnimating = false;\n }, duration * 1000 + 50);\n } else {\n // Didn't meet threshold - check if there's enough velocity for momentum\n const MOMENTUM_VELOCITY_THRESHOLD = 0.15; // Lower threshold for momentum to kick in\n\n if (Math.abs(velocityX) > MOMENTUM_VELOCITY_THRESHOLD && !prefersReducedMotion) {\n // Has velocity - let momentum continue the motion\n isAnimating = false; // animateMomentum will set this\n animateMomentum(velocityX);\n } else {\n // No meaningful velocity - snap back to original position\n calendarGridElement.style.transition = 'transform 0.3s cubic-bezier(0.25, 0.46, 0.45, 0.94)';\n calendarGridElement.style.transform = 'translateX(0)';\n\n setTimeout(() => {\n if (calendarGridElement) {\n calendarGridElement.style.transition = '';\n calendarGridElement.style.transform = '';\n }\n isAnimating = false;\n }, 300);\n }\n }\n\n // Reset touch state\n touchStartX = 0;\n touchStartY = 0;\n isSwiping = false;\n // Don't reset swipeOffset here - momentum needs it\n if (!momentumAnimationId) {\n swipeOffset = 0;\n }\n velocityX = 0;\n swipeDirection = 0;\n }\n\n // Mouse drag support for desktop\n let mouseStartX = 0;\n let mouseStartY = 0;\n let isMouseDragging = false;\n\n function handleMouseDown(e) {\n // Only handle left mouse button and not on interactive elements\n if (e.button !== 0) return;\n if (e.target.closest('button, a, [role=\"button\"]')) return;\n if (isAnimating) return;\n\n mouseStartX = e.clientX;\n mouseStartY = e.clientY;\n isMouseDragging = false;\n swipeOffset = 0;\n swipeDirection = 0;\n\n // Add listeners for move and up\n window.addEventListener('mousemove', handleMouseMove);\n window.addEventListener('mouseup', handleMouseUp);\n }\n\n function handleMouseMove(e) {\n if (!mouseStartX || isAnimating) return;\n\n const diffX = mouseStartX - e.clientX;\n const diffY = mouseStartY - e.clientY;\n\n // Determine if this is a horizontal drag\n if (!isMouseDragging && Math.abs(diffX) > 10) {\n if (Math.abs(diffX) > Math.abs(diffY)) {\n isMouseDragging = true;\n } else {\n // Vertical scroll - don't handle\n mouseStartX = 0;\n return;\n }\n }\n\n if (isMouseDragging) {\n e.preventDefault();\n swipeDirection = diffX > 0 ? 1 : -1;\n swipeOffset = -diffX * DRAG_RESISTANCE;\n\n if (calendarGridElement) {\n calendarGridElement.style.transform = `translateX(${swipeOffset}px)`;\n calendarGridElement.style.transition = 'none';\n calendarGridElement.style.cursor = 'grabbing';\n\n // Direction-aware shadow\n const shadowIntensity = Math.min(Math.abs(swipeOffset) / 80, 0.4);\n const blurRadius = 12 + shadowIntensity * 24;\n const spreadRadius = shadowIntensity * 4;\n\n if (swipeDirection > 0) {\n calendarGridElement.style.boxShadow = `-${spreadRadius}px 0 ${blurRadius}px rgba(0,0,0,${shadowIntensity})`;\n } else {\n calendarGridElement.style.boxShadow = `${spreadRadius}px 0 ${blurRadius}px rgba(0,0,0,${shadowIntensity})`;\n }\n }\n }\n }\n\n function handleMouseUp(e) {\n window.removeEventListener('mousemove', handleMouseMove);\n window.removeEventListener('mouseup', handleMouseUp);\n\n if (!mouseStartX || !isMouseDragging || isAnimating) {\n mouseStartX = 0;\n mouseStartY = 0;\n isMouseDragging = false;\n if (calendarGridElement) {\n calendarGridElement.style.cursor = '';\n }\n return;\n }\n\n const containerWidth = calendarGridElement?.offsetWidth || 320;\n const swipePercent = Math.abs(swipeOffset) / containerWidth;\n const shouldChange = swipePercent > SWIPE_THRESHOLD;\n const direction = swipeOffset > 0 ? -1 : 1;\n\n if (calendarGridElement) {\n calendarGridElement.style.boxShadow = '';\n calendarGridElement.style.cursor = '';\n }\n\n if (shouldChange && !prefersReducedMotion) {\n animateMonthTransition(direction, () => {\n if (direction > 0) {\n onswipeNext?.();\n } else {\n onswipePrev?.();\n }\n });\n } else {\n // Snap back\n if (calendarGridElement) {\n calendarGridElement.style.transition = 'transform 0.3s cubic-bezier(0.25, 0.46, 0.45, 0.94)';\n calendarGridElement.style.transform = 'translateX(0)';\n\n setTimeout(() => {\n if (calendarGridElement) {\n calendarGridElement.style.transition = '';\n calendarGridElement.style.transform = '';\n }\n }, 300);\n }\n }\n\n mouseStartX = 0;\n mouseStartY = 0;\n isMouseDragging = false;\n swipeOffset = 0;\n }\n\n // Exported function for parent to trigger animated transition\n // direction: 1 = next month, -1 = previous month\n export async function animateMonthTransition(direction, onComplete) {\n if (isAnimating || !calendarGridElement) {\n // If can't animate, just call callback\n if (onComplete) onComplete();\n return;\n }\n\n if (prefersReducedMotion) {\n // No animation for reduced motion\n if (onComplete) onComplete();\n return;\n }\n\n isAnimating = true;\n const containerWidth = calendarGridElement.offsetWidth || 320;\n const slideContainer = calendarGridElement.parentElement;\n\n // Clone current calendar for slide-out\n const clone = calendarGridElement.cloneNode(true);\n clone.classList.add('calendar-clone');\n clone.style.position = 'absolute';\n clone.style.top = '0';\n clone.style.left = '0';\n clone.style.width = '100%';\n clone.style.transform = swipeOffset ? `translateX(${swipeOffset}px)` : 'translateX(0)';\n clone.style.transition = 'none';\n clone.style.pointerEvents = 'none';\n clone.style.zIndex = '1';\n clone.style.boxShadow = '';\n\n slideContainer.style.position = 'relative';\n slideContainer.style.overflow = 'hidden';\n slideContainer.insertBefore(clone, calendarGridElement);\n\n // Call the callback to update month (this triggers re-render)\n if (onComplete) onComplete();\n\n // Wait for Svelte to update the DOM with new month data\n await tick();\n\n // Now calendarGridElement has the new month's content\n // Position new calendar off-screen\n const enterFrom = direction > 0 ? containerWidth : -containerWidth;\n calendarGridElement.style.transition = 'none';\n calendarGridElement.style.transform = `translateX(${enterFrom}px)`;\n\n // Force reflow\n calendarGridElement.offsetHeight;\n\n // Animate\n const duration = 0.3;\n const easing = 'cubic-bezier(0.25, 0.46, 0.45, 0.94)';\n\n clone.style.transition = `transform ${duration}s ${easing}`;\n clone.style.transform = `translateX(${direction > 0 ? -containerWidth : containerWidth}px)`;\n\n calendarGridElement.style.transition = `transform ${duration}s ${easing}`;\n calendarGridElement.style.transform = 'translateX(0)';\n\n setTimeout(() => {\n if (clone.parentElement) {\n clone.remove();\n }\n if (calendarGridElement) {\n calendarGridElement.style.transition = '';\n calendarGridElement.style.transform = '';\n }\n isAnimating = false;\n swipeOffset = 0;\n }, duration * 1000 + 50);\n }\n</script>\n\n<div\n class=\"w-full bg-white dark:bg-gray-900 overflow-hidden touch-pan-y select-none\"\n bind:this={calendarElement}\n ontouchstart={handleTouchStart}\n ontouchmove={handleTouchMove}\n ontouchend={handleTouchEnd}\n onmousedown={handleMouseDown}\n role=\"application\"\n aria-label={`Calendar for ${MONTH_NAMES[currentMonth]} ${currentYear}. Use arrow keys to navigate days, Enter to select.`}\n>\n <!-- Slide container for swipe animations -->\n <div class=\"calendar-slide-container\">\n <div\n bind:this={calendarGridElement}\n class=\"calendar max-sm:gap-0.5 max-sm:p-0.5 w-full overflow-hidden mx-auto grid\"\n role=\"grid\"\n aria-label={`${MONTH_NAMES[currentMonth]} ${currentYear}`}\n >\n {#each [\"Sun\", \"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\"] as dayName, i}\n <span\n class=\"day-header flex pb-1 items-end justify-center sm:pb-2 sm:pt-1 sm:justify-end sm:pr-2 text-gray-600 dark:text-gray-300 sm:text-gray-900 sm:dark:text-white overflow-hidden leading-none font-normal text-xs sm:text-lg border-b border-gray-200 dark:border-gray-700\"\n role=\"columnheader\"\n aria-label={[\"Sunday\", \"Monday\", \"Tuesday\", \"Wednesday\", \"Thursday\", \"Friday\", \"Saturday\"][i]}\n >\n <abbr title={[\"Sunday\", \"Monday\", \"Tuesday\", \"Wednesday\", \"Thursday\", \"Friday\", \"Saturday\"][i]} class=\"sm:hidden no-underline\">{dayName.slice(0, 1)}</abbr>\n <abbr title={[\"Sunday\", \"Monday\", \"Tuesday\", \"Wednesday\", \"Thursday\", \"Friday\", \"Saturday\"][i]} class=\"hidden sm:inline no-underline\">{dayName}</abbr>\n </span>\n {/each}\n <!-- Previous month preview days (greyed out - past) -->\n {#each prevMonthPreviewDays as previewDay}\n <div\n class=\"day-container preview-day past-preview text-gray-500 dark:text-gray-400 overflow-hidden flex flex-col justify-start items-center p-2 sm:p-2 sm:gap-3 max-sm:px-1 max-sm:py-0.5 max-sm:min-h-14\"\n role=\"gridcell\"\n aria-label=\"{previewDay.monthName} {previewDay.day}, preview\"\n aria-disabled=\"true\"\n >\n <div class=\"w-full flex flex-col items-center\">\n <span class=\"day text-sm sm:text-lg sm:font-normal w-full text-center sm:text-right sm:mb-2 text-gray-500 dark:text-gray-400\">{previewDay.day}</span>\n </div>\n </div>\n {/each}\n {#each daysInMonth as day, dayIndex}\n <div\n bind:this={dayElements[dayIndex]}\n class={`day-container text-gray-900 dark:text-white overflow-hidden flex flex-col justify-start items-center\n p-2 sm:p-2 sm:gap-3\n max-sm:px-1 max-sm:py-0.5 max-sm:min-h-14 max-sm:touch-manipulation\n ${day.isPast ? \"past-day\" : \"\"}\n ${day.events.length > 0 ? \"\" : \"\"}\n ${day.events.length > 0 && !day.isPast ? \"has-events cursor-pointer\" : \"\"}\n ${showDayHighlight(day.day) && day.events.length > 0 ? \"selected-day\" : \"\"}\n `}\n onclick={() => handleDayClick(day)}\n onkeydown={(e) => handleDayKeydown(e, day, dayIndex)}\n onmouseenter={() => handleHover(day)}\n onmouseleave={handleMouseLeave}\n role=\"gridcell\"\n aria-label={getDayAriaLabel(day)}\n aria-selected={showDayHighlight(day.day)}\n aria-disabled={day.isPast}\n tabindex={day.events.length > 0 && !day.isPast ? 0 : -1}\n >\n <div class=\"w-full flex flex-col items-center\">\n <span class=\"day text-sm sm:text-lg sm:font-normal w-full text-center sm:text-right sm:mb-2\">{day.day}</span>\n\n <!-- Mobile: no dots needed since has-events background shows events -->\n\n <div class=\"hidden sm:flex sm:flex-col gap-2 w-full items-center\">\n {#each day.groupedEvents as eventGroup}\n {#if eventCalendar}\n <button\n type=\"button\"\n class=\"flex items-center gap-1 max-w-full cursor-pointer embedCalendar rounded-full py-0.5 px-2 bg-transparent border-0\"\n onclick={() => handleEventClick(eventGroup.instances[0])}\n aria-label=\"{eventGroup.name} at {getStartTime(eventGroup.instances[0].timeline)}. Press Enter to view details.\"\n >\n <svg\n width=\"7\"\n height=\"7\"\n class=\"calendar-dot dot-unified shrink-0\"\n viewBox=\"0 0 6 6\"\n fill=\"currentColor\"\n aria-hidden=\"true\"\n >\n <circle cx=\"3\" cy=\"3\" r=\"3\" />\n </svg>\n <span\n class=\"text-xs sm:text-sm grow truncate text-gray-900 dark:text-white\"\n aria-hidden=\"true\"\n >{eventGroup.name}</span\n >\n <span\n class=\"text-xs md:text-sm whitespace-nowrap text-gray-900 dark:text-white\"\n aria-hidden=\"true\"\n >\n {getStartTime(eventGroup.instances[0].timeline)}</span\n >\n </button>\n {:else if embedCalendar}\n <div\n class=\"flex flex-col justify-start embedCalendar w-full items-center gap-0.5 p-1.5 rounded-lg bg-white dark:bg-gray-900 border border-gray-200 dark:border-gray-700\"\n role=\"group\"\n aria-label=\"{eventGroup.name}\"\n >\n <button\n type=\"button\"\n class=\"w-full cursor-pointer\"\n onclick={() => handleEventClick(eventGroup.instances[0])}\n aria-label=\"{eventGroup.name}. Press Enter to view event details.\"\n >\n <div\n class=\"relative w-full aspect-square rounded-md overflow-hidden bg-gray-100 dark:bg-gray-800\"\n >\n <img\n src={eventGroup.image || PLACEHOLDER_IMAGE}\n alt=\"\"\n class=\"absolute inset-0 w-full h-full object-cover\"\n style=\"transform: scale(1.15); filter: blur(16px) saturate(1.2);\"\n aria-hidden=\"true\"\n />\n <img\n src={eventGroup.image || PLACEHOLDER_IMAGE}\n alt=\"\"\n class=\"relative w-full h-full object-contain cursor-pointer\"\n aria-hidden=\"true\"\n />\n {#if eventGroup.instances.some(i => i.status === \"Selling fast\" || i.status === \"Sold out\")}\n <span\n class=\"status-badge-calendar {eventGroup.instances.find(i => i.status === 'Sold out') ? 'badge-sold-out' : 'badge-selling-fast'}\"\n aria-hidden=\"true\"\n >\n {eventGroup.instances.find(i => i.status === 'Sold out')?.status || eventGroup.instances.find(i => i.status === 'Selling fast')?.status}\n </span>\n {/if}\n </div>\n <div\n class=\"text-gray-900 dark:text-white text-xs font-semibold leading-tight tracking-normal text-center line-clamp-5 mt-1\"\n aria-hidden=\"true\"\n >\n {eventGroup.name}\n </div>\n </button>\n <!-- Time buttons for each instance -->\n <div class=\"flex flex-col gap-1 items-center mt-1 w-full\" role=\"group\" aria-label=\"Available showtimes\">\n {#each eventGroup.instances as instance}\n <button\n type=\"button\"\n class=\"time-button text-xs w-full py-1 rounded-lg bg-gray-100 dark:bg-gray-700 text-gray-900 dark:text-white font-semibold transition-all duration-150 ease-out cursor-pointer border border-gray-300 dark:border-gray-600 text-center whitespace-nowrap select-none\"\n onclick={(e) => { e.stopPropagation(); handleEventClick(instance); }}\n aria-label=\"{eventGroup.name} at {getStartTime(instance.timeline)}. Press Enter to get tickets.\"\n >\n {getStartTime(instance.timeline)}\n </button>\n {/each}\n </div>\n </div>\n {/if}\n {/each}\n </div>\n\n {#if isScheduledBtn && hoveredDay === day}\n <div class=\"mt-auto mx-auto\">\n <Button ScheduledBtn beforeIcon={\"\"} aria-label=\"Schedule event for {formatFullDate(new Date(currentYear, currentMonth, day.day).toISOString(), 'UTC')}\">Schedule</Button>\n </div>\n {/if}\n </div>\n </div>\n {/each}\n <!-- Partial preview of next month (completes the final week row) -->\n {#each nextMonthPreviewDays as previewDay}\n <div\n class=\"day-container preview-day text-gray-500 dark:text-gray-400 overflow-hidden flex flex-col justify-start items-center p-2 sm:p-2 sm:gap-3 max-sm:px-1 max-sm:py-0.5 max-sm:min-h-14\"\n role=\"gridcell\"\n aria-label=\"{previewDay.monthName} {previewDay.day}, preview\"\n aria-disabled=\"true\"\n >\n <div class=\"w-full flex flex-col items-center\">\n <span class=\"day text-sm sm:text-lg sm:font-normal w-full text-center sm:text-right sm:mb-2 text-gray-500 dark:text-gray-400\">{previewDay.day}</span>\n </div>\n </div>\n {/each}\n </div>\n </div>\n\n <!-- Screen reader live region for announcements -->\n <div\n class=\"sr-only\"\n role=\"status\"\n aria-live=\"polite\"\n aria-atomic=\"true\"\n >\n {#if selectedEvent.length > 0}\n {selectedEvent.length} event{selectedEvent.length > 1 ? 's' : ''} selected. Use Tab to navigate to events.\n {/if}\n </div>\n\n <!-- Mobile event list (shown when day is clicked) -->\n {#if selectedEvent.length > 0}\n <section\n class=\"mobile-event-list sm:hidden mt-2\"\n aria-label=\"Events for selected day\"\n aria-live=\"polite\"\n >\n <h2 class=\"sr-only\">\n {selectedEvent.length} event{selectedEvent.length > 1 ? 's' : ''} on {formatFullDate(new Date(currentYear, selectedDayMonth, selectedDayNum).toISOString(), 'UTC')}\n </h2>\n <TimePillsListView\n events={selectedEvent}\n showDateColumn={false}\n filterFutureOnly={false}\n initialCount={50}\n oneventClick={(e) => handleEventClick(e)}\n />\n </section>\n {/if}\n</div>\n\n<style>\n @reference \"../../app.css\";\n\n /* ==========================================================================\n CALENDAR STYLES - REFACTORED\n\n APPROACH: Tailwind-first for layout, CSS for:\n - Theme colors (CSS variables)\n - Complex selectors (nth-child, etc.)\n - Animation/transition properties\n - Accessibility features\n\n MOBILE BREAKPOINT: 640px (sm:)\n ========================================================================== */\n\n /* --------------------------------------------------------------------------\n SWIPE ANIMATION SUPPORT\n -------------------------------------------------------------------------- */\n .calendar-slide-container {\n position: relative;\n overflow: hidden;\n width: 100%;\n }\n\n :global(.calendar-clone) {\n @apply bg-gray-50 dark:bg-gray-800;\n }\n\n /* --------------------------------------------------------------------------\n CALENDAR GRID\n Desktop: 7 columns, full borders\n Mobile: 7 columns, horizontal lines only (Apple Calendar style)\n -------------------------------------------------------------------------- */\n .calendar {\n display: grid;\n grid-template-columns: repeat(7, minmax(100px, 1fr));\n grid-auto-rows: minmax(60px, auto);\n }\n\n @media (max-width: 1024px) {\n .calendar {\n grid-template-columns: repeat(7, minmax(100px, 1fr));\n }\n }\n\n @media (max-width: 768px) {\n .calendar {\n grid-template-columns: repeat(7, minmax(70px, 1fr));\n }\n }\n\n @media (max-width: 640px) {\n .calendar {\n grid-template-columns: repeat(7, minmax(40px, 1fr));\n grid-auto-rows: minmax(56px, auto);\n gap: 0;\n }\n }\n\n /* --------------------------------------------------------------------------\n DAY CELLS - BASE & BORDERS\n -------------------------------------------------------------------------- */\n\n /* Desktop: full grid borders */\n .calendar > .day-container,\n .calendar > .empty-cell {\n @apply border-t border-l border-gray-300 dark:border-gray-600;\n }\n\n /* Right border on last column (Saturday) - every 7th cell after headers */\n .calendar > .day-container:nth-child(7n + 14),\n .calendar > .empty-cell:nth-child(7n + 14) {\n @apply border-r border-gray-300 dark:border-gray-600;\n }\n\n .calendar > .day-container:nth-last-child(-n + 7),\n .calendar > .empty-cell:nth-last-child(-n + 7) {\n @apply border-b border-gray-300 dark:border-gray-600;\n }\n\n .empty-cell {\n min-height: 60px;\n }\n\n /* Mobile: horizontal lines only (box-shadow for unbroken lines) */\n @media (max-width: 640px) {\n .calendar > .day-container,\n .calendar > .empty-cell {\n @apply border-none;\n box-shadow: inset 0 -1px 0 0 theme('colors.gray.300');\n }\n\n :global(.dark) .calendar > .day-container,\n :global(.dark) .calendar > .empty-cell {\n box-shadow: inset 0 -1px 0 0 theme('colors.gray.600');\n }\n\n .calendar > .day-container:nth-last-child(-n + 7),\n .calendar > .empty-cell:nth-last-child(-n + 7) {\n box-shadow: none;\n }\n }\n\n /* --------------------------------------------------------------------------\n DAY NUMBER STYLING\n -------------------------------------------------------------------------- */\n .day {\n @apply text-gray-900 dark:text-white;\n }\n\n @media (max-width: 640px) {\n .day {\n @apply font-medium;\n }\n }\n\n /* --------------------------------------------------------------------------\n DAY STATES\n -------------------------------------------------------------------------- */\n\n /* Past days - greyed out but events still clickable */\n .past-day {\n @apply bg-gray-100 dark:bg-gray-700;\n }\n\n .past-day .day {\n @apply text-gray-500 dark:text-gray-400;\n }\n\n /* Past day events - muted but still interactive */\n .past-day .embedCalendar {\n opacity: 0.6;\n }\n\n .past-day .embedCalendar:hover {\n opacity: 0.8;\n }\n\n /* Preview days (prev/next month) - muted appearance, no interaction */\n .preview-day {\n pointer-events: none;\n @apply bg-white/50 dark:bg-gray-900/50;\n }\n\n /* Previous month preview days - grey like past days (more specific to override) */\n .preview-day.past-preview {\n @apply bg-gray-100 dark:bg-gray-700;\n }\n\n .preview-day .day {\n @apply text-gray-500 dark:text-gray-400;\n }\n\n /* Days with events - mobile highlight */\n @media (max-width: 640px) {\n .day-container.has-events {\n background-color: hsl(var(--Brand-Primary, 224 76% 48%) / 0.12);\n }\n\n .day-container.has-events:active {\n background-color: hsl(var(--Brand-Primary, 224 76% 48%) / 0.18);\n }\n }\n\n /* Selected day - mobile only (no desktop selection)\n Desktop: clicking days does nothing, only event cards are clickable\n Mobile: clicking a day with events shows them in the list below */\n\n /* Selected day - mobile (solid blue background) */\n @media (max-width: 640px) {\n .day-container.selected-day,\n .day-container.selected-day.has-events {\n background-color: hsl(var(--Brand-Primary, 224 76% 48%)) !important;\n border-radius: 0;\n box-shadow: inset 0 -1px 0 0 theme('colors.gray.300') !important;\n }\n\n :global(.dark) .day-container.selected-day,\n :global(.dark) .day-container.selected-day.has-events {\n box-shadow: inset 0 -1px 0 0 theme('colors.gray.600') !important;\n }\n\n .day-container.selected-day:nth-last-child(-n + 7) {\n box-shadow: none !important;\n }\n\n .selected-day .day {\n @apply !text-white font-semibold;\n }\n\n }\n\n /* --------------------------------------------------------------------------\n EVENT DOTS\n -------------------------------------------------------------------------- */\n .dot-unified,\n .dot-on-sale,\n .dot-selling-fast,\n .dot-sold-out {\n background-color: hsl(var(--Brand-Primary, 224 76% 48%));\n color: hsl(var(--Brand-Primary, 224 76% 48%));\n }\n\n /* --------------------------------------------------------------------------\n EMBEDDED CALENDAR CARDS\n -------------------------------------------------------------------------- */\n .embedCalendar {\n @apply border border-gray-200 dark:border-gray-700;\n transition: box-shadow 0.3s ease, transform 0.3s ease, border-color 0.3s ease;\n }\n\n .embedCalendar:hover {\n transform: scale(1.02);\n @apply bg-gray-50 dark:bg-gray-800 border-gray-300 dark:border-gray-600 shadow-lg;\n }\n\n /* Time buttons in embedded cards */\n .time-button {\n @apply bg-gray-100 dark:bg-gray-700 border border-gray-300 dark:border-gray-600 text-gray-900 dark:text-white;\n }\n\n .time-button:hover {\n @apply text-white;\n background-color: hsl(var(--Brand-Primary, 224 76% 48%));\n border-color: hsl(var(--Brand-Primary, 224 76% 48%));\n }\n\n .time-button:focus-visible {\n @apply outline-2 outline-blue-700 dark:outline-blue-500 outline-offset-2;\n }\n\n .time-button:active {\n transform: scale(0.97);\n @apply opacity-90;\n }\n\n /* --------------------------------------------------------------------------\n STATUS BADGES\n -------------------------------------------------------------------------- */\n .status-badge-calendar {\n @apply absolute top-1 left-1 inline-flex items-center px-1.5 py-0.5 rounded text-xs font-semibold normal-case;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.25);\n }\n\n .status-badge-calendar.badge-sold-out {\n @apply bg-red-600 text-white;\n }\n\n .status-badge-calendar.badge-selling-fast {\n @apply bg-amber-500 text-white;\n }\n\n .status-on-sale {\n @apply text-green-600 dark:text-green-500;\n }\n\n .status-selling-fast {\n @apply text-yellow-600 dark:text-yellow-400;\n }\n\n .status-sold-out {\n @apply text-red-600 dark:text-red-500;\n }\n\n /* --------------------------------------------------------------------------\n FOCUS & ACCESSIBILITY\n -------------------------------------------------------------------------- */\n .day-container:focus {\n outline: none;\n }\n\n @media (min-width: 641px) {\n .day-container:focus-visible {\n @apply outline-2 outline-blue-700 dark:outline-blue-500 rounded-md;\n outline-style: solid;\n outline-offset: 1px;\n }\n }\n\n @media (max-width: 640px) {\n .day-container:focus,\n .day-container:focus-visible {\n outline: none;\n }\n\n .day-container:focus:nth-last-child(-n + 7),\n .day-container:focus-visible:nth-last-child(-n + 7) {\n box-shadow: none;\n }\n }\n\n .event-article:focus {\n outline: none;\n }\n\n .event-article:focus-visible {\n @apply outline-2 outline-blue-700 dark:outline-blue-500;\n outline-style: solid;\n outline-offset: 2px;\n }\n\n .sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n white-space: nowrap;\n border-width: 0;\n }\n\n /* Remove default abbr underline */\n .no-underline {\n text-decoration: none;\n }\n\n /* High contrast mode */\n @media (prefers-contrast: high) {\n .day-container.has-events {\n border: 2px solid currentColor;\n }\n\n }\n\n /* Reduced motion */\n @media (prefers-reduced-motion: reduce) {\n .embedCalendar {\n transition: none;\n }\n\n .calendar {\n transition: none !important;\n }\n }\n\n /* --------------------------------------------------------------------------\n UTILITIES (keep only what Tailwind doesn't have)\n -------------------------------------------------------------------------- */\n .line-clamp-5 {\n display: -webkit-box;\n -webkit-line-clamp: 5;\n line-clamp: 5;\n -webkit-box-orient: vertical;\n overflow: hidden;\n }\n</style>\n","<script>\n import { Input, Button } from '@getmicdrop/svelte-components';\n import { ChevronDown, Search } from 'carbon-icons-svelte';\n\n let {\n viewOptions = [],\n selectedView = '',\n onViewChange = () => {},\n onsearch = () => {},\n } = $props();\n\n let dropdownOpen = $state(false);\n let dropdownRef = $state(null);\n\n function toggleDropdown() {\n dropdownOpen = !dropdownOpen;\n }\n\n function selectView(option) {\n onViewChange(option);\n dropdownOpen = false;\n }\n\n function handleSearch(event) {\n onsearch?.({ query: event.detail.query });\n }\n\n function handleClickOutside(event) {\n if (dropdownRef && !dropdownRef.contains(event.target)) {\n dropdownOpen = false;\n }\n }\n\n // Get selected view label\n let selectedLabel = $derived(\n viewOptions.find(opt => opt.id === selectedView)?.text || 'Calendar'\n );\n</script>\n\n<svelte:window onclick={handleClickOutside} />\n\n<div class=\"flex flex-col sm:flex-row sm:items-center gap-3\">\n <!-- Search input - full width on mobile, flex-1 on desktop -->\n <div class=\"flex-1 min-w-0\">\n <Input\n size=\"md\"\n type=\"text\"\n placeholder=\"Search for events\"\n className=\"w-full\"\n instantSearch\n debounceMs={300}\n minSearchChars={0}\n showClearButton\n {onsearch}\n >\n <Search slot=\"leftIcon\" size={16} />\n </Input>\n </div>\n\n <!-- View selector dropdown -->\n {#if viewOptions.length > 0}\n <div class=\"relative shrink-0\" bind:this={dropdownRef}>\n <Button\n variant=\"alternative\"\n size=\"md\"\n onclick={toggleDropdown}\n className=\"min-w-32 justify-between border border-gray-200 rounded-lg\"\n >\n <span class=\"text-sm font-medium\">{selectedLabel}</span>\n <ChevronDown class=\"w-4 h-4 ml-2 shrink-0\" />\n </Button>\n\n {#if dropdownOpen}\n <div\n class=\"absolute top-full right-0 mt-1 w-32 bg-white border border-gray-200 rounded-lg shadow-lg py-1 z-50\"\n >\n {#each viewOptions as option}\n <button\n type=\"button\"\n class=\"w-full text-left px-3 py-2 text-sm text-gray-900 hover:bg-gray-50 transition-colors\"\n class:bg-gray-50={option.id === selectedView}\n class:font-medium={option.id === selectedView}\n onclick={() => selectView(option)}\n >\n {option.text}\n </button>\n {/each}\n </div>\n {/if}\n </div>\n {/if}\n</div>\n\n<style>\n @reference \"../../app.css\";\n</style>\n","/**\n * Browse Widgets — BrowseEvent Adapter\n * Converts CalendarContainer event format (from transformEventData in api.js)\n * to BrowseEvent[] used by premium browse widgets.\n *\n * Loosely coupled: operates on the output shape of transformEventData,\n * does NOT import transformEventData directly.\n */\n\nimport type { BrowseEvent, EventStatus } from './types';\n\n/**\n * Map a CalendarContainer status string to BrowseEvent's EventStatus.\n *\n * Handles case variations and the isSoldOut override:\n * if the event's isSoldOut flag is true and the derived status would be 'on_sale',\n * the result is overridden to 'sold_out'.\n */\nexport function mapCalendarStatusToBrowseStatus(status: string, isSoldOut: boolean): EventStatus {\n\tconst normalized = (status || '').toLowerCase().replace(/\\s+/g, '_');\n\n\tlet mapped: EventStatus;\n\n\tswitch (normalized) {\n\t\tcase 'on_sale':\n\t\t\tmapped = 'on_sale';\n\t\t\tbreak;\n\t\tcase 'sold_out':\n\t\tcase 'soldout':\n\t\t\tmapped = 'sold_out';\n\t\t\tbreak;\n\t\tcase 'coming_soon':\n\t\tcase 'comingsoon':\n\t\t\tmapped = 'coming_soon';\n\t\t\tbreak;\n\t\tcase 'sales_ended':\n\t\tcase 'salesended':\n\t\t\tmapped = 'sales_ended';\n\t\t\tbreak;\n\t\tcase 'cancelled':\n\t\tcase 'canceled':\n\t\t\tmapped = 'cancelled';\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tmapped = 'on_sale';\n\t\t\tbreak;\n\t}\n\n\t// Override: isSoldOut flag takes precedence over 'on_sale'\n\tif (isSoldOut && mapped === 'on_sale') {\n\t\treturn 'sold_out';\n\t}\n\n\treturn mapped;\n}\n\n/**\n * Convert an array of CalendarContainer events (as produced by transformEventData)\n * into BrowseEvent[] for consumption by browse widgets.\n *\n * Events with falsy `id` are filtered out as a defensive guard.\n */\nexport function adaptToBrowseEvents(calendarEvents: any[]): BrowseEvent[] {\n\tif (!Array.isArray(calendarEvents)) return [];\n\n\treturn calendarEvents\n\t\t.filter((event) => !!event.id)\n\t\t.map((event) => ({\n\t\t\teventID: event.id,\n\t\t\tname: event.name,\n\t\t\tdate: event.date,\n\t\t\tstartDateTime: event.startDateTime || '',\n\t\t\tendDateTime: event.endDateTime || undefined,\n\t\t\timageUrl: event.image,\n\t\t\tstatus: mapCalendarStatusToBrowseStatus(event.status, event.isSoldOut || false),\n\t\t\teventSeriesId: event.eventSeriesId || undefined,\n\t\t\tticketsRemaining: event.ticketsRemaining,\n\t\t\tticketsTotal: event.ticketsTotal,\n\t\t\tdescription: event.description || undefined,\n\t\t\ttimeZone: event.timeZone || undefined,\n\t\t\tslug: event.slug || undefined,\n\t\t\tvenueName: event.venueName || undefined,\n\t\t\tvenueAddress: event.venueAddress || undefined\n\t\t}));\n}\n","<script lang=\"ts\">\r\n\t/**\r\n\t * Time Pills — Gallery Card\r\n\t * Evolved from GalleryCard.svelte. When a GroupedEvent has multiple instances\r\n\t * (series with multiple showtimes on the same day), renders clickable time pills\r\n\t * instead of a single time. Single-showtime events render normally.\r\n\t *\r\n\t * Desktop polish: shows truncated description at lg breakpoint.\r\n\t */\r\n\timport ScarcityBadge from \"../../../../components/ScarcityBadge.svelte\";\r\n\timport { formatBrowseDate, formatFullDate, formatEventTime } from \"$lib/utils/datetime.js\";\r\n\timport { PLACEHOLDER_IMAGE } from \"$lib/utils/constants.js\";\r\n\timport { getBrowseStatus, isEventUnavailable } from \"$lib/utils/browse-status.js\";\r\n\timport type { BrowseEvent } from \"$lib/browse-widgets/types\";\r\n\timport type { GroupedEvent } from \"$lib/browse-widgets/types\";\r\n\r\n\tinterface Props {\r\n\t\tgrouped: GroupedEvent;\r\n\t\toneventClick?: (event: BrowseEvent) => void;\r\n\t}\r\n\r\n\tlet { grouped, oneventClick }: Props = $props();\r\n\r\n\tlet event = $derived(grouped.event);\r\n\tlet browseStatus = $derived(getBrowseStatus(event));\r\n\tlet isUnavailable = $derived(isEventUnavailable(browseStatus));\r\n\r\n\tfunction getEventAriaLabel() {\r\n\t\tconst parts = [event.name];\r\n\t\tif (event.startDateTime) {\r\n\t\t\tparts.push(`on ${formatBrowseDate(event.startDateTime, event.timeZone)}`);\r\n\t\t}\r\n\t\tif (grouped.isSeries) {\r\n\t\t\tparts.push(`${grouped.instances.length} showtimes available`);\r\n\t\t} else if (event.startDateTime) {\r\n\t\t\tparts.push(`at ${formatEventTime(event.startDateTime, event.timeZone)}`);\r\n\t\t}\r\n\t\tif (browseStatus) {\r\n\t\t\tparts.push(browseStatus.text);\r\n\t\t}\r\n\t\tparts.push(\"Press Enter to view details\");\r\n\t\treturn parts.join(\", \");\r\n\t}\r\n\r\n\tfunction handleCardClick() {\r\n\t\toneventClick?.(event);\r\n\t}\r\n\r\n\tfunction handlePillClick(instance: BrowseEvent, e: MouseEvent) {\r\n\t\te.stopPropagation();\r\n\t\toneventClick?.(instance);\r\n\t}\r\n\r\n\tfunction handlePillKeydown(instance: BrowseEvent, e: KeyboardEvent) {\r\n\t\tif (e.key === \"Enter\" || e.key === \" \") {\r\n\t\t\te.preventDefault();\r\n\t\t\te.stopPropagation();\r\n\t\t\toneventClick?.(instance);\r\n\t\t}\r\n\t}\r\n</script>\r\n\r\n<div\r\n\tclass=\"gallery-card\"\r\n\tclass:card-unavailable={isUnavailable}\r\n\tonclick={handleCardClick}\r\n\tonkeydown={(e) => (e.key === \"Enter\" || e.key === \" \") && handleCardClick()}\r\n\ttabindex=\"0\"\r\n\trole=\"button\"\r\n\taria-label={getEventAriaLabel()}\r\n>\r\n\t<!-- Image container -->\r\n\t<div class=\"card-image-container\">\r\n\t\t<img\r\n\t\t\tsrc={event.imageUrl || PLACEHOLDER_IMAGE}\r\n\t\t\talt=\"\"\r\n\t\t\tclass=\"card-image-blur\"\r\n\t\t\tloading=\"lazy\"\r\n\t\t\taria-hidden=\"true\"\r\n\t\t/>\r\n\t\t<img\r\n\t\t\tsrc={event.imageUrl || PLACEHOLDER_IMAGE}\r\n\t\t\talt=\"\"\r\n\t\t\tclass=\"card-image\"\r\n\t\t\tloading=\"lazy\"\r\n\t\t\taria-hidden=\"true\"\r\n\t\t/>\r\n\t\t<!-- Status Badge overlay -->\r\n\t\t{#if browseStatus}\r\n\t\t\t<div class=\"badge-overlay\" aria-hidden=\"true\">\r\n\t\t\t\t<span class=\"status-badge status-{browseStatus.type}\">{browseStatus.text}</span>\r\n\t\t\t</div>\r\n\t\t{:else if event.ticketsTotal && (event.ticketsTotal > 0 || event.ticketsRemaining === 0)}\r\n\t\t\t<div class=\"badge-overlay\" aria-hidden=\"true\">\r\n\t\t\t\t<ScarcityBadge\r\n\t\t\t\t\tremaining={event.ticketsRemaining ?? 0}\r\n\t\t\t\t\ttotal={event.ticketsTotal ?? 0}\r\n\t\t\t\t\tcontext=\"browse\"\r\n\t\t\t\t/>\r\n\t\t\t</div>\r\n\t\t{/if}\r\n\t</div>\r\n\r\n\t<!-- Card content -->\r\n\t<div class=\"card-content\" aria-hidden=\"true\">\r\n\t\t<h3 class=\"card-title\">{event.name}</h3>\r\n\r\n\t\t<div class=\"card-meta\">\r\n\t\t\t{#if event.startDateTime}\r\n\t\t\t\t<time datetime={event.startDateTime}>\r\n\t\t\t\t\t{formatBrowseDate(event.startDateTime, event.timeZone)}\r\n\t\t\t\t</time>\r\n\t\t\t{/if}\r\n\r\n\t\t\t{#if grouped.isSeries}\r\n\t\t\t\t<!-- Time pills for series with multiple showtimes -->\r\n\t\t\t\t<div class=\"time-pills\">\r\n\t\t\t\t\t{#each grouped.instances as instance (instance.eventID)}\r\n\t\t\t\t\t\t<button\r\n\t\t\t\t\t\t\ttype=\"button\"\r\n\t\t\t\t\t\t\tclass=\"time-pill\"\r\n\t\t\t\t\t\t\tonclick={(e) => handlePillClick(instance, e)}\r\n\t\t\t\t\t\t\tonkeydown={(e) => handlePillKeydown(instance, e)}\r\n\t\t\t\t\t\t\taria-label=\"{event.name} at {formatEventTime(instance.startDateTime, instance.timeZone)}\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t{formatEventTime(instance.startDateTime, instance.timeZone)}\r\n\t\t\t\t\t\t</button>\r\n\t\t\t\t\t{/each}\r\n\t\t\t\t</div>\r\n\t\t\t{:else if event.startDateTime}\r\n\t\t\t\t<!-- Single showtime — same button style for consistency -->\r\n\t\t\t\t<div class=\"time-pills\">\r\n\t\t\t\t\t<button\r\n\t\t\t\t\t\ttype=\"button\"\r\n\t\t\t\t\t\tclass=\"time-pill\"\r\n\t\t\t\t\t\tonclick={(e) => handlePillClick(event, e)}\r\n\t\t\t\t\t\tonkeydown={(e) => handlePillKeydown(event, e)}\r\n\t\t\t\t\t\taria-label=\"{event.name} at {formatEventTime(event.startDateTime, event.timeZone)}\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t\t{formatEventTime(event.startDateTime, event.timeZone)}\r\n\t\t\t\t\t</button>\r\n\t\t\t\t</div>\r\n\t\t\t{/if}\r\n\t\t</div>\r\n\r\n\t\t<!-- Desktop description -->\r\n\t\t{#if event.description}\r\n\t\t\t<p class=\"card-description\">{event.description}</p>\r\n\t\t{/if}\r\n\t</div>\r\n</div>\r\n\r\n<style>\r\n\t@reference \"../../../../app.css\";\r\n\r\n\t.gallery-card {\r\n\t\t@apply rounded-lg border bg-white dark:bg-gray-900 border-gray-200 dark:border-gray-700;\r\n\t\t@apply overflow-hidden cursor-pointer;\r\n\t\ttransition: transform 0.2s ease, box-shadow 0.2s ease, border-color 0.2s ease;\r\n\t}\r\n\r\n\t.gallery-card:hover {\r\n\t\t@apply border-gray-300 dark:border-gray-600;\r\n\t\ttransform: translateY(-2px);\r\n\t\tbox-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);\r\n\t}\r\n\r\n\t.gallery-card:focus {\r\n\t\t@apply outline-none;\r\n\t}\r\n\r\n\t.gallery-card:focus-visible {\r\n\t\t@apply outline-2 outline-blue-700 dark:outline-blue-500 outline-offset-2;\r\n\t}\r\n\r\n\t.gallery-card:active {\r\n\t\ttransform: translateY(0);\r\n\t}\r\n\r\n\t/* Fixed height image container with blurred backdrop */\r\n\t.card-image-container {\r\n\t\t@apply relative w-full overflow-hidden bg-gray-100 dark:bg-gray-800;\r\n\t\theight: 220px;\r\n\t}\r\n\r\n\t@media (min-width: 640px) {\r\n\t\t.card-image-container {\r\n\t\t\theight: 200px;\r\n\t\t}\r\n\t}\r\n\r\n\t@media (min-width: 1024px) {\r\n\t\t.card-image-container {\r\n\t\t\theight: 180px;\r\n\t\t}\r\n\t}\r\n\r\n\t/* Blurred zoomed copy as backdrop */\r\n\t.card-image-blur {\r\n\t\t@apply absolute inset-0 w-full h-full;\r\n\t\tobject-fit: cover;\r\n\t\ttransform: scale(1.15);\r\n\t\tfilter: blur(20px) saturate(1.2);\r\n\t}\r\n\r\n\t/* Main image on top, contained */\r\n\t.card-image {\r\n\t\t@apply relative;\r\n\t\twidth: 100%;\r\n\t\theight: 100%;\r\n\t\tobject-fit: contain;\r\n\t}\r\n\r\n\t.badge-overlay {\r\n\t\tposition: absolute;\r\n\t\ttop: 8px;\r\n\t\tleft: 8px;\r\n\t}\r\n\r\n\t.card-content {\r\n\t\t@apply p-3;\r\n\t}\r\n\r\n\t@media (min-width: 640px) {\r\n\t\t.card-content {\r\n\t\t\t@apply p-3.5;\r\n\t\t}\r\n\t}\r\n\r\n\t@media (min-width: 1024px) {\r\n\t\t.card-content {\r\n\t\t\t@apply p-4;\r\n\t\t}\r\n\t}\r\n\r\n\t.card-title {\r\n\t\t@apply text-base font-semibold text-gray-900 dark:text-white mb-1.5;\r\n\t\tline-height: 1.3;\r\n\t\tdisplay: -webkit-box;\r\n\t\t-webkit-line-clamp: 2;\r\n\t\tline-clamp: 2;\r\n\t\t-webkit-box-orient: vertical;\r\n\t\toverflow: hidden;\r\n\t}\r\n\r\n\t@media (max-width: 639px) {\r\n\t\t.card-title {\r\n\t\t\t@apply text-lg;\r\n\t\t}\r\n\t}\r\n\r\n\t.card-meta {\r\n\t\t@apply text-sm text-gray-600 dark:text-gray-300 font-medium;\r\n\t}\r\n\r\n\t@media (max-width: 639px) {\r\n\t\t.card-meta {\r\n\t\t\t@apply text-base;\r\n\t\t}\r\n\t}\r\n\r\n\t/* Time buttons — gray, matching calendar */\r\n\t.time-pills {\r\n\t\t@apply flex flex-wrap gap-2 mt-2;\r\n\t}\r\n\r\n\t.time-pill {\r\n\t\t@apply inline-flex items-center justify-center px-4 py-1.5 text-xs font-semibold rounded-lg;\r\n\t\t@apply text-gray-900 dark:text-white bg-gray-100 dark:bg-gray-700;\r\n\t\t@apply border border-gray-300 dark:border-gray-600;\r\n\t\t@apply cursor-pointer transition-all duration-150 ease-out select-none;\r\n\t}\r\n\r\n\t.time-pill:hover {\r\n\t\t@apply text-white;\r\n\t\tbackground-color: hsl(var(--Brand-Primary, 224 76% 48%));\r\n\t\tborder-color: hsl(var(--Brand-Primary, 224 76% 48%));\r\n\t}\r\n\r\n\t.time-pill:focus-visible {\r\n\t\t@apply outline-2 outline-blue-700 dark:outline-blue-500 outline-offset-2;\r\n\t}\r\n\r\n\t.time-pill:active {\r\n\t\ttransform: scale(0.97);\r\n\t\t@apply opacity-90;\r\n\t}\r\n\r\n\t/* Desktop description — hidden by default, shown at lg */\r\n\t.card-description {\r\n\t\t@apply hidden mt-2 text-sm text-gray-600 dark:text-gray-300;\r\n\t\tdisplay: none;\r\n\t}\r\n\r\n\t@media (min-width: 1024px) {\r\n\t\t.card-description {\r\n\t\t\tdisplay: -webkit-box;\r\n\t\t\t-webkit-line-clamp: 2;\r\n\t\t\tline-clamp: 2;\r\n\t\t\t-webkit-box-orient: vertical;\r\n\t\t\toverflow: hidden;\r\n\t\t}\r\n\t}\r\n\r\n\t/* Unavailable event dimming — badge stays full opacity */\r\n\t.card-unavailable .card-image,\r\n\t.card-unavailable .card-image-blur {\r\n\t\t@apply opacity-60;\r\n\t\tfilter: grayscale(0.5);\r\n\t}\r\n\r\n\t.card-unavailable .card-content {\r\n\t\t@apply opacity-60;\r\n\t}\r\n\r\n\t/* Status badges — matching gallery card treatments */\r\n\t.status-badge {\r\n\t\t@apply inline-flex items-center text-xs font-bold px-2.5 py-1 rounded;\r\n\t\tbox-shadow: 0 2px 6px rgba(0, 0, 0, 0.25);\r\n\t\tletter-spacing: 0.02em;\r\n\t}\r\n\r\n\t.status-cancelled {\r\n\t\t@apply text-white;\r\n\t\tbackground: linear-gradient(135deg, rgb(127 29 29) 0%, rgb(185 28 28) 100%);\r\n\t\ttext-decoration: line-through;\r\n\t\ttext-decoration-thickness: 1.5px;\r\n\t}\r\n\r\n\t.status-past {\r\n\t\t@apply text-gray-300;\r\n\t\tbackground: rgba(0, 0, 0, 0.7);\r\n\t\tbackdrop-filter: blur(4px);\r\n\t}\r\n\r\n\t.status-sold_out {\r\n\t\t@apply text-white;\r\n\t\tbackground: linear-gradient(135deg, rgb(220 38 38) 0%, rgb(239 68 68) 100%);\r\n\t}\r\n\r\n\t.status-sales_ended {\r\n\t\t@apply text-gray-200;\r\n\t\tbackground: rgba(55, 65, 81, 0.9);\r\n\t\tbackdrop-filter: blur(4px);\r\n\t\tborder: 1px solid rgba(156, 163, 175, 0.3);\r\n\t}\r\n\r\n\t.status-coming_soon {\r\n\t\t@apply text-white;\r\n\t\tbackground: linear-gradient(135deg, rgb(37 99 235) 0%, rgb(99 102 241) 100%);\r\n\t}\r\n\r\n\t/* Reduced motion */\r\n\t@media (prefers-reduced-motion: reduce) {\r\n\t\t.gallery-card {\r\n\t\t\ttransition: none;\r\n\t\t}\r\n\r\n\t\t.gallery-card:hover {\r\n\t\t\ttransform: none;\r\n\t\t}\r\n\t}\r\n</style>\r\n","<script lang=\"ts\">\r\n\t/**\r\n\t * Time Pills — Gallery View\r\n\t * Evolved from GalleryView.svelte. Uses groupEventsBySeries to bundle\r\n\t * same-day series events, then renders TimePillsGalleryCard for each group.\r\n\t *\r\n\t * Grid: 1 col mobile, 2 col sm (640px), 3 col md (768px), 3 col lg (1024px).\r\n\t * At lg, cards are wider with description visible — so 3 cols instead of 4.\r\n\t * Infinite scroll with IntersectionObserver.\r\n\t */\r\n\timport { onMount, onDestroy } from \"svelte\";\r\n\timport TimePillsGalleryCard from \"./TimePillsGalleryCard.svelte\";\r\n\timport { filterTodayAndFuture } from \"$lib/utils/browse-status.js\";\r\n\timport { groupEventsBySeries } from \"$lib/browse-widgets/utils\";\r\n\timport type { BrowseEvent } from \"$lib/browse-widgets/types\";\r\n\timport type { GroupedEvent } from \"$lib/browse-widgets/types\";\r\n\r\n\tinterface Props {\r\n\t\tevents?: BrowseEvent[];\r\n\t\tinitialCount?: number;\r\n\t\tloadMoreCount?: number;\r\n\t\toneventClick?: (event: BrowseEvent) => void;\r\n\t}\r\n\r\n\tlet {\r\n\t\tevents = [],\r\n\t\tinitialCount = 12,\r\n\t\tloadMoreCount = 12,\r\n\t\toneventClick\r\n\t}: Props = $props();\r\n\r\n\tlet displayedCount = $state(initialCount);\r\n\tlet loadMoreTrigger = $state<HTMLDivElement | null>(null);\r\n\tlet observer: IntersectionObserver | undefined;\r\n\r\n\t// Filter to today and future, then group by series+date\r\n\tlet futureEvents = $derived(filterTodayAndFuture(events));\r\n\tlet groupedEvents: GroupedEvent[] = $derived(groupEventsBySeries(futureEvents));\r\n\tlet displayedGroups = $derived(groupedEvents.slice(0, displayedCount));\r\n\tlet hasMore = $derived(displayedCount < groupedEvents.length);\r\n\r\n\tfunction loadMore() {\r\n\t\tdisplayedCount += loadMoreCount;\r\n\t}\r\n\r\n\tonMount(() => {\r\n\t\tobserver = new IntersectionObserver(\r\n\t\t\t(entries) => {\r\n\t\t\t\tif (entries[0].isIntersecting && hasMore) {\r\n\t\t\t\t\tloadMore();\r\n\t\t\t\t}\r\n\t\t\t},\r\n\t\t\t{ rootMargin: \"100px\" }\r\n\t\t);\r\n\r\n\t\tif (loadMoreTrigger) {\r\n\t\t\tobserver.observe(loadMoreTrigger);\r\n\t\t}\r\n\t});\r\n\r\n\tonDestroy(() => {\r\n\t\tif (observer) {\r\n\t\t\tobserver.disconnect();\r\n\t\t}\r\n\t});\r\n\r\n\t// Re-observe when trigger element changes\r\n\t$effect(() => {\r\n\t\tif (observer && loadMoreTrigger) {\r\n\t\t\tobserver.disconnect();\r\n\t\t\tobserver.observe(loadMoreTrigger);\r\n\t\t}\r\n\t});\r\n</script>\r\n\r\n<section class=\"gallery-view\" aria-label=\"Events gallery\">\r\n\t<h2 class=\"sr-only\">Upcoming events</h2>\r\n\t<ul class=\"gallery-grid\" role=\"list\">\r\n\t\t{#each displayedGroups as grouped (grouped.event.eventID)}\r\n\t\t\t<li class=\"gallery-card-wrapper\">\r\n\t\t\t\t<TimePillsGalleryCard {grouped} {oneventClick} />\r\n\t\t\t</li>\r\n\t\t{/each}\r\n\t</ul>\r\n\r\n\t<!-- Infinite scroll trigger -->\r\n\t{#if hasMore}\r\n\t\t<div bind:this={loadMoreTrigger} class=\"load-more-trigger\" role=\"status\" aria-live=\"polite\">\r\n\t\t\t<span class=\"loading-text\">Loading more events...</span>\r\n\t\t</div>\r\n\t{/if}\r\n</section>\r\n\r\n<style>\r\n\t@reference \"../../../../app.css\";\r\n\r\n\t.gallery-view {\r\n\t\twidth: 100%;\r\n\t}\r\n\r\n\t.gallery-grid {\r\n\t\t@apply grid grid-cols-1 gap-4 bg-gray-50 dark:bg-gray-900 p-2;\r\n\t}\r\n\r\n\t/* 2 columns at sm (640px) */\r\n\t@media (min-width: 640px) {\r\n\t\t.gallery-grid {\r\n\t\t\t@apply grid-cols-2 gap-4 p-3;\r\n\t\t}\r\n\t}\r\n\r\n\t/* 3 columns at md (768px) */\r\n\t@media (min-width: 768px) {\r\n\t\t.gallery-grid {\r\n\t\t\t@apply grid-cols-3 gap-5 p-4;\r\n\t\t}\r\n\t}\r\n\r\n\t/* 3 columns at lg (1024px) — wider cards with descriptions, not 4 */\r\n\t@media (min-width: 1024px) {\r\n\t\t.gallery-grid {\r\n\t\t\t@apply grid-cols-3 gap-6 p-6;\r\n\t\t}\r\n\t}\r\n\r\n\t/* Load more trigger */\r\n\t.load-more-trigger {\r\n\t\t@apply flex items-center justify-center gap-2 py-2 p-6;\r\n\t}\r\n\r\n\t.loading-text {\r\n\t\t@apply text-sm text-gray-500 dark:text-gray-400;\r\n\t}\r\n\r\n\t/* Gallery card wrapper for list items */\r\n\t.gallery-card-wrapper {\r\n\t\t@apply list-none;\r\n\t}\r\n\r\n\t/* Screen reader only text */\r\n\t.sr-only {\r\n\t\tposition: absolute;\r\n\t\twidth: 1px;\r\n\t\theight: 1px;\r\n\t\tpadding: 0;\r\n\t\tmargin: -1px;\r\n\t\toverflow: hidden;\r\n\t\tclip: rect(0, 0, 0, 0);\r\n\t\twhite-space: nowrap;\r\n\t\tborder-width: 0;\r\n\t}\r\n</style>\r\n","<script lang=\"ts\">\n\t/**\n\t * Time Pills — Carousel View\n\t * Thin wrapper that renders TimePillsGalleryCard in a horizontal scroll container.\n\t * Scroll mechanics (snap, arrows, ResizeObserver) adapted from CarouselView.svelte.\n\t */\n\timport { onMount } from \"svelte\";\n\timport TimePillsGalleryCard from \"./TimePillsGalleryCard.svelte\";\n\timport { filterTodayAndFuture } from \"$lib/utils/browse-status.js\";\n\timport { groupEventsBySeries } from \"$lib/browse-widgets/utils\";\n\timport type { BrowseEvent } from \"$lib/browse-widgets/types\";\n\n\tinterface Props {\n\t\tevents?: BrowseEvent[];\n\t\toneventClick?: (event: BrowseEvent) => void;\n\t}\n\n\tlet { events = [], oneventClick }: Props = $props();\n\n\tlet scrollContainer = $state<HTMLDivElement | null>(null);\n\tlet canScrollLeft = $state(false);\n\tlet canScrollRight = $state(false);\n\tlet showArrows = $state(false);\n\n\t// Filter to today and future, group by series\n\tlet futureEvents = $derived(filterTodayAndFuture(events));\n\tlet groupedEvents = $derived(groupEventsBySeries(futureEvents));\n\n\tfunction updateScrollState() {\n\t\tif (!scrollContainer) return;\n\t\tconst { scrollLeft, scrollWidth, clientWidth } = scrollContainer;\n\t\tcanScrollLeft = scrollLeft > 1;\n\t\tcanScrollRight = scrollLeft + clientWidth < scrollWidth - 1;\n\t\tshowArrows = scrollWidth > clientWidth + 1;\n\t}\n\n\tfunction scrollByCard(direction: number) {\n\t\tif (!scrollContainer) return;\n\t\tconst firstCard = scrollContainer.querySelector('.carousel-item') as HTMLElement | null;\n\t\tif (!firstCard) return;\n\t\tconst cardWidth = firstCard.offsetWidth + 16; // card width + gap\n\t\tscrollContainer.scrollBy({ left: direction * cardWidth, behavior: 'smooth' });\n\t}\n\n\tonMount(() => {\n\t\tupdateScrollState();\n\t\tconst observer = new ResizeObserver(() => updateScrollState());\n\t\tif (scrollContainer) {\n\t\t\tobserver.observe(scrollContainer);\n\t\t}\n\t\treturn () => observer.disconnect();\n\t});\n</script>\n\n<section class=\"carousel-view\" aria-label=\"Events carousel\">\n\t<h2 class=\"sr-only\">Upcoming events</h2>\n\n\t<div class=\"carousel-wrapper\">\n\t\t<!-- Left arrow -->\n\t\t{#if showArrows && canScrollLeft}\n\t\t\t<button\n\t\t\t\tclass=\"carousel-arrow carousel-arrow-left\"\n\t\t\t\tonclick={() => scrollByCard(-1)}\n\t\t\t\taria-label=\"Scroll left\"\n\t\t\t>\n\t\t\t\t<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"arrow-icon\"><polyline points=\"15 18 9 12 15 6\"></polyline></svg>\n\t\t\t</button>\n\t\t{/if}\n\n\t\t<!-- Scroll container -->\n\t\t<div\n\t\t\tclass=\"carousel-scroll\"\n\t\t\tbind:this={scrollContainer}\n\t\t\tonscroll={updateScrollState}\n\t\t\trole=\"list\"\n\t\t>\n\t\t\t{#each groupedEvents as grouped (grouped.event.eventID)}\n\t\t\t\t<div class=\"carousel-item\" role=\"listitem\">\n\t\t\t\t\t<TimePillsGalleryCard {grouped} {oneventClick} />\n\t\t\t\t</div>\n\t\t\t{/each}\n\t\t</div>\n\n\t\t<!-- Right arrow -->\n\t\t{#if showArrows && canScrollRight}\n\t\t\t<button\n\t\t\t\tclass=\"carousel-arrow carousel-arrow-right\"\n\t\t\t\tonclick={() => scrollByCard(1)}\n\t\t\t\taria-label=\"Scroll right\"\n\t\t\t>\n\t\t\t\t<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"arrow-icon\"><polyline points=\"9 18 15 12 9 6\"></polyline></svg>\n\t\t\t</button>\n\t\t{/if}\n\t</div>\n</section>\n\n<style>\n\t@reference \"../../../../app.css\";\n\n\t.carousel-view {\n\t\twidth: 100%;\n\t}\n\n\t.carousel-wrapper {\n\t\t@apply relative;\n\t}\n\n\t.carousel-scroll {\n\t\t@apply flex gap-4 overflow-x-auto p-2;\n\t\tscroll-snap-type: x mandatory;\n\t\t-webkit-overflow-scrolling: touch;\n\t\tscrollbar-width: none;\n\t}\n\n\t.carousel-scroll::-webkit-scrollbar {\n\t\tdisplay: none;\n\t}\n\n\t.carousel-item {\n\t\tscroll-snap-align: start;\n\t\tflex: 0 0 85%;\n\t}\n\n\t/* Tablet: 2 visible cards with peek */\n\t@media (min-width: 640px) {\n\t\t.carousel-item {\n\t\t\tflex: 0 0 calc(50% - 8px);\n\t\t}\n\n\t\t.carousel-scroll {\n\t\t\t@apply p-3;\n\t\t}\n\t}\n\n\t/* Desktop: 3 visible cards with peek */\n\t@media (min-width: 1024px) {\n\t\t.carousel-item {\n\t\t\tflex: 0 0 calc(33.333% - 11px);\n\t\t}\n\n\t\t.carousel-scroll {\n\t\t\t@apply p-4;\n\t\t}\n\t}\n\n\t/* Arrow buttons */\n\t.carousel-arrow {\n\t\t@apply absolute top-1/2 -translate-y-1/2 z-10;\n\t\t@apply w-10 h-10 rounded-full flex items-center justify-center;\n\t\t@apply bg-white/90 dark:bg-gray-800/90 border border-gray-200 dark:border-gray-600;\n\t\t@apply shadow-lg cursor-pointer;\n\t\t@apply transition-opacity duration-200;\n\t}\n\n\t.carousel-arrow:hover {\n\t\t@apply bg-white dark:bg-gray-700;\n\t}\n\n\t.carousel-arrow:focus-visible {\n\t\t@apply outline-2 outline-blue-700 dark:outline-blue-500 outline-offset-2;\n\t}\n\n\t.carousel-arrow-left {\n\t\tleft: 8px;\n\t}\n\n\t.carousel-arrow-right {\n\t\tright: 8px;\n\t}\n\n\t.arrow-icon {\n\t\t@apply w-5 h-5 text-gray-700 dark:text-gray-200;\n\t}\n\n\t/* Hide arrows on mobile -- touch scrolling is natural */\n\t@media (max-width: 639px) {\n\t\t.carousel-arrow {\n\t\t\tdisplay: none;\n\t\t}\n\t}\n\n\t/* Reduced motion */\n\t@media (prefers-reduced-motion: reduce) {\n\t\t.carousel-scroll {\n\t\t\tscroll-behavior: auto;\n\t\t}\n\t}\n\n\t/* Screen reader only text */\n\t.sr-only {\n\t\tposition: absolute;\n\t\twidth: 1px;\n\t\theight: 1px;\n\t\tpadding: 0;\n\t\tmargin: -1px;\n\t\toverflow: hidden;\n\t\tclip: rect(0, 0, 0, 0);\n\t\twhite-space: nowrap;\n\t\tborder-width: 0;\n\t}\n</style>\n","<script lang=\"ts\">\n\t/**\n\t * Time Pills — Featured View\n\t * Thin wrapper that renders the first grouped event as a large hero-sized\n\t * TimePillsGalleryCard. When no events, shows an empty state message.\n\t */\n\timport TimePillsGalleryCard from \"./TimePillsGalleryCard.svelte\";\n\timport { filterTodayAndFuture } from \"$lib/utils/browse-status.js\";\n\timport { groupEventsBySeries } from \"$lib/browse-widgets/utils\";\n\timport type { BrowseEvent } from \"$lib/browse-widgets/types\";\n\n\tinterface Props {\n\t\tevents?: BrowseEvent[];\n\t\tfeaturedItem?: any;\n\t\toneventClick?: (event: BrowseEvent) => void;\n\t}\n\n\tlet { events = [], featuredItem, oneventClick }: Props = $props();\n\n\t// Filter to today and future, group by series\n\tlet futureEvents = $derived(filterTodayAndFuture(events));\n\tlet groupedEvents = $derived(groupEventsBySeries(futureEvents));\n\tlet heroGrouped = $derived(groupedEvents.length > 0 ? groupedEvents[0] : null);\n</script>\n\n<section class=\"featured-view\" aria-label=\"Featured event\">\n\t{#if heroGrouped}\n\t\t<div class=\"featured-card-container\">\n\t\t\t<TimePillsGalleryCard grouped={heroGrouped} {oneventClick} />\n\t\t</div>\n\t{:else}\n\t\t<div class=\"featured-empty\">\n\t\t\t<p class=\"empty-text\">No upcoming events to feature</p>\n\t\t</div>\n\t{/if}\n</section>\n\n<style>\n\t@reference \"../../../../app.css\";\n\n\t.featured-view {\n\t\twidth: 100%;\n\t}\n\n\t.featured-card-container {\n\t\t@apply max-w-2xl mx-auto;\n\t}\n\n\t.featured-empty {\n\t\t@apply flex items-center justify-center py-12 rounded-lg border border-gray-200 dark:border-gray-700 bg-gray-50 dark:bg-gray-900;\n\t}\n\n\t.empty-text {\n\t\t@apply text-sm text-gray-500 dark:text-gray-400;\n\t}\n</style>\n","<script>\n let { type = '' } = $props();\n let boxes = 30;\n let hoursInDay = 17;\n let quarter = 3;\n let month = 9;\n</script>\n\n<div\n role=\"status\"\n aria-busy=\"true\"\n aria-label=\"Loading content\"\n class=\"skeleton-wrapper\"\n>\n <span class=\"sr-only\">Loading...</span>\n{#if type === 'monthly'}\n <div class=\"skeleton-animation p-7 rounded-lg skeleton-bar\" aria-hidden=\"true\"></div>\n <div class=\"skeleton-monthly\" aria-hidden=\"true\">\n {#each Array(boxes) as _, index (index)}\n <div class=\"skeleton-animation\">\n <div class=\"w-full h-40 rounded-md skeleton-bar\"></div>\n </div>\n {/each}\n </div>\n{:else if type === 'daily'}\n <div class=\"skeleton-animation\">\n <div class=\"flex\">\n <div class=\"p-5 w-[10%] mb-2\"></div>\n <div class=\"p-5 rounded-md w-[30%] mb-2 skeleton-bar\"></div>\n </div>\n <div class=\"p-5 rounded-md w-full mb-2 skeleton-bar\"></div>\n <div class=\"flex gap-2\">\n <div class=\"flex flex-col gap-2 w-[15%]\">\n {#each Array(hoursInDay) as _, index (index)}\n <div class=\"w-full h-10 rounded-lg skeleton-bar\"></div>\n {/each}\n </div>\n <div class=\"flex flex-col gap-2 w-[85%]\">\n {#each Array(hoursInDay) as _, index (index)}\n <div class=\"w-full h-10 rounded-lg skeleton-bar\"></div>\n {/each}\n </div>\n </div>\n </div>\n{:else if type === 'weekly'}\n <div class=\"skeleton-animation\">\n <div class=\"p-6 rounded-md w-full mb-3 skeleton-bar\"></div>\n <div class=\"flex gap-2\">\n <div class=\"flex flex-col gap-2 w-[15%]\">\n {#each Array(hoursInDay) as _, index (index)}\n <div class=\"w-full h-10 rounded-lg skeleton-bar\"></div>\n {/each}\n </div>\n <div class=\"flex flex-col gap-2 w-[85%]\">\n {#each Array(hoursInDay) as _, index (index)}\n <div class=\"w-full h-10 rounded-lg skeleton-bar\"></div>\n {/each}\n </div>\n </div>\n </div>\n{:else if type === 'quarter'}\n <div class=\"skeleton-animation\">\n <div class=\"grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-2 lg:gap-4\">\n {#each Array(quarter) as _, index (index)}\n <div>\n <div class=\"w-full h-80 rounded-md skeleton-bar\"></div>\n </div>\n {/each}\n </div>\n </div>\n{:else if type === 'yearly'}\n <div class=\"skeleton-animation\">\n <div class=\"grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-2 lg:gap-4\">\n {#each Array(month) as _, index (index)}\n <div>\n <div class=\"w-full h-64 rounded-md skeleton-bar\"></div>\n </div>\n {/each}\n </div>\n </div>\n{:else if type === 'list'}\n <!-- List view skeleton -->\n <div class=\"skeleton-animation skeleton-list\">\n {#each Array(5) as _, index (index)}\n <div class=\"skeleton-list-row\">\n <!-- Date column -->\n <div class=\"skeleton-date-col\">\n <div class=\"skeleton-bar w-8 h-3 rounded mb-1\"></div>\n <div class=\"skeleton-bar w-6 h-6 rounded\"></div>\n <div class=\"skeleton-bar w-8 h-3 rounded mt-1\"></div>\n </div>\n <!-- Event row -->\n <div class=\"skeleton-event-row\">\n <div class=\"skeleton-bar skeleton-event-image\"></div>\n <div class=\"skeleton-event-details\">\n <div class=\"skeleton-bar w-3/4 h-5 rounded mb-2\"></div>\n <div class=\"skeleton-bar w-1/4 h-4 rounded\"></div>\n </div>\n </div>\n </div>\n {/each}\n </div>\n{:else if type === 'gallery'}\n <!-- Gallery view skeleton -->\n <div class=\"skeleton-animation skeleton-gallery\">\n {#each Array(8) as _, index (index)}\n <div class=\"skeleton-gallery-card\">\n <div class=\"skeleton-bar skeleton-gallery-image\"></div>\n <div class=\"skeleton-gallery-content\">\n <div class=\"skeleton-bar w-full h-5 rounded mb-2\"></div>\n <div class=\"skeleton-bar w-2/3 h-4 rounded\"></div>\n </div>\n </div>\n {/each}\n </div>\n{:else if type === 'event'}\n <!-- Event page skeleton -->\n <div class=\"skeleton-animation skeleton-event\">\n <div class=\"skeleton-event-layout\">\n <!-- Main content -->\n <div class=\"skeleton-event-main\">\n <!-- Hero image -->\n <div class=\"skeleton-bar skeleton-event-hero\"></div>\n <!-- Event header card -->\n <div class=\"skeleton-event-header\">\n <div class=\"skeleton-bar w-3/4 h-8 rounded mb-3\"></div>\n <div class=\"skeleton-bar w-1/2 h-4 rounded mb-6\"></div>\n <!-- Meta rows -->\n <div class=\"skeleton-event-meta\">\n <div class=\"skeleton-bar w-48 h-5 rounded mb-3\"></div>\n <div class=\"skeleton-bar w-40 h-5 rounded mb-3\"></div>\n <div class=\"skeleton-bar w-56 h-5 rounded\"></div>\n </div>\n </div>\n <!-- About section -->\n <div class=\"skeleton-event-section\">\n <div class=\"skeleton-bar w-24 h-6 rounded mb-4\"></div>\n <div class=\"skeleton-bar w-full h-4 rounded mb-2\"></div>\n <div class=\"skeleton-bar w-full h-4 rounded mb-2\"></div>\n <div class=\"skeleton-bar w-2/3 h-4 rounded\"></div>\n </div>\n </div>\n <!-- Sidebar -->\n <div class=\"skeleton-event-sidebar\">\n <div class=\"skeleton-event-price-card\">\n <div class=\"skeleton-bar w-20 h-8 rounded mb-4\"></div>\n <div class=\"skeleton-bar w-full h-12 rounded\"></div>\n </div>\n </div>\n </div>\n </div>\n{:else if type === 'tickets'}\n <!-- Tickets page skeleton -->\n <div class=\"skeleton-animation skeleton-tickets\">\n <!-- Event info header -->\n <div class=\"skeleton-tickets-header\">\n <div class=\"skeleton-bar w-16 h-16 rounded mr-4\"></div>\n <div class=\"flex-1\">\n <div class=\"skeleton-bar w-2/3 h-6 rounded mb-2\"></div>\n <div class=\"skeleton-bar w-1/2 h-4 rounded\"></div>\n </div>\n </div>\n <!-- Ticket groups -->\n {#each Array(3) as _, index (index)}\n <div class=\"skeleton-ticket-block\">\n <div class=\"skeleton-bar w-1/3 h-6 rounded mb-2\"></div>\n <div class=\"skeleton-bar w-1/4 h-5 rounded mb-3\"></div>\n <div class=\"skeleton-bar w-full h-4 rounded\"></div>\n </div>\n {/each}\n <!-- Continue button -->\n <div class=\"skeleton-bar w-full h-12 rounded mt-6\"></div>\n </div>\n{:else if type === 'checkout'}\n <!-- Checkout page skeleton -->\n <div class=\"skeleton-animation skeleton-checkout\">\n <div class=\"skeleton-checkout-layout\">\n <!-- Left column - form -->\n <div class=\"skeleton-checkout-form\">\n <div class=\"skeleton-bar w-40 h-7 rounded mb-6\"></div>\n <!-- Form fields -->\n {#each Array(4) as _, index (index)}\n <div class=\"mb-4\">\n <div class=\"skeleton-bar w-24 h-4 rounded mb-2\"></div>\n <div class=\"skeleton-bar w-full h-11 rounded\"></div>\n </div>\n {/each}\n <!-- Payment section -->\n <div class=\"skeleton-bar w-32 h-7 rounded mb-4 mt-8\"></div>\n <div class=\"skeleton-bar w-full h-40 rounded\"></div>\n </div>\n <!-- Right column - order summary -->\n <div class=\"skeleton-checkout-summary\">\n <div class=\"skeleton-bar w-32 h-6 rounded mb-4\"></div>\n <div class=\"skeleton-bar w-full h-4 rounded mb-2\"></div>\n <div class=\"skeleton-bar w-full h-4 rounded mb-2\"></div>\n <div class=\"skeleton-bar w-full h-4 rounded mb-4\"></div>\n <div class=\"skeleton-bar w-full h-1 rounded mb-4\"></div>\n <div class=\"skeleton-bar w-full h-6 rounded\"></div>\n </div>\n </div>\n </div>\n{:else}\n <!-- Default calendar skeleton -->\n <div class=\"skeleton-animation\" aria-hidden=\"true\">\n <!-- Calendar grid skeleton -->\n <div class=\"skeleton-calendar-grid\">\n <!-- Day headers -->\n {#each Array(7) as _, index (index)}\n <div class=\"skeleton-day-header skeleton-bar\"></div>\n {/each}\n <!-- Day cells -->\n {#each Array(35) as _, index (index)}\n <div class=\"skeleton-day-cell\">\n <div class=\"skeleton-bar w-6 h-6 rounded-full mb-2\"></div>\n <div class=\"skeleton-bar w-full h-16 rounded-md hidden sm:block\"></div>\n </div>\n {/each}\n </div>\n </div>\n{/if}\n</div>\n\n<style>\n @reference \"../../app.css\";\n\n /* Theme-responsive skeleton colors */\n .skeleton-bar {\n @apply bg-gray-200 dark:bg-gray-700 rounded animate-pulse;\n }\n\n .skeleton-monthly {\n display: grid;\n grid-template-columns: repeat(7, minmax(100px, 1fr));\n grid-gap: 1px;\n @apply pt-1;\n }\n\n .skeleton-animation {\n @apply animate-pulse;\n }\n\n /* Calendar skeleton grid */\n .skeleton-calendar-grid {\n display: grid;\n grid-template-columns: repeat(7, minmax(40px, 1fr));\n @apply gap-px;\n }\n\n @media (min-width: 640px) {\n .skeleton-calendar-grid {\n grid-template-columns: repeat(7, minmax(100px, 1fr));\n }\n }\n\n .skeleton-day-header {\n @apply h-8 rounded;\n }\n\n .skeleton-day-cell {\n @apply min-h-14 p-2 flex flex-col items-center;\n }\n\n @media (min-width: 640px) {\n .skeleton-day-cell {\n @apply min-h-32 p-3;\n }\n }\n\n /* List view skeleton */\n .skeleton-list {\n @apply flex flex-col;\n }\n\n .skeleton-list-row {\n @apply flex border-b border-gray-200 dark:border-gray-700;\n }\n\n .skeleton-date-col {\n @apply w-16 min-w-16 py-4 px-2.5 flex flex-col items-center bg-gray-50 dark:bg-gray-800 border-r border-gray-200 dark:border-gray-700;\n }\n\n .skeleton-event-row {\n @apply flex-1 flex gap-4 p-5 bg-white dark:bg-gray-900;\n }\n\n .skeleton-event-image {\n @apply w-36 h-24 min-w-36 rounded-lg;\n }\n\n .skeleton-event-details {\n @apply flex-1 flex flex-col justify-center;\n }\n\n @media (max-width: 640px) {\n .skeleton-date-col {\n @apply w-12 min-w-12 py-2.5 px-1.5;\n }\n\n .skeleton-event-row {\n @apply p-3 gap-2.5;\n }\n\n .skeleton-event-image {\n @apply w-20 h-16 min-w-20;\n }\n }\n\n /* Gallery view skeleton */\n .skeleton-gallery {\n @apply grid grid-cols-1 gap-4 bg-gray-50 dark:bg-gray-800 p-2;\n }\n\n @media (min-width: 640px) {\n .skeleton-gallery {\n @apply grid-cols-2 p-3;\n }\n }\n\n @media (min-width: 768px) {\n .skeleton-gallery {\n @apply grid-cols-3 gap-5 p-4;\n }\n }\n\n @media (min-width: 1024px) {\n .skeleton-gallery {\n @apply grid-cols-4 gap-6 p-5;\n }\n }\n\n .skeleton-gallery-card {\n @apply rounded-lg border bg-white dark:bg-gray-900 border-gray-200 dark:border-gray-700 overflow-hidden;\n }\n\n .skeleton-gallery-image {\n @apply w-full h-48;\n }\n\n @media (max-width: 639px) {\n .skeleton-gallery-image {\n @apply h-56;\n }\n }\n\n @media (min-width: 1024px) {\n .skeleton-gallery-image {\n @apply h-44;\n }\n }\n\n .skeleton-gallery-content {\n @apply p-3;\n }\n\n @media (min-width: 640px) {\n .skeleton-gallery-content {\n @apply p-3.5;\n }\n }\n\n /* Event page skeleton */\n .skeleton-event {\n @apply min-h-screen bg-gray-50 dark:bg-gray-800 p-5;\n }\n\n .skeleton-event-layout {\n @apply flex flex-col gap-6 max-w-7xl mx-auto;\n }\n\n @media (min-width: 1024px) {\n .skeleton-event-layout {\n @apply flex-row;\n }\n\n .skeleton-event-main {\n @apply flex-1;\n }\n\n .skeleton-event-sidebar {\n @apply w-80;\n }\n }\n\n .skeleton-event-hero {\n @apply w-full h-72 rounded-lg mb-5;\n }\n\n @media (min-width: 640px) {\n .skeleton-event-hero {\n @apply h-96;\n }\n }\n\n .skeleton-event-header {\n @apply rounded-lg border bg-white dark:bg-gray-900 border-gray-200 dark:border-gray-700 p-6 mb-5;\n }\n\n .skeleton-event-meta {\n @apply mt-4;\n }\n\n .skeleton-event-section {\n @apply rounded-lg border bg-white dark:bg-gray-900 border-gray-200 dark:border-gray-700 p-6;\n }\n\n .skeleton-event-price-card {\n @apply rounded-lg border bg-white dark:bg-gray-900 border-gray-200 dark:border-gray-700 p-6 sticky top-5;\n }\n\n /* Tickets page skeleton */\n .skeleton-tickets {\n @apply max-w-xl mx-auto p-5;\n }\n\n .skeleton-tickets-header {\n @apply flex items-center p-4 rounded-lg border bg-white dark:bg-gray-900 border-gray-200 dark:border-gray-700 mb-6;\n }\n\n .skeleton-ticket-block {\n @apply rounded-lg border bg-white dark:bg-gray-900 border-gray-200 dark:border-gray-700 p-5 mb-4;\n }\n\n /* Checkout page skeleton */\n .skeleton-checkout {\n @apply max-w-4xl mx-auto p-5;\n }\n\n .skeleton-checkout-layout {\n @apply flex flex-col gap-6;\n }\n\n @media (min-width: 768px) {\n .skeleton-checkout-layout {\n @apply flex-row;\n }\n\n .skeleton-checkout-form {\n @apply flex-1;\n }\n\n .skeleton-checkout-summary {\n @apply w-80;\n }\n }\n\n .skeleton-checkout-form {\n @apply rounded-lg border bg-white dark:bg-gray-900 border-gray-200 dark:border-gray-700 p-6;\n }\n\n .skeleton-checkout-summary {\n @apply rounded-lg border bg-white dark:bg-gray-900 border-gray-200 dark:border-gray-700 p-6 h-fit;\n }\n\n /* Screen reader only text */\n .sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n white-space: nowrap;\n border: 0;\n }\n</style>\n","/**\n * Centralized logger utility for MicDrop applications\n * Can be disabled in production or configured for different log levels\n */\n\n/**\n * @typedef {'debug' | 'info' | 'warn' | 'error'} LogLevel\n */\n\n/**\n * @typedef {Object} LoggerConfig\n * @property {boolean} enabled\n * @property {LogLevel} level\n * @property {string} prefix\n */\n\n/** @type {Record<LogLevel, number>} */\nconst LOG_LEVELS = {\n debug: 0,\n info: 1,\n warn: 2,\n error: 3,\n};\n\n/** @type {LoggerConfig} */\nlet config = {\n enabled: typeof window !== 'undefined' && import.meta.env?.DEV !== false,\n level: 'debug',\n prefix: '[MicDrop]',\n};\n\n/**\n * Configure the logger\n * @param {Partial<LoggerConfig>} options\n */\nexport function configureLogger(options) {\n config = { ...config, ...options };\n}\n\n/**\n * Check if a log level should be logged\n * @param {LogLevel} level\n * @returns {boolean}\n */\nfunction shouldLog(level) {\n return config.enabled && LOG_LEVELS[level] >= LOG_LEVELS[config.level];\n}\n\n/**\n * Format a log message\n * @param {LogLevel} level\n * @param {string} message\n * @returns {string}\n */\nfunction formatMessage(level, message) {\n return `${config.prefix} [${level.toUpperCase()}] ${message}`;\n}\n\nexport const logger = {\n /**\n * Log debug message\n * @param {string} message\n * @param {...unknown} args\n */\n debug: (message, ...args) => {\n if (shouldLog('debug')) {\n // eslint-disable-next-line no-console\n console.debug(formatMessage('debug', message), ...args);\n }\n },\n\n /**\n * Log info message\n * @param {string} message\n * @param {...unknown} args\n */\n info: (message, ...args) => {\n if (shouldLog('info')) {\n // eslint-disable-next-line no-console\n console.info(formatMessage('info', message), ...args);\n }\n },\n\n /**\n * Log warning message\n * @param {string} message\n * @param {...unknown} args\n */\n warn: (message, ...args) => {\n if (shouldLog('warn')) {\n console.warn(formatMessage('warn', message), ...args);\n }\n },\n\n /**\n * Log error message\n * @param {string} message\n * @param {...unknown} args\n */\n error: (message, ...args) => {\n if (shouldLog('error')) {\n console.error(formatMessage('error', message), ...args);\n }\n },\n};\n\nexport default logger;\n","import { logger } from '$lib/utils/logger.js';\n\nconst API_BASE_URL = \"https://get-micdrop.com\";\nconst PUBLIC_BASE_URL = `${API_BASE_URL}/api/v2/public`;\nconst ORDERS_V2_BASE_URL = `${API_BASE_URL}/api/orders/v2/public`;\n\n// Note: Stripe publishable key is now fetched dynamically from the payment intent API response\n// This ensures third-party embeds get the correct key without needing environment variables\n\n/**\n * Create a payment intent for the cart\n * @param {string} cartId - The cart/order UUID\n * @param {Object} quantities - Map of ticketId -> quantity\n * @returns {Promise<{clientSecret: string, ...} | null>}\n */\nexport async function createPaymentIntent(cartId, quantities) {\n try {\n // Get IP address\n const ipRes = await fetch('https://api.ipify.org?format=json');\n const ipData = await ipRes.json();\n const ip = ipData.ip;\n\n const res = await fetch(\n `${PUBLIC_BASE_URL}/orders/${cartId}/payment-intent`,\n {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n credentials: 'include',\n body: JSON.stringify({\n IP: ip,\n productQuantities: quantities,\n }),\n }\n );\n\n if (!res.ok) {\n const errorData = await res.json().catch(() => ({}));\n logger.error('Payment intent creation failed:', errorData);\n throw new Error(errorData.error || 'Failed to create payment intent');\n }\n\n const data = await res.json();\n logger.debug('create payment intent API response:', data);\n return data;\n } catch (err) {\n logger.error('createPaymentIntent error:', err);\n return null;\n }\n}\n\n// Map human-readable timezone strings to IANA timezone identifiers\nfunction getIANATimezone(tzString) {\n if (!tzString || tzString === 'NaN') return 'America/Los_Angeles'; // Default to LA\n\n const tzMap = {\n 'UTC': 'UTC',\n 'California USA': 'America/Los_Angeles',\n 'California': 'America/Los_Angeles',\n 'Los Angeles': 'America/Los_Angeles',\n 'New York': 'America/New_York',\n 'New York USA': 'America/New_York',\n 'Chicago': 'America/Chicago',\n 'Chicago USA': 'America/Chicago',\n 'Denver': 'America/Denver',\n 'Denver USA': 'America/Denver',\n 'Phoenix': 'America/Phoenix',\n 'Phoenix USA': 'America/Phoenix',\n };\n\n // Check direct match first\n if (tzMap[tzString]) return tzMap[tzString];\n\n // Check if it's already an IANA timezone\n try {\n Intl.DateTimeFormat(undefined, { timeZone: tzString });\n return tzString;\n } catch (_e) {\n // Not a valid IANA timezone, default to LA\n return 'America/Los_Angeles';\n }\n}\n\nexport async function fetchAllVenues(orgId) {\n try {\n if (!orgId) {\n logger.warn(\"fetchAllVenues called without orgId\");\n return [];\n }\n\n const response = await fetch(`${PUBLIC_BASE_URL}/venues/organization/${orgId}`);\n\n if (!response.ok) {\n logger.error(`Failed to fetch venues: ${response.status} ${response.statusText}`);\n return [];\n }\n\n const venues = await response.json();\n logger.debug(\"Venues:\", venues);\n // Ensure we always return an array, even if API returns null/undefined\n return Array.isArray(venues) ? venues : [];\n } catch (error) {\n logger.error(\"Error fetching venues:\", error);\n return [];\n }\n}\n\nexport async function fetchVenueEvents(venueId) {\n try {\n if (!venueId) {\n logger.warn(\"fetchVenueEvents called without venueId\");\n return [];\n }\n\n const response = await fetch(`${PUBLIC_BASE_URL}/events/venue/${venueId}`);\n\n if (!response.ok) {\n logger.error(`Failed to fetch events: ${response.status} ${response.statusText}`);\n return [];\n }\n\n const events = await response.json();\n // Ensure we always return an array, even if API returns null/undefined\n return Array.isArray(events) ? events : [];\n } catch (error) {\n // Network errors, CORS issues, etc. - return empty array instead of throwing\n logger.error(\"Error fetching events:\", error);\n return [];\n }\n}\n\n/**\n * Fetch events for a specific month (paginated API)\n * @param {number|string} venueId - Venue ID\n * @param {number} year - Year (e.g., 2025)\n * @param {number} month - Month (1-12, NOT 0-indexed)\n * @returns {Promise<{events: Array, pagination: {hasPrevMonth: boolean, hasNextMonth: boolean, prevMonth: {year, month}, nextMonth: {year, month}}}>}\n */\nexport async function getMonthEvents(venueId, year, month) {\n try {\n if (!venueId) {\n logger.warn(\"getMonthEvents called without venueId\");\n return { events: [], pagination: null };\n }\n\n const response = await fetch(`${PUBLIC_BASE_URL}/events/venue/${venueId}/month/${year}/${month}`);\n\n if (!response.ok) {\n logger.error(`Failed to fetch month events: ${response.status} ${response.statusText}`);\n return { events: [], pagination: null };\n }\n\n const data = await response.json();\n return {\n events: Array.isArray(data.events) ? data.events : [],\n pagination: data.pagination || null,\n year: data.year,\n month: data.month\n };\n } catch (error) {\n logger.error(\"Error fetching month events:\", error);\n return { events: [], pagination: null };\n }\n}\n\n/**\n * Fetch events for a specific month at org level (all venues under an org)\n * @param {number|string} orgId - Organization ID (userID of org owner)\n * @param {number} year - Year (e.g., 2025)\n * @param {number} month - Month (1-12, NOT 0-indexed)\n * @returns {Promise<{events: Array, pagination: object}>}\n */\nexport async function getOrgMonthEvents(orgId, year, month) {\n try {\n if (!orgId) {\n logger.warn(\"getOrgMonthEvents called without orgId\");\n return { events: [], pagination: null };\n }\n\n const response = await fetch(`${PUBLIC_BASE_URL}/events/organization/${orgId}/month/${year}/${month}`);\n\n if (!response.ok) {\n logger.error(`Failed to fetch org month events: ${response.status} ${response.statusText}`);\n return { events: [], pagination: null };\n }\n\n const data = await response.json();\n return {\n events: Array.isArray(data.events) ? data.events : [],\n pagination: data.pagination || null,\n year: data.year,\n month: data.month\n };\n } catch (error) {\n logger.error(\"Error fetching org month events:\", error);\n return { events: [], pagination: null };\n }\n}\n\nexport function transformEventData(apiEvent) {\n // Get the venue's timezone (API returns strings like \"California USA\" or \"UTC\")\n const venueTimezone = getIANATimezone(apiEvent.timeZone);\n\n // Extract date from startDateTime in the venue's timezone\n // API returns UTC like \"2025-11-30T20:00:00Z\" which should display in venue TZ\n let startDate = '';\n if (apiEvent.startDateTime) {\n const dt = new Date(apiEvent.startDateTime);\n // Format date in the venue's timezone\n const dateInVenueTZ = dt.toLocaleDateString('en-CA', {\n timeZone: venueTimezone,\n year: 'numeric',\n month: '2-digit',\n day: '2-digit'\n });\n // en-CA gives YYYY-MM-DD format\n startDate = dateInVenueTZ;\n }\n\n // Handle image URLs - prepend DigitalOcean Spaces CDN URL for relative paths\n let imageUrl = apiEvent.image || apiEvent.imageUrl || apiEvent.image_url || '';\n if (imageUrl && imageUrl.startsWith('/')) {\n imageUrl = `https://moxy.sfo3.digitaloceanspaces.com${imageUrl}`;\n }\n\n // Calculate scarcity data from available tickets if present\n // The API may include availableTickets in the list response\n const tickets = apiEvent.availableTickets || [];\n const publicTickets = tickets.filter(t => t.salesChannel !== 2); // Exclude \"At the door only\"\n\n let totalRemaining = 0;\n let totalCapacity = 0;\n let isSoldOut = false;\n\n if (publicTickets.length > 0) {\n for (const ticket of publicTickets) {\n const remaining = ticket.remainingCapacity ?? ticket.quantityRemaining ?? ticket.quantity ?? 0;\n const capacity = ticket.totalCapacity ?? ticket.quantity ?? remaining;\n totalRemaining += remaining;\n totalCapacity += capacity;\n }\n // Check if all tickets are sold out\n isSoldOut = totalRemaining === 0;\n }\n\n const transformed = {\n id: apiEvent.id,\n name: apiEvent.title || apiEvent.name || '',\n date: startDate || apiEvent.date || apiEvent.startDate || apiEvent.eventDate || '',\n image: imageUrl,\n status: apiEvent.status || 'On Sale',\n timeline: formatEventTime(apiEvent, venueTimezone),\n description: apiEvent.description || apiEvent.eventSummary || '',\n venueId: apiEvent.venueId || apiEvent.venue_id,\n timeZone: venueTimezone,\n // Series info for grouping recurring events\n eventSeriesId: apiEvent.eventSeriesId || null,\n // Keep raw startDateTime for sorting\n startDateTime: apiEvent.startDateTime || null,\n // Scarcity data for browse views\n ticketsRemaining: totalRemaining,\n ticketsTotal: totalCapacity,\n isSoldOut: isSoldOut,\n // Additional fields for BrowseEvent adapter\n slug: apiEvent.slug || '',\n endDateTime: apiEvent.endDateTime || null,\n // Venue info for browse views\n venueName: apiEvent.venue?.name || apiEvent.venue?.googleLocationNameCache || '',\n venueAddress: apiEvent.venue?.address || apiEvent.venue?.googleLocationNameCache || '',\n };\n\n return transformed;\n}\n\nfunction formatEventTime(event, venueTimezone = 'America/Los_Angeles') {\n // Format time from API datetime strings in the venue's timezone\n const formatTime = (dateTimeStr) => {\n if (!dateTimeStr) return '';\n try {\n const date = new Date(dateTimeStr);\n return date.toLocaleTimeString('en-US', {\n timeZone: venueTimezone,\n hour: 'numeric',\n minute: '2-digit',\n hour12: true\n });\n } catch (_e) {\n return '';\n }\n };\n\n const startTime = formatTime(event.startDateTime);\n const endTime = formatTime(event.endDateTime);\n\n if (startTime && endTime) {\n return `${startTime} - ${endTime}`;\n }\n if (startTime) {\n return startTime;\n }\n\n // Fallback to old field names if new ones don't exist\n if (event.startTime && event.endTime) {\n return `${event.startTime} - ${event.endTime}`;\n }\n if (event.startTime) {\n return event.startTime;\n }\n\n return '';\n}\n\nexport async function fetchEventDetails(eventId, customFetch = fetch) {\n try {\n const response = await customFetch(`${PUBLIC_BASE_URL}/events/${eventId}`);\n\n if (!response.ok) {\n throw new Error(`Failed to fetch event details: ${response.status}`);\n }\n\n const event = await response.json();\n return event;\n } catch (error) {\n logger.error(\"Error fetching event details:\", error);\n throw error;\n }\n}\n\nexport async function fetchEventTickets(eventId) {\n try {\n const response = await fetch(`${PUBLIC_BASE_URL}/tickets/event/${eventId}`);\n\n if (!response.ok) {\n throw new Error(`Failed to fetch tickets: ${response.status}`);\n }\n\n const tickets = await response.json();\n return Array.isArray(tickets) ? tickets : [];\n } catch (error) {\n logger.error(\"Error fetching tickets:\", error);\n throw error;\n }\n}\n\n/**\n * Validate a promo code for an event via the public API\n * @param {string} eventId - The event ID\n * @param {string} code - The promo code to validate\n * @returns {Promise<{valid: boolean, revealHiddenTickets?: boolean, revealTicketIds?: number[], provideDiscount?: boolean, discountType?: string, amount?: number}>}\n */\nexport async function validatePromoCode(eventId, code) {\n try {\n // API uses GET with code in URL path: /validatePromoCode/{eventId}/{code}\n const encodedCode = encodeURIComponent(code);\n const response = await fetch(`${PUBLIC_BASE_URL}/promo-codes/validate/${eventId}/${encodedCode}`);\n\n if (!response.ok) {\n // Invalid code or server error\n return { valid: false };\n }\n\n const result = await response.json();\n return result;\n } catch (error) {\n logger.error(\"Error validating promo code:\", error);\n return { valid: false };\n }\n}\n\n/**\n * Check if promo codes are available for an event\n * @param {string} eventId - The event ID\n * @returns {Promise<boolean>} - Whether promo codes exist for this event\n */\nexport async function hasPromoCodes(eventId) {\n try {\n const response = await fetch(`${PUBLIC_BASE_URL}/promo-codes/check/${eventId}`);\n\n if (!response.ok) {\n // If endpoint doesn't exist or errors, default to showing the input\n return true;\n }\n\n const result = await response.json();\n return result.hasPromoCodes === true;\n } catch (error) {\n logger.error(\"Error checking promo codes availability:\", error);\n // Default to showing promo input if we can't check\n return true;\n }\n}\n\n/**\n * Extend the checkout session by 15 minutes\n * @param {string} orderUuid - The order UUID\n * @returns {Promise<{success: boolean, newExpiryTime?: string, remainingExtensions?: number, error?: string}>}\n */\nexport async function extendCheckoutSession(orderUuid) {\n try {\n const response = await fetch(`${PUBLIC_BASE_URL}/orders/extend-session`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({ orderUuid }),\n });\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({}));\n return {\n success: false,\n error: errorData.error || 'Failed to extend session'\n };\n }\n\n const result = await response.json();\n return {\n success: true,\n newExpiryTime: result.newExpiryTime,\n remainingExtensions: result.remainingExtensions,\n };\n } catch (error) {\n logger.error(\"Error extending checkout session:\", error);\n return { success: false, error: 'Network error extending session' };\n }\n}\n\n/**\n * Get current session status including expiry time\n * @param {string} orderUuid - The order UUID\n * @returns {Promise<{expiresAt?: string, extensionCount?: number, remainingExtensions?: number, canExtend?: boolean, error?: string}>}\n */\nexport async function getSessionStatus(orderUuid) {\n try {\n const response = await fetch(`${PUBLIC_BASE_URL}/orders/session/${orderUuid}`);\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({}));\n return { error: errorData.error || 'No active session found' };\n }\n\n const result = await response.json();\n return {\n expiresAt: result.expiresAt,\n extensionCount: result.extensionCount,\n remainingExtensions: result.remainingExtensions,\n canExtend: result.canExtend,\n reservationCount: result.reservationCount,\n };\n } catch (error) {\n logger.error(\"Error getting session status:\", error);\n return { error: 'Network error getting session status' };\n }\n}\n\n/**\n * Complete reservation after successful payment\n * @param {string} orderUuid - The order UUID\n * @returns {Promise<{success: boolean, message?: string, error?: string}>}\n */\nexport async function completeReservation(orderUuid) {\n try {\n const response = await fetch(`${PUBLIC_BASE_URL}/orders/complete/${orderUuid}`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n });\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({}));\n return {\n success: false,\n error: errorData.error || 'Failed to complete reservation'\n };\n }\n\n const result = await response.json();\n return {\n success: true,\n message: result.message,\n };\n } catch (error) {\n logger.error(\"Error completing reservation:\", error);\n return { success: false, error: 'Network error completing reservation' };\n }\n}\n\n/**\n * Cancel reservation and release tickets back to inventory\n * @param {string} orderUuid - The order UUID\n * @returns {Promise<{success: boolean, message?: string, error?: string}>}\n */\nexport async function cancelReservation(orderUuid) {\n try {\n const response = await fetch(`${PUBLIC_BASE_URL}/orders/cancel/${orderUuid}`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n });\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({}));\n return {\n success: false,\n error: errorData.error || 'Failed to cancel reservation'\n };\n }\n\n const result = await response.json();\n return {\n success: true,\n message: result.message,\n };\n } catch (error) {\n logger.error(\"Error cancelling reservation:\", error);\n return { success: false, error: 'Network error cancelling reservation' };\n }\n}\n\n/**\n * Fetch performers for a public event\n * Uses the new public API endpoint that returns pre-resolved avatar URLs\n * @param {string|number} eventId - The event ID\n * @returns {Promise<{performers: Array<{id: number, displayName: string, avatar: string, order: number}>, showPerformers: boolean}>}\n */\nexport async function fetchEventPerformers(eventId) {\n try {\n if (!eventId) {\n logger.warn(\"fetchEventPerformers called without eventId\");\n return { performers: [], showPerformers: false };\n }\n\n const response = await fetch(`${PUBLIC_BASE_URL}/events/${eventId}/performers`);\n\n if (!response.ok) {\n logger.error(`Failed to fetch performers: ${response.status} ${response.statusText}`);\n return { performers: [], showPerformers: false };\n }\n\n const data = await response.json();\n return {\n performers: Array.isArray(data.performers) ? data.performers : [],\n showPerformers: data.showPerformers === true,\n };\n } catch (error) {\n logger.error(\"Error fetching event performers:\", error);\n return { performers: [], showPerformers: false };\n }\n}\n\n/**\n * Get series occurrences for date selector\n * @param {number} eventSeriesId - The event series ID\n * @returns {Promise<{seriesId?: number, seriesName?: string, occurrences?: Array, error?: string}>}\n */\nexport async function getSeriesOccurrences(eventSeriesId) {\n try {\n const response = await fetch(`${PUBLIC_BASE_URL}/series/${eventSeriesId}/occurrences`);\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({}));\n return { error: errorData.error || 'Event series not found' };\n }\n\n const result = await response.json();\n return {\n seriesId: result.seriesId,\n seriesName: result.seriesName,\n occurrences: result.occurrences || [],\n };\n } catch (error) {\n logger.error(\"Error fetching series occurrences:\", error);\n return { error: 'Network error fetching series occurrences' };\n }\n}\n\n/**\n * Check if a password is correct for a password-protected event\n * @param {string} eventId - The event ID\n * @param {string} password - The password attempt\n * @returns {Promise<{valid: boolean}>}\n */\nexport async function checkEventPassword(eventId, password) {\n try {\n const encodedPassword = encodeURIComponent(password);\n const response = await fetch(`${PUBLIC_BASE_URL}/events/${eventId}/check-password/${encodedPassword}`);\n\n if (!response.ok) {\n return { valid: false };\n }\n\n const result = await response.json();\n // API may return boolean directly or object with valid property\n if (typeof result === 'boolean') {\n return { valid: result };\n }\n return { valid: result.valid === true || result === true };\n } catch (error) {\n logger.error(\"Error checking event password:\", error);\n return { valid: false };\n }\n}\n\nexport async function testNetworkConnection(orgId = null, venueId = null) {\n const results = {\n organization: false,\n venue: false,\n timestamp: new Date().toISOString()\n };\n\n if (orgId) {\n try {\n const orgResponse = await fetch(`${PUBLIC_BASE_URL}/venues/organization/${orgId}`, {\n method: 'GET',\n signal: AbortSignal.timeout(5000)\n });\n results.organization = orgResponse.ok;\n } catch (error) {\n logger.error(\"Organization API test failed:\", error);\n results.organization = false;\n }\n }\n\n if (venueId) {\n try {\n const venueResponse = await fetch(`${PUBLIC_BASE_URL}/events/venue/${venueId}`, {\n method: 'GET',\n signal: AbortSignal.timeout(5000)\n });\n results.venue = venueResponse.ok;\n } catch (error) {\n logger.error(\"Venue API test failed:\", error);\n results.venue = false;\n }\n }\n\n return results;\n}\n\n/**\n * Compute CTA button state for an event based on its tickets.\n * Single source of truth for CTA text/disabled/reason across all surfaces.\n *\n * @param {Object} event - The event object with startDateTime, endDateTime\n * @param {Array} tickets - Array of ticket objects\n * @param {Object} [options] - Context-specific overrides\n * @param {boolean} [options.cancelled] - Event is cancelled\n * @param {boolean} [options.isRegistration] - ticketType === 1 (\"Reserve a spot\")\n * @param {boolean} [options.waitlistEnabled] - Show \"Join Waitlist\" when sold out\n * @returns {{text: string, disabled: boolean, reason: string}}\n */\nexport function computeCtaState(event, tickets, options = {}) {\n const { cancelled = false, isRegistration = false, waitlistEnabled = false } = options;\n const now = new Date();\n\n // Cancelled takes top priority\n if (cancelled) {\n return { text: 'Cancelled', disabled: true, reason: 'cancelled' };\n }\n\n // Check if event is in the past\n const eventEnd = event.endDateTime || event.startDateTime;\n if (eventEnd && new Date(eventEnd) < now) {\n return { text: 'Sales ended', disabled: true, reason: 'event_past' };\n }\n\n // Filter to public tickets (exclude \"At the door only\" - salesChannel = 2)\n const publicTickets = (tickets || []).filter(t => t.salesChannel !== 2);\n\n // No public tickets available\n if (publicTickets.length === 0) {\n return { text: 'No tickets available', disabled: true, reason: 'no_tickets' };\n }\n\n // Check ticket statuses\n let hasPurchasable = false;\n let allSoldOut = true;\n let _allSalesEnded = true;\n let allComingSoon = true;\n let earliestSalesStart = null;\n\n for (const ticket of publicTickets) {\n const salesBegin = ticket.salesBegin || ticket.salesStart || ticket.saleBegin || ticket.onSaleStart;\n const salesEnd = ticket.salesEnd || ticket.saleEnd || ticket.onSaleEnd;\n const remaining = ticket.remainingCapacity ?? ticket.quantityRemaining ?? ticket.quantity;\n const isSoldOut = ticket.soldOut || (remaining !== null && remaining !== undefined && remaining <= 0);\n\n const isScheduled = salesBegin && new Date(salesBegin) > now;\n const hasSalesEnded = salesEnd && new Date(salesEnd) < now;\n const isPurchasable = !isSoldOut && !isScheduled && !hasSalesEnded;\n\n if (isPurchasable) hasPurchasable = true;\n if (!isSoldOut) allSoldOut = false;\n if (!hasSalesEnded) _allSalesEnded = false;\n if (!isScheduled) allComingSoon = false;\n\n if (isScheduled && salesBegin && !isSoldOut && !hasSalesEnded) {\n const startDate = new Date(salesBegin);\n if (!earliestSalesStart || startDate < earliestSalesStart) {\n earliestSalesStart = startDate;\n }\n }\n }\n\n if (hasPurchasable) {\n return {\n text: isRegistration ? 'Reserve a spot' : 'Get tickets',\n disabled: false,\n reason: 'available',\n };\n }\n\n if (allComingSoon && earliestSalesStart) {\n const diffMs = earliestSalesStart.getTime() - now.getTime();\n const diffHours = diffMs / (1000 * 60 * 60);\n const diffDays = diffMs / (1000 * 60 * 60 * 24);\n let dateText;\n if (diffHours < 24) {\n dateText = earliestSalesStart.toLocaleTimeString('en-US', { hour: 'numeric', minute: '2-digit', hour12: true });\n } else if (diffDays <= 7) {\n dateText = earliestSalesStart.toLocaleDateString('en-US', { weekday: 'short', hour: 'numeric', minute: '2-digit', hour12: true });\n } else {\n const d = earliestSalesStart.toLocaleDateString('en-US', { month: 'short', day: 'numeric' });\n const t = earliestSalesStart.toLocaleTimeString('en-US', { hour: 'numeric', minute: '2-digit', hour12: true });\n dateText = `${d} ${t}`;\n }\n return { text: `On sale ${dateText}`, disabled: true, reason: 'coming_soon' };\n }\n\n if (allSoldOut) {\n if (waitlistEnabled) {\n return { text: 'Join Waitlist', disabled: false, reason: 'sold_out_waitlist' };\n }\n return { text: 'Sold out', disabled: true, reason: 'sold_out' };\n }\n\n return { text: 'Sales ended', disabled: true, reason: 'sales_ended' };\n}\n\n/**\n * Fetch all occurrences of an event series with CTA state\n * Uses the optimized getSeriesOccurrences API first, falls back to listAllEvents if needed\n * @param {number} eventSeriesId - The event series ID\n * @param {number} venueId - The venue ID to fetch events from (used for fallback)\n * @returns {Promise<Array<{id: number, startDateTime: string, slug: string, name: string, ctaState: {text: string, disabled: boolean, reason: string}}>>}\n */\nexport async function fetchSeriesOccurrences(eventSeriesId, venueId) {\n if (!eventSeriesId || eventSeriesId <= 0) {\n return [];\n }\n\n try {\n // Try the new optimized API first\n const seriesResult = await getSeriesOccurrences(eventSeriesId);\n\n if (!seriesResult.error && seriesResult.occurrences?.length > 0) {\n // Map API response to expected format\n // The API returns: { id, slug, startDateTime, endDateTime, ctaState }\n return seriesResult.occurrences\n .map(occ => ({\n id: occ.id,\n name: occ.name || occ.title || '',\n slug: occ.slug,\n startDateTime: occ.startDateTime,\n endDateTime: occ.endDateTime,\n ctaState: occ.ctaState || computeCtaState(occ, occ.availableTickets || [])\n }))\n .sort((a, b) => new Date(a.startDateTime) - new Date(b.startDateTime));\n }\n\n // Fallback to the old method if new API fails or returns empty\n if (!venueId) {\n return [];\n }\n\n // Use existing listAllEvents API and filter by series ID\n const response = await fetch(`${PUBLIC_BASE_URL}/events/venue/${venueId}`);\n\n if (!response.ok) {\n throw new Error(`Failed to fetch venue events: ${response.status}`);\n }\n\n const allEvents = await response.json();\n\n // Filter events that belong to this series\n const seriesEvents = allEvents.filter(e => e.eventSeriesId === eventSeriesId);\n\n // For each event in the series, fetch full details (tickets are included in availableTickets)\n const occurrences = await Promise.all(\n seriesEvents.map(async (event) => {\n try {\n const eventResponse = await fetch(`${PUBLIC_BASE_URL}/events/${event.id}`);\n if (!eventResponse.ok) return null;\n\n const fullEvent = await eventResponse.json();\n // Tickets are included in the event response as availableTickets\n const tickets = fullEvent.availableTickets || [];\n\n // Compute CTA state based on event and ticket data\n const ctaState = computeCtaState(fullEvent, tickets);\n\n return {\n id: fullEvent.id,\n name: fullEvent.name,\n slug: fullEvent.slug,\n startDateTime: fullEvent.startDateTime,\n endDateTime: fullEvent.endDateTime,\n ctaState\n };\n } catch {\n return null;\n }\n })\n );\n\n // Filter out nulls and sort by start date\n return occurrences\n .filter(Boolean)\n .sort((a, b) => new Date(a.startDateTime) - new Date(b.startDateTime));\n } catch (error) {\n logger.error(\"Error fetching series occurrences:\", error);\n return [];\n }\n}\n\n/**\n * Join the waitlist for a sold-out event\n * @param {number} eventId - The event ID\n * @param {string} email - Customer email\n * @param {string} [phone] - Optional phone number for SMS alerts\n * @param {boolean} [smsOptIn] - Whether customer opts in to SMS alerts\n * @returns {Promise<{success: boolean, position?: number, error?: string}>}\n */\nexport async function joinWaitlist(eventId, email, phone = null, smsOptIn = false) {\n try {\n const body = { email };\n if (phone && smsOptIn) {\n body.phone = phone;\n body.smsOptIn = true;\n }\n\n const res = await fetch(`${PUBLIC_BASE_URL}/events/${eventId}/waitlist`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(body),\n });\n\n if (!res.ok) {\n const errorData = await res.json().catch(() => ({}));\n logger.error('Join waitlist failed:', errorData);\n\n // Map specific errors to user-friendly messages\n const errorMessages = {\n 'waitlist_not_enabled': 'Waitlist is not available for this event',\n 'event_not_found': 'Event not found',\n 'invalid_phone': 'Please enter a valid phone number',\n 'already_purchased': 'You have already purchased tickets for this event',\n 'phone_already_registered': 'This phone number is already on the waitlist',\n };\n\n return {\n success: false,\n error: errorMessages[errorData.error] || 'Failed to join waitlist. Please try again.',\n };\n }\n\n const data = await res.json();\n logger.debug('Join waitlist response:', data);\n\n return {\n success: true,\n position: data.position,\n updated: data.updated, // true if email was already on list and updated\n };\n } catch (err) {\n logger.error('joinWaitlist error:', err);\n return {\n success: false,\n error: 'Network error. Please check your connection and try again.',\n };\n }\n}\n\n/**\n * Get customer's position in the waitlist\n * @param {number} eventId - The event ID\n * @param {string} email - Customer email\n * @returns {Promise<{position: number | null, error?: string}>}\n */\nexport async function getWaitlistPosition(eventId, email) {\n try {\n const res = await fetch(\n `${PUBLIC_BASE_URL}/events/${eventId}/waitlist/position?email=${encodeURIComponent(email)}`\n );\n\n if (!res.ok) {\n if (res.status === 404) {\n return { position: null }; // Not on waitlist\n }\n return { position: null, error: 'Failed to check position' };\n }\n\n const data = await res.json();\n return { position: data.position };\n } catch (err) {\n logger.error('getWaitlistPosition error:', err);\n return { position: null, error: 'Network error' };\n }\n}\n\n/**\n * Apply a gift card to the cart\n * @param {string} cartId - The cart/order UUID\n * @param {string} code - The gift card code\n * @returns {Promise<{valid: boolean, giftCardCode?: string, giftCardAmount?: number, giftCardBalance?: number, paymentType?: string, stripeAmount?: number, orderTotal?: number, requiresStripe?: boolean, error?: string}>}\n */\nexport async function applyGiftCard(cartId, code) {\n try {\n const res = await fetch(`${ORDERS_V2_BASE_URL}/cart/${cartId}/apply-gift-card`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({ giftCardCode: code }),\n });\n\n if (!res.ok) {\n // Handle rate limiting\n if (res.status === 429) {\n return {\n valid: false,\n error: 'Too many attempts. Please wait a moment and try again.',\n };\n }\n\n const errorData = await res.json().catch(() => ({}));\n logger.error('Apply gift card failed:', errorData);\n return {\n valid: false,\n error: errorData.error || 'Invalid gift card code',\n };\n }\n\n const data = await res.json();\n return {\n valid: true,\n giftCardCode: data.giftCardCode,\n giftCardAmount: data.giftCardAmount,\n giftCardBalance: data.giftCardBalance,\n paymentType: data.paymentType,\n stripeAmount: data.stripeAmount,\n orderTotal: data.orderTotal,\n requiresStripe: data.requiresStripe,\n };\n } catch (err) {\n logger.error('applyGiftCard error:', err);\n return {\n valid: false,\n error: 'Network error. Please check your connection and try again.',\n };\n }\n}\n\n/**\n * Remove a gift card from the cart\n * @param {string} cartId - The cart/order UUID\n * @returns {Promise<{success: boolean, error?: string}>}\n */\nexport async function removeGiftCard(cartId) {\n try {\n const res = await fetch(`${ORDERS_V2_BASE_URL}/cart/${cartId}/gift-card`, {\n method: 'DELETE',\n headers: {\n 'Content-Type': 'application/json',\n },\n });\n\n if (!res.ok) {\n const errorData = await res.json().catch(() => ({}));\n logger.error('Remove gift card failed:', errorData);\n return {\n success: false,\n error: errorData.error || 'Failed to remove gift card',\n };\n }\n\n return { success: true };\n } catch (err) {\n logger.error('removeGiftCard error:', err);\n return {\n success: false,\n error: 'Network error. Please check your connection and try again.',\n };\n }\n}\n\n/**\n * Complete a gift card only payment (no Stripe required)\n * @param {string} cartId - The cart/order UUID\n * @param {Object} customerDetails - Customer information\n * @param {string} customerDetails.firstName - Customer first name\n * @param {string} customerDetails.lastName - Customer last name\n * @param {string} customerDetails.email - Customer email\n * @param {string} [customerDetails.phoneNumber] - Customer phone number\n * @param {boolean} [customerDetails.mailingList] - Whether to subscribe to mailing list\n * @returns {Promise<{success: boolean, orderId?: string, confirmationNumber?: string, error?: string}>}\n */\nexport async function completeGiftCardPayment(cartId, customerDetails) {\n try {\n const res = await fetch(`${ORDERS_V2_BASE_URL}/cart/${cartId}/complete-gift-card-payment`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n firstName: customerDetails.firstName,\n lastName: customerDetails.lastName,\n email: customerDetails.email,\n phoneNumber: customerDetails.phoneNumber || null,\n mailingList: customerDetails.mailingList || false,\n }),\n });\n\n if (!res.ok) {\n const errorData = await res.json().catch(() => ({}));\n logger.error('Complete gift card payment failed:', errorData);\n return {\n success: false,\n error: errorData.error || 'Failed to complete payment',\n };\n }\n\n const data = await res.json();\n return {\n success: true,\n orderId: data.orderId,\n confirmationNumber: data.confirmationNumber,\n };\n } catch (err) {\n logger.error('completeGiftCardPayment error:', err);\n return {\n success: false,\n error: 'Network error. Please check your connection and try again.',\n };\n }\n}\n\n","<script>\n let { size = 'default' } = $props();\n</script>\n\n<div class=\"flex items-center justify-center {size === 'small' ? 'gap-1 py-3' : 'gap-1.5 py-4'}\">\n <span class=\"text-color-muted {size === 'small' ? 'text-xs' : 'text-xs'}\">Powered by</span>\n <a\n href=\"https://get-micdrop.com\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n class=\"flex items-center no-underline opacity-70 hover:opacity-100 transition-opacity duration-150\"\n aria-label=\"MicDrop - Event ticketing platform\"\n >\n <svg\n class=\"{size === 'small' ? 'h-3.5' : 'h-4'} w-auto\"\n viewBox=\"0 0 285.03 82.38\"\n xmlns=\"http://www.w3.org/2000/svg\"\n aria-hidden=\"true\"\n >\n <g>\n <g>\n <path d=\"M50.55,70.84c-1.46,0-2.86-.29-4.13-.8-1.28.52-2.68.8-4.13.8h-10.45c-1.45,0-2.85-.28-4.13-.8-1.28.52-2.67.8-4.13.8h-12.57c-6.08,0-11-4.92-11-11V11C0,4.92,4.92,0,11,0h18.58c2.9,0,5.59,1.13,7.58,3.03,2-1.9,4.68-3.03,7.58-3.03h18.71c6.08,0,11,4.92,11,11v48.84c0,6.08-4.92,11-11,11h-12.91Z\" class=\"logo-bg\"/>\n <path d=\"M69.06,70.84c-6.08,0-11-4.92-11-11V25c0-.72.07-1.43.2-2.12-.13-.68-.2-1.39-.2-2.12v-9.77c0-6.08,4.92-11,11-11h12.91c6.08,0,11,4.92,11,11v9.77c0,.72-.07,1.43-.2,2.12.13.69.2,1.39.2,2.12v34.83c0,6.08-4.92,11-11,11h-12.91Z\" class=\"logo-bg\"/>\n <path d=\"M104.64,71.93c-4.25,0-8.25-.73-11.89-2.18-3.68-1.46-6.93-3.55-9.65-6.2-2.78-2.7-4.94-5.93-6.42-9.6-1.44-3.56-2.17-7.41-2.17-11.46s.73-7.91,2.17-11.47c1.47-3.64,3.61-6.86,6.37-9.58,2.72-2.69,5.99-4.8,9.7-6.28,3.64-1.45,7.64-2.18,11.89-2.18,3.65,0,7.09.54,10.24,1.6,3.3,1.11,6.25,2.74,8.77,4.83,2.58,2.14,4.68,4.72,6.26,7.68,1.57,2.94,2.55,6.17,2.94,9.6.19,1.66-.01,3.33-.56,4.87.54,1.29.83,2.71.83,4.2,0,3.71-.76,7.26-2.26,10.54-1.48,3.23-3.57,6.07-6.22,8.44-2.59,2.32-5.67,4.12-9.17,5.37-3.35,1.2-7,1.8-10.84,1.8Z\" class=\"logo-bg\"/>\n <path d=\"M139.75,72c-3.76,0-7.33-.71-10.62-2.12-3.41-1.46-6.4-3.62-8.86-6.41-2.35-2.66-4.18-5.87-5.44-9.56-1.19-3.46-1.79-7.35-1.79-11.56,0-3.9.57-7.59,1.69-10.96,1.18-3.55,2.92-6.71,5.16-9.4,2.41-2.89,5.34-5.15,8.73-6.72,3.05-1.42,6.38-2.2,9.89-2.33v-1.93c0-6.08,4.92-11,11-11h12.91c6.08,0,11,4.92,11,11v48.84c0,6.08-4.92,11-11,11h-12.29c-.81,0-1.59-.09-2.35-.25-2.52.94-5.21,1.41-8.03,1.41Z\" class=\"logo-bg\"/>\n <path d=\"M167.41,70.84c-6.08,0-11-4.92-11-11V25c0-6.08,4.92-11,11-11h12.29c1.08,0,2.13.16,3.12.45,2.4-.8,4.97-1.2,7.68-1.2s5.01.49,7.03,1.5c3.73,1.86,6.09,5.67,6.09,9.84v11c0,6.08-4.92,11-11,11h-.27c-.34,0-.68-.02-1.02-.05v13.29c0,6.08-4.92,11-11,11h-12.91Z\" class=\"logo-bg\"/>\n <path d=\"M213.38,71.93c-4.3,0-8.32-.73-11.95-2.18-3.71-1.47-6.96-3.58-9.67-6.25-2.73-2.69-4.86-5.91-6.33-9.55-1.44-3.56-2.17-7.41-2.17-11.46s.73-7.91,2.17-11.47c1.46-3.62,3.57-6.82,6.28-9.53,2.71-2.71,5.98-4.85,9.72-6.33,3.64-1.45,7.66-2.18,11.96-2.18s8.32.73,11.95,2.18c3.77,1.5,7.04,3.65,9.75,6.39,2.68,2.72,4.76,5.94,6.19,9.57,1.39,3.53,2.1,7.36,2.1,11.37s-.71,7.84-2.1,11.37c-1.44,3.66-3.54,6.88-6.25,9.59s-5.96,4.82-9.69,6.3c-3.64,1.45-7.66,2.18-11.95,2.18Z\" class=\"logo-bg\"/>\n <path d=\"M235.92,82.38c-6.08,0-11-4.92-11-11V25c0-6.08,4.92-11,11-11h12.29c.87,0,1.72.1,2.54.29,2.62-.92,5.48-1.39,8.53-1.39,4.13,0,7.96.93,11.4,2.75,3.27,1.74,6.05,4.11,8.27,7.06,2.05,2.72,3.61,5.89,4.64,9.4.95,3.25,1.43,6.69,1.43,10.23,0,3.98-.54,7.71-1.61,11.07-1.15,3.63-2.85,6.83-5.04,9.52-2.39,2.92-5.33,5.2-8.76,6.76-3.02,1.38-6.32,2.15-9.81,2.28-.31,5.8-5.11,10.4-10.98,10.4h-12.91Z\" class=\"logo-bg\"/>\n </g>\n <g>\n <path d=\"M11,11h18.58l7.51,27.32h.14l7.51-27.32h18.71v48.84h-12.91v-30.6h-.14l-8.13,30.6h-10.45l-8.13-30.6h-.14v30.6h-12.57V11Z\" class=\"logo-text\"/>\n <path d=\"M69.06,11h12.91v9.77h-12.91v-9.77ZM69.06,25h12.91v34.83h-12.91V25Z\" class=\"logo-text\"/>\n <path d=\"M104.64,60.93c-2.87,0-5.48-.47-7.82-1.4-2.35-.93-4.36-2.22-6.04-3.86-1.69-1.64-2.98-3.59-3.89-5.84-.91-2.25-1.37-4.7-1.37-7.34s.46-5.09,1.37-7.34c.91-2.25,2.21-4.21,3.89-5.87,1.68-1.66,3.7-2.96,6.04-3.89,2.34-.93,4.95-1.4,7.82-1.4,2.46,0,4.7.34,6.73,1.03,2.03.68,3.78,1.64,5.26,2.87,1.48,1.23,2.67,2.7,3.59,4.41.91,1.71,1.48,3.59,1.71,5.64h-12.43c-.37-1.59-.93-2.81-1.71-3.65s-1.87-1.26-3.28-1.26c-2,0-3.48.84-4.44,2.53s-1.43,4.01-1.43,6.97.5,5.2,1.5,6.86c1,1.66,2.5,2.49,4.51,2.49,1.59,0,2.79-.51,3.59-1.54.8-1.02,1.29-2.54,1.47-4.54h12.43c0,2.14-.42,4.13-1.26,5.98-.84,1.84-2.03,3.45-3.55,4.82-1.53,1.37-3.37,2.44-5.53,3.21-2.16.77-4.54,1.16-7.14,1.16Z\" class=\"logo-text\"/>\n <path d=\"M139.75,61c-2.28,0-4.37-.41-6.28-1.23-1.91-.82-3.56-2.01-4.95-3.59s-2.48-3.52-3.28-5.84c-.8-2.32-1.2-4.99-1.2-7.99,0-2.73.38-5.23,1.13-7.48.75-2.25,1.81-4.2,3.18-5.84,1.37-1.64,3-2.9,4.92-3.79,1.91-.89,4.03-1.33,6.35-1.33,2.5,0,4.46.43,5.87,1.3,1.41.87,2.69,2.03,3.83,3.48h.21V11h12.91v48.84h-12.29v-4.85h-.14c-1.14,1.96-2.58,3.45-4.34,4.47-1.75,1.02-3.72,1.54-5.91,1.54ZM143.44,51.23c.96,0,1.83-.24,2.63-.72.8-.48,1.47-1.13,2.01-1.95.55-.82.98-1.78,1.3-2.87.32-1.09.48-2.28.48-3.55s-.16-2.39-.48-3.48c-.32-1.09-.75-2.05-1.3-2.87-.55-.82-1.22-1.46-2.01-1.91-.8-.45-1.67-.68-2.63-.68-1.91,0-3.44.82-4.58,2.46-1.14,1.64-1.71,3.8-1.71,6.49s.57,4.87,1.71,6.56c1.14,1.69,2.66,2.53,4.58,2.53Z\" class=\"logo-text\"/>\n <path d=\"M179.71,30.26h.2c1.41-2.19,2.97-3.73,4.68-4.64,1.71-.91,3.68-1.37,5.91-1.37.96,0,1.66.11,2.12.34v11h-.27c-3.83-.64-6.79-.12-8.88,1.54-2.09,1.66-3.14,4.47-3.14,8.44v14.28h-12.91V25h12.29v5.26Z\" class=\"logo-text\"/>\n <path d=\"M213.38,60.93c-2.92,0-5.54-.47-7.89-1.4-2.35-.93-4.35-2.22-6.01-3.86-1.66-1.64-2.95-3.59-3.86-5.84-.91-2.25-1.37-4.7-1.37-7.34s.46-5.09,1.37-7.34c.91-2.25,2.2-4.21,3.86-5.87,1.66-1.66,3.67-2.96,6.01-3.89,2.34-.93,4.97-1.4,7.89-1.4s5.54.47,7.89,1.4c2.34.93,4.34,2.23,5.98,3.89,1.64,1.66,2.9,3.62,3.79,5.87s1.33,4.7,1.33,7.34-.44,5.09-1.33,7.34c-.89,2.25-2.15,4.2-3.79,5.84s-3.63,2.93-5.98,3.86c-2.35.93-4.98,1.4-7.89,1.4ZM213.24,52.32c2,0,3.51-.9,4.51-2.7,1-1.8,1.5-4.18,1.5-7.14s-.5-5.34-1.5-7.14c-1-1.8-2.5-2.7-4.51-2.7s-3.48.9-4.44,2.7-1.43,4.18-1.43,7.14.48,5.34,1.43,7.14,2.44,2.7,4.44,2.7Z\" class=\"logo-text\"/>\n <path d=\"M235.92,25h12.29v4.1h.2c1.27-1.64,2.8-2.91,4.58-3.83,1.78-.91,3.87-1.37,6.28-1.37s4.41.49,6.25,1.47c1.84.98,3.39,2.3,4.64,3.96,1.25,1.66,2.21,3.62,2.87,5.87s.99,4.63.99,7.14c0,2.87-.37,5.45-1.09,7.75-.73,2.3-1.75,4.26-3.07,5.87-1.32,1.62-2.93,2.86-4.82,3.72s-4,1.3-6.32,1.3c-4.05,0-7.29-1.48-9.7-4.44h-.21v14.82h-12.91V25ZM254.91,51.5c1.91,0,3.39-.76,4.44-2.29,1.05-1.53,1.57-3.63,1.57-6.32s-.52-4.8-1.57-6.35c-1.05-1.55-2.53-2.32-4.44-2.32s-3.6.82-4.78,2.46c-1.18,1.64-1.78,3.71-1.78,6.21s.59,4.62,1.78,6.22c1.18,1.59,2.78,2.39,4.78,2.39Z\" class=\"logo-text\"/>\n </g>\n </g>\n </svg>\n </a>\n</div>\n\n<style>\n @reference \"../app.css\";\n\n /* Logo colors adapt to theme */\n .logo-bg {\n @apply fill-gray-500 dark:fill-gray-400;\n }\n\n .logo-text {\n @apply fill-white dark:fill-gray-900;\n }\n</style>\n","<script>\n import { Modal, Button } from '@getmicdrop/svelte-components';\n import { WifiOff } from 'carbon-icons-svelte';\n\n let {\n open = $bindable(false),\n onRetry = () => {},\n onClose = () => {},\n title = 'Connection Error',\n message = \"We couldn't connect to our servers. Please check your internet connection and try again.\",\n retryText = 'Try again',\n cancelText = 'Cancel',\n loading = false\n } = $props();\n</script>\n\n<Modal\n bind:open\n size=\"sm\"\n role=\"alertdialog\"\n aria-labelledby=\"network-error-title\"\n aria-describedby=\"network-error-message\"\n>\n {#snippet body()}\n <div class=\"flex flex-col items-center text-center pt-6 px-4 pb-4\">\n <div class=\"w-16 h-16 rounded-full flex items-center justify-center mb-4 bg-orange-500/10 text-orange-600 dark:text-orange-400\" aria-hidden=\"true\">\n <WifiOff size={32} aria-hidden=\"true\" />\n </div>\n <h3 id=\"network-error-title\" class=\"text-xl font-semibold text-gray-900 dark:text-white mb-2\">{title}</h3>\n <p id=\"network-error-message\" class=\"text-sm text-gray-600 dark:text-gray-300 leading-relaxed max-w-72\">{message}</p>\n </div>\n {/snippet}\n {#snippet footer()}\n <div class=\"flex gap-3 w-full\" role=\"group\" aria-label=\"Dialog actions\">\n <Button size=\"full\" variant=\"alternative\" onclick={onClose} disabled={loading} aria-label={cancelText}>\n {cancelText}\n </Button>\n <Button size=\"full\" variant=\"default\" onclick={onRetry} {loading} aria-label={loading ? 'Retrying connection' : retryText}>\n {retryText}\n </Button>\n </div>\n {/snippet}\n</Modal>\n","<script>\n import { writable } from \"svelte/store\";\n import { onMount, onDestroy } from \"svelte\";\n \n // Create a simple page store for standalone use (no SvelteKit dependency)\n function getInitialUrl() {\n if (typeof window === 'undefined') return new URL('http://localhost');\n try {\n return new URL(window.location.href);\n } catch {\n return new URL('http://localhost');\n }\n }\n \n const pageStore = writable({\n url: getInitialUrl(),\n params: {},\n route: { id: null },\n status: 200,\n error: null,\n data: {},\n form: null,\n state: {}\n });\n \n // Update page store on navigation (for standalone use)\n if (typeof window !== 'undefined') {\n window.addEventListener('popstate', () => {\n pageStore.set({\n url: new URL(window.location.href),\n params: {},\n route: { id: null },\n status: 200,\n error: null,\n data: {},\n form: null,\n state: {}\n });\n });\n }\n \n // Simple goto replacement for standalone use\n function gotoUrl(url, options = {}) {\n if (typeof window === 'undefined') return;\n if (options.replaceState) {\n window.history.replaceState({}, '', url);\n } else {\n window.history.pushState({}, '', url);\n }\n pageStore.set({\n url: new URL(window.location.origin + url),\n params: {},\n route: { id: null },\n status: 200,\n error: null,\n data: {},\n form: null,\n state: {}\n });\n }\n \n // Use the standalone page store\n const page = pageStore;\n import Calendar from \"../Calendar/Calendar.svelte\";\n import CalendarToolbar from \"../CalendarToolbar/CalendarToolbar.svelte\";\n import { MonthSwitcher } from '@getmicdrop/svelte-components';\n import { adaptToBrowseEvents } from '$lib/browse-widgets/adapter';\n import TimePillsListView from '$lib/browse-widgets/variants/time-pills/TimePillsListView.svelte';\n import TimePillsGalleryView from '$lib/browse-widgets/variants/time-pills/TimePillsGalleryView.svelte';\n import TimePillsCarouselView from '$lib/browse-widgets/variants/time-pills/TimePillsCarouselView.svelte';\n import TimePillsFeaturedView from '$lib/browse-widgets/variants/time-pills/TimePillsFeaturedView.svelte';\n import SkeletonLoader from \"../SkeletonLoader/SkeletonLoader.svelte\";\n import {\n fetchVenueEvents,\n fetchAllVenues,\n transformEventData,\n getMonthEvents,\n getOrgMonthEvents,\n } from \"../../lib/utils/api.js\";\n import { generateSlug } from \"../../lib/utils/utils.js\";\n import PoweredByMicdrop from \"../PoweredByMicdrop.svelte\";\n import NetworkErrorModal from \"../Modals/NetworkErrorModal.svelte\";\n import { EmptyState } from '@getmicdrop/svelte-components';\n\n // Fallback switch: ?legacy=1 renders legacy browse views\n let useLegacy = $state(false);\n let LegacyGalleryView = $state(null);\n let LegacyGroupedListView = $state(null);\n let LegacyCarouselView = $state(null);\n let LegacyFeaturedView = $state(null);\n\n if (typeof window !== 'undefined') {\n const params = new URLSearchParams(window.location.search);\n if (params.get('legacy') === '1') {\n useLegacy = true;\n }\n }\n\n // Track which month images have been prefetched\n let prefetchedMonths = new Set();\n\n // Month-based event cache: Map<\"YYYY-MM\", events[]>\n // Must use $state() for Svelte 5 reactivity - derived values like allCachedEvents depend on this\n let monthEventsCache = $state(new Map());\n // Track which months are currently loading\n let loadingMonths = new Set();\n // Pagination info from API\n let paginationInfo = null;\n\n // Helper function to navigate (works with or without SvelteKit)\n function navigateTo(url) {\n if (typeof window !== 'undefined') {\n window.location.href = url;\n }\n }\n\n let {\n showViewOptions = false,\n showMonthSwitcher = false,\n handleNext,\n handlePrev,\n events = [],\n currentMonth,\n currentYear,\n venueId = \"\",\n organizationId = \"\",\n onEventClick,\n featuredItem = null\n } = $props();\n\n // Core loading state - must use $state() for Svelte 5 reactivity with derived values\n let isLoading = $state(false);\n let error = $state(null);\n let fetchedEvents = $state([]);\n let hasLoaded = $state(false);\n let isLoadingPromise = null;\n let isMounted = $state(false);\n\n // Network error modal state\n let showNetworkError = $state(false);\n let networkErrorRetrying = $state(false);\n let failedMonthKey = null;\n\n // Delayed skeleton: only show if loading takes > 250ms (avoids flash on fast connections)\n const SKELETON_DELAY_MS = 250;\n let showDelayedSkeleton = $state(false);\n let skeletonTimeout = null;\n\n // Start skeleton timer when loading begins\n $effect(() => {\n if (isLoading && !hasLoaded) {\n skeletonTimeout = setTimeout(() => {\n if (isLoading) showDelayedSkeleton = true;\n }, SKELETON_DELAY_MS);\n }\n });\n\n // Clear skeleton when loading completes\n $effect(() => {\n if (hasLoaded) {\n if (skeletonTimeout) clearTimeout(skeletonTimeout);\n showDelayedSkeleton = false;\n }\n });\n\n // Dynamically import legacy browse views when ?legacy=1 is active\n $effect(() => {\n if (useLegacy) {\n import('../Calendar/GalleryView.legacy.svelte').then(m => { LegacyGalleryView = m.default; });\n import('../Calendar/GroupedListView.legacy.svelte').then(m => { LegacyGroupedListView = m.default; });\n import('../Calendar/CarouselView.legacy.svelte').then(m => { LegacyCarouselView = m.default; });\n import('../Calendar/FeaturedView.legacy.svelte').then(m => { LegacyFeaturedView = m.default; });\n }\n });\n\n // Cleanup on destroy\n onDestroy(() => {\n if (skeletonTimeout) clearTimeout(skeletonTimeout);\n });\n\n // Show skeleton if delayed timer fired, OR show nothing if still loading (fast connection case)\n // Only show content when hasLoaded is true\n let shouldShowSkeleton = $derived(showDelayedSkeleton);\n let showContent = $derived(hasLoaded && !shouldShowSkeleton);\n let calendarRef = $state(); // Reference to Calendar component for animations\n\n const VIEW = {\n LIST: 0,\n GALLERY: 1,\n CALENDAR: 2,\n CAROUSEL: 3,\n FEATURED: 4,\n };\n\n const VIEW_NAMES = ['list', 'gallery', 'calendar', 'carousel', 'featured'];\n\n // Get view from URL reactively via $page store\n let viewFromUrl = $derived.by(() => {\n const viewParam = $page.url.searchParams.get('view');\n const viewIndex = VIEW_NAMES.indexOf(viewParam);\n return viewIndex >= 0 ? viewIndex : VIEW.CALENDAR;\n });\n\n let publicView = writable(VIEW.CALENDAR);\n let displayedCount = writable(12);\n\n // Sync store with URL (runs on initial load and URL changes)\n $effect(() => {\n publicView.set(viewFromUrl);\n });\n\n // Use local time for consistency with MonthSwitcher and calendar display\n // Initialize with current date, then sync with props via $effect below\n let internalMonth = writable(new Date().getMonth());\n let internalYear = writable(new Date().getFullYear());\n\n // Sync internal stores with props when they change (only for non-store props)\n $effect(() => {\n if (typeof currentMonth === \"number\") {\n internalMonth.set(currentMonth);\n }\n });\n\n $effect(() => {\n if (typeof currentYear === \"number\") {\n internalYear.set(currentYear);\n }\n });\n\n let month = $derived(\n typeof currentMonth?.subscribe === \"function\"\n ? currentMonth\n : internalMonth\n );\n let year = $derived(\n typeof currentYear?.subscribe === \"function\" ? currentYear : internalYear\n );\n\n const defaultHandleNext = () => {\n internalMonth.update((m) =>\n m === 11 ? (internalYear.update((y) => y + 1), 0) : m + 1\n );\n };\n const defaultHandlePrev = () => {\n internalMonth.update((m) =>\n m === 0 ? (internalYear.update((y) => y - 1), 11) : m - 1\n );\n };\n // defaultHandleToday needs to update the correct store (either internal or passed-in)\n // We can't use $month directly in a function, so we need to check which store to update\n function defaultHandleToday() {\n // Use local time to match calendar display\n const now = new Date();\n const targetMonth = now.getMonth();\n const targetYear = now.getFullYear();\n\n // Update the correct stores based on what was passed in\n if (typeof currentMonth?.subscribe === \"function\") {\n // Parent passed a store - update it\n currentMonth.set(targetMonth);\n } else {\n // Using internal store\n internalMonth.set(targetMonth);\n }\n\n if (typeof currentYear?.subscribe === \"function\") {\n // Parent passed a store - update it\n currentYear.set(targetYear);\n } else {\n // Using internal store\n internalYear.set(targetYear);\n }\n }\n\n // Animated version of handleToday - determines direction based on current vs target month\n function animatedHandleToday() {\n const now = new Date();\n const targetMonth = now.getMonth();\n const targetYear = now.getFullYear();\n\n // Get current values from the appropriate stores\n const currMonth = typeof currentMonth?.subscribe === \"function\" ? $month : $internalMonth;\n const currYear = typeof currentYear?.subscribe === \"function\" ? $year : $internalYear;\n\n // Calculate direction: negative = go back (prev), positive = go forward (next)\n const monthDiff = (targetYear - currYear) * 12 + (targetMonth - currMonth);\n\n if (monthDiff === 0) {\n // Already on current month, no animation needed\n return;\n }\n\n const direction = monthDiff < 0 ? -1 : 1;\n\n if (calendarRef?.animateMonthTransition) {\n calendarRef.animateMonthTransition(direction, defaultHandleToday);\n } else {\n defaultHandleToday();\n }\n }\n\n let effectiveHandleNext = $derived(handleNext ?? defaultHandleNext);\n let effectiveHandlePrev = $derived(handlePrev ?? defaultHandlePrev);\n\n // Animated versions for chevron clicks - uses Calendar's animation function\n function animatedHandleNext() {\n if (calendarRef?.animateMonthTransition) {\n calendarRef.animateMonthTransition(1, effectiveHandleNext);\n } else {\n effectiveHandleNext();\n }\n }\n\n function animatedHandlePrev() {\n if (calendarRef?.animateMonthTransition) {\n calendarRef.animateMonthTransition(-1, effectiveHandlePrev);\n } else {\n effectiveHandlePrev();\n }\n }\n\n // Default view options when showViewOptions is true (but not an array)\n const DEFAULT_VIEW_OPTIONS = [\n { id: VIEW.LIST, text: 'List' },\n { id: VIEW.GALLERY, text: 'Gallery' },\n { id: VIEW.CALENDAR, text: 'Calendar' },\n ];\n\n let PublicOptions = $derived(\n showViewOptions\n ? (Array.isArray(showViewOptions) ? showViewOptions : DEFAULT_VIEW_OPTIONS)\n : []\n );\n\n function selectOption(option) {\n publicView.set(option.id);\n // Update URL with view parameter\n const params = new URLSearchParams($page.url.searchParams);\n params.set('view', VIEW_NAMES[option.id]);\n gotoUrl(`?${params.toString()}`, { replaceState: true, keepFocus: true });\n }\n\n let searchQuery = writable(\"\");\n // Initialize with empty array - the $effect below will sync with allEvents\n let filteredEvents = writable([]);\n\n function getTestEvent() {\n const today = new Date();\n const testDate = new Date(today);\n testDate.setDate(today.getDate() + 7);\n\n const year = testDate.getFullYear();\n const month = String(testDate.getMonth() + 1).padStart(2, \"0\");\n const day = String(testDate.getDate()).padStart(2, \"0\");\n const dateStr = `${year}-${month}-${day}`;\n\n return {\n id: \"1\",\n name: \"Test Comedy Show\",\n title: \"Test Comedy Show\",\n date: dateStr,\n startDateTime: `${dateStr}T20:00:00Z`,\n image:\n \"https://images.unsplash.com/photo-1492684223066-81342ee5ff30?w=800&h=600&fit=crop\",\n status: \"On Sale\",\n timeline: \"8:00 PM - 10:00 PM\",\n description:\n \"This is a test event for development and testing purposes. Join us for an amazing comedy show!\",\n venueId: \"1\",\n slug: generateSlug(\"Test Comedy Show\"),\n };\n }\n\n /**\n * Load events for a specific month using the paginated API\n * @param {number} targetYear - Year (e.g., 2025)\n * @param {number} targetMonth - Month (0-indexed like JS Date)\n * @param {boolean} isInitial - Whether this is the initial load (shows skeleton)\n */\n async function loadMonthEvents(targetYear, targetMonth, isInitial = false) {\n if (!isMounted) return;\n if (!venueId && !organizationId) {\n return;\n }\n\n const monthKey = `${targetYear}-${String(targetMonth + 1).padStart(2, '0')}`;\n\n // Skip if already cached or loading\n if (monthEventsCache.has(monthKey) || loadingMonths.has(monthKey)) {\n return;\n }\n\n loadingMonths.add(monthKey);\n if (isInitial) {\n isLoading = true;\n }\n\n try {\n // API uses 1-indexed months\n const apiMonth = targetMonth + 1;\n let result;\n\n if (organizationId) {\n result = await getOrgMonthEvents(organizationId, targetYear, apiMonth);\n } else if (venueId) {\n result = await getMonthEvents(venueId, targetYear, apiMonth);\n }\n\n if (!isMounted) return;\n\n const transformedEvents = Array.isArray(result.events)\n ? result.events.map(transformEventData).filter(Boolean)\n : [];\n\n // Cache the events for this month\n monthEventsCache.set(monthKey, transformedEvents);\n // With $state(), we need to reassign for reactivity to trigger\n monthEventsCache = new Map(monthEventsCache);\n\n // Store pagination info\n if (result.pagination) {\n paginationInfo = result.pagination;\n }\n } catch (err) {\n console.error(`Error loading events for ${monthKey}:`, err);\n // Show error modal for initial load failures\n if (isInitial && isMounted) {\n failedMonthKey = monthKey;\n showNetworkError = true;\n } else {\n // Cache empty array to prevent retrying for background loads\n monthEventsCache.set(monthKey, []);\n monthEventsCache = new Map(monthEventsCache);\n }\n } finally {\n loadingMonths.delete(monthKey);\n if (isInitial && isMounted) {\n isLoading = false;\n hasLoaded = true;\n }\n }\n }\n\n /**\n * Preload adjacent months (prev and next) during idle time\n */\n function preloadAdjacentMonths(currentMo, currentYr) {\n const scheduleIdle = typeof requestIdleCallback !== 'undefined'\n ? requestIdleCallback\n : (cb) => setTimeout(cb, 100);\n\n scheduleIdle(() => {\n // Calculate previous month\n const prevMonth = currentMo === 0 ? 11 : currentMo - 1;\n const prevYear = currentMo === 0 ? currentYr - 1 : currentYr;\n loadMonthEvents(prevYear, prevMonth);\n\n // Calculate next month\n const nextMonth = currentMo === 11 ? 0 : currentMo + 1;\n const nextYear = currentMo === 11 ? currentYr + 1 : currentYr;\n loadMonthEvents(nextYear, nextMonth);\n });\n }\n\n async function loadEvents() {\n if (!isMounted) {\n return;\n }\n if (isLoadingPromise) {\n return isLoadingPromise;\n }\n if (hasLoaded && !venueId && !organizationId) {\n return;\n }\n isLoading = true;\n error = null;\n\n isLoadingPromise = (async () => {\n try {\n if (!isMounted) {\n return;\n }\n\n let apiEvents = [];\n\n if (organizationId) {\n const venues = await fetchAllVenues(organizationId);\n\n if (!isMounted) {\n return;\n }\n if (Array.isArray(venues) && venues.length > 0) {\n const eventPromises = venues.map((venue) =>\n fetchVenueEvents(venue.id || venue.ID)\n );\n const eventArrays = await Promise.all(eventPromises);\n apiEvents = eventArrays.flat();\n\n const eventsFromVenues = venues\n .filter((venue) => venue.nextEvent)\n .map((venue) => {\n const nextEventDate = new Date(venue.nextEvent);\n if (!isNaN(nextEventDate.getTime())) {\n return {\n id: `${venue.id}`,\n title: `${venue.name}`,\n name: venue.name,\n slug: generateSlug(venue.name || \"\"),\n startDateTime: nextEventDate.toISOString(),\n description: venue.description || \"\",\n venueId: venue.id,\n image: venue.image || \"\",\n status: \"On Sale\",\n };\n }\n return null;\n })\n .filter(Boolean);\n\n apiEvents = [...apiEvents, ...eventsFromVenues];\n }\n } else if (venueId) {\n apiEvents = await fetchVenueEvents(venueId);\n\n // Check again after async operation\n if (!isMounted) {\n return;\n }\n }\n\n // Final check before updating state\n if (!isMounted) {\n return;\n }\n\n const transformedEvents = Array.isArray(apiEvents)\n ? apiEvents.map(transformEventData).filter(Boolean)\n : [];\n\n const testEvent = transformEventData(getTestEvent());\n fetchedEvents = transformedEvents.length\n ? [testEvent, ...transformedEvents]\n : [testEvent];\n } catch (err) {\n // Only update state if component is still mounted\n if (isMounted) {\n const testEvent = transformEventData(getTestEvent());\n fetchedEvents = [testEvent, ...events];\n error = null;\n }\n } finally {\n if (isMounted) {\n isLoading = false;\n hasLoaded = true;\n }\n isLoadingPromise = null;\n }\n })();\n\n return isLoadingPromise;\n }\n\n // Track the IDs we last loaded for, so we can reload when they change\n let loadedVenueId = null;\n let loadedOrgId = null;\n\n onMount(() => {\n isMounted = true;\n });\n\n // Initial load effect - runs when organizationId or venueId becomes available\n $effect(() => {\n if (isMounted && !hasLoaded && (organizationId || venueId)) {\n const initialMonth = typeof currentMonth === \"number\" ? currentMonth : new Date().getMonth();\n const initialYear = typeof currentYear === \"number\" ? currentYear : new Date().getFullYear();\n loadMonthEvents(initialYear, initialMonth, true);\n }\n });\n\n onDestroy(() => {\n isMounted = false;\n isLoadingPromise = null;\n });\n\n // Load events when month changes (reactive)\n $effect(() => {\n if (isMounted && hasLoaded && $month !== undefined && $year !== undefined) {\n loadMonthEvents($year, $month);\n // Preload adjacent months during idle time\n preloadAdjacentMonths($month, $year);\n }\n });\n\n // Combine all cached month events into a single array for components that need all events\n // Note: For calendar view, we filter by month anyway, so this is mainly for list/gallery views\n let allCachedEvents = $derived(Array.from(monthEventsCache.values()).flat());\n\n // Check if there are no real events (for empty state)\n // Empty state shows when: data has loaded, no cached events, and no passed-in events\n let hasNoEvents = $derived(hasLoaded && allCachedEvents.length === 0 && events.length === 0);\n\n // Include test event and merge with any passed-in events\n let allEvents = $derived.by(() => {\n const testEvent = transformEventData(getTestEvent());\n const cachedEvents = allCachedEvents.length > 0 ? allCachedEvents : [];\n const passedEvents = events.length > 0 ? events : [];\n // Dedupe by ID\n const seen = new Set();\n return [testEvent, ...cachedEvents, ...passedEvents].filter(e => {\n if (seen.has(e.id)) return false;\n seen.add(e.id);\n return true;\n });\n });\n\n /**\n * Get events for a specific month/year\n */\n function getEventsForMonth(eventsList, targetMonth, targetYear) {\n return eventsList.filter((event) => {\n if (!event.date) return false;\n const [year, month] = event.date.split('-').map(Number);\n return month - 1 === targetMonth && year === targetYear;\n });\n }\n\n /**\n * Prefetch images for a specific month using requestIdleCallback\n */\n function prefetchImagesForMonth(eventsList, targetMonth, targetYear) {\n const monthKey = `${targetYear}-${targetMonth}`;\n if (prefetchedMonths.has(monthKey)) return;\n\n const monthEvents = getEventsForMonth(eventsList, targetMonth, targetYear);\n const imageUrls = monthEvents\n .map((event) => event.image)\n .filter((url) => url && !url.startsWith('data:'));\n\n if (imageUrls.length === 0) {\n prefetchedMonths.add(monthKey);\n return;\n }\n\n // Use requestIdleCallback for non-blocking prefetch, fallback to setTimeout\n const scheduleIdle = typeof requestIdleCallback !== 'undefined'\n ? requestIdleCallback\n : (cb) => setTimeout(cb, 1);\n\n scheduleIdle(() => {\n imageUrls.forEach((url) => {\n const img = new Image();\n img.src = url;\n });\n prefetchedMonths.add(monthKey);\n });\n }\n\n /**\n * Prefetch images for adjacent months (prev and next)\n */\n function prefetchAdjacentMonths(eventsList, currentMo, currentYr) {\n // Calculate previous month\n const prevMonth = currentMo === 0 ? 11 : currentMo - 1;\n const prevYear = currentMo === 0 ? currentYr - 1 : currentYr;\n\n // Calculate next month\n const nextMonth = currentMo === 11 ? 0 : currentMo + 1;\n const nextYear = currentMo === 11 ? currentYr + 1 : currentYr;\n\n // Prefetch both adjacent months\n prefetchImagesForMonth(eventsList, prevMonth, prevYear);\n prefetchImagesForMonth(eventsList, nextMonth, nextYear);\n }\n\n // Prefetch adjacent month images when events are loaded and month changes\n $effect(() => {\n if (hasLoaded && allEvents.length > 0 && $month !== undefined && $year !== undefined) {\n // First prefetch current month (should already be loaded, but ensures it's tracked)\n prefetchImagesForMonth(allEvents, $month, $year);\n // Then prefetch adjacent months during idle time\n prefetchAdjacentMonths(allEvents, $month, $year);\n }\n });\n\n function handleSearch(event) {\n const query = event.detail.query.toLowerCase();\n searchQuery.set(query);\n filteredEvents.set(\n allEvents.filter((ev) => ev.name.toLowerCase().includes(query))\n );\n }\n\n // Adapt calendar events to BrowseEvent[] for Time Pills components\n let browseEvents = $derived(adaptToBrowseEvents($filteredEvents));\n\n $effect(() => {\n if (allEvents) filteredEvents.set(allEvents);\n });\n\n function navigate(url, options = {}) {\n if (typeof window === 'undefined') return;\n \n // Use pushState for client-side navigation (no page refresh)\n if (options.replaceState) {\n window.history.replaceState({}, '', url);\n } else {\n window.history.pushState({}, '', url);\n }\n window.dispatchEvent(new CustomEvent('micdrop-navigate', { \n detail: { url, route: 'details', replaceState: options.replaceState } \n }));\n }\n\n // Network error retry handler\n async function handleNetworkRetry() {\n if (!failedMonthKey) return;\n\n networkErrorRetrying = true;\n const [year, month] = failedMonthKey.split('-').map(Number);\n // Convert back to 0-indexed month\n const targetMonth = month - 1;\n\n try {\n // Clear the failed state and retry\n showNetworkError = false;\n await loadMonthEvents(year, targetMonth, true);\n } finally {\n networkErrorRetrying = false;\n failedMonthKey = null;\n }\n }\n\n function handleNetworkErrorClose() {\n showNetworkError = false;\n failedMonthKey = null;\n }\n\n function handleEventClick(event) {\n const eventData = event.detail || event;\n if (onEventClick && typeof onEventClick === \"function\") {\n onEventClick(eventData);\n\n // Update host page ?e= param for deep linking (if in embedded context)\n const eventSlug = eventData.slug || generateSlug(eventData.name || \"event\");\n updateHostDeepLink(eventData.id, eventSlug);\n return;\n }\n\n const eventId = eventData.id;\n if (eventId) {\n const eventSlug = eventData.slug || generateSlug(eventData.name || \"event\");\n const params = new URLSearchParams();\n if (organizationId) params.set(\"orgId\", organizationId);\n if (venueId) params.set(\"venueId\", venueId);\n\n // Update host page ?e= param for deep linking\n updateHostDeepLink(eventId, eventSlug);\n\n // Navigate to the event details page (proper route, not query params)\n navigateTo(`/${eventId}/${eventSlug}?${params.toString()}`);\n }\n }\n\n /**\n * Bridge function: converts BrowseEvent click into CalendarContainer's handleEventClick format.\n * Used by Time Pills browse views (list, gallery, carousel, featured).\n */\n function handleBrowseEventClick(browseEvent) {\n handleEventClick({\n id: browseEvent.eventID,\n name: browseEvent.name,\n slug: browseEvent.slug,\n image: browseEvent.imageUrl,\n date: browseEvent.date,\n status: browseEvent.status,\n startDateTime: browseEvent.startDateTime,\n });\n }\n\n /**\n * Update the host page URL's ?e= param for SEO deep linking.\n * Uses replaceState so the browser URL reflects which event is active\n * without adding history entries.\n */\n function updateHostDeepLink(eventId, slug) {\n if (typeof window === 'undefined') return;\n try {\n const url = new URL(window.location.href);\n if (eventId) {\n url.searchParams.set('e', slug ? `${eventId}-${slug}` : String(eventId));\n } else {\n url.searchParams.delete('e');\n }\n window.history.replaceState({}, '', url.toString());\n } catch {\n // Ignore in non-browser or sandboxed contexts\n }\n }\n</script>\n\n<svelte:head>\n <title>Event Calendar | {$publicView === VIEW.LIST ? 'List View' : $publicView === VIEW.GALLERY ? 'Gallery View' : 'Calendar View'}</title>\n</svelte:head>\n\n<div class=\"micdrop-calendar-container\">\n <!-- Visually hidden h1 for screen readers -->\n <h1 class=\"sr-only\">Event Calendar - {$publicView === VIEW.LIST ? 'List View' : $publicView === VIEW.GALLERY ? 'Gallery View' : 'Calendar View'}</h1>\n\n {#if showViewOptions}\n <CalendarToolbar\n viewOptions={PublicOptions}\n selectedView={$publicView}\n onViewChange={selectOption}\n onsearch={handleSearch}\n />\n {/if}\n\n {#if showMonthSwitcher && $publicView === VIEW.CALENDAR}\n <nav class=\"mt-4\" aria-label=\"Calendar month navigation\">\n <MonthSwitcher\n currentYear={$year}\n currentMonth={$month}\n handleNext={animatedHandleNext}\n handlePrev={animatedHandlePrev}\n handleToday={animatedHandleToday}\n disablePastNavigation={false}\n />\n </nav>\n {/if}\n\n <main class=\"mt-4\" aria-busy={isLoading}>\n {#if shouldShowSkeleton}\n <div role=\"status\" aria-label=\"Loading events\">\n <SkeletonLoader type={viewFromUrl === VIEW.LIST ? 'list' : (viewFromUrl === VIEW.GALLERY || viewFromUrl === VIEW.CAROUSEL || viewFromUrl === VIEW.FEATURED) ? 'gallery' : ''} />\n <span class=\"sr-only\">Loading events, please wait...</span>\n </div>\n {:else if !showContent}\n <!-- Fast connection: loading but skeleton delay hasn't triggered yet - show nothing -->\n <div class=\"sr-only\" role=\"status\" aria-live=\"polite\">Loading...</div>\n {:else if hasNoEvents}\n <EmptyState\n message=\"No upcoming events\"\n subtext=\"There are no events scheduled at this time. Check back soon for new shows!\"\n />\n {:else if $publicView === VIEW.CALENDAR}\n <Calendar\n bind:this={calendarRef}\n embedCalendar\n currentYear={$year}\n currentMonth={$month}\n currentevents={$filteredEvents}\n oneventClick={handleEventClick}\n onswipeNext={effectiveHandleNext}\n onswipePrev={effectiveHandlePrev}\n />\n {:else if $publicView === VIEW.LIST}\n {#if useLegacy && LegacyGroupedListView}\n <svelte:component this={LegacyGroupedListView} events={$filteredEvents} oneventClick={handleEventClick} />\n {:else}\n <TimePillsListView\n events={browseEvents}\n oneventClick={handleBrowseEventClick}\n />\n {/if}\n {:else if $publicView === VIEW.GALLERY}\n {#if useLegacy && LegacyGalleryView}\n <svelte:component this={LegacyGalleryView} events={$filteredEvents} oneventClick={handleEventClick} />\n {:else}\n <TimePillsGalleryView\n events={browseEvents}\n oneventClick={handleBrowseEventClick}\n />\n {/if}\n {:else if $publicView === VIEW.CAROUSEL}\n {#if useLegacy && LegacyCarouselView}\n <svelte:component this={LegacyCarouselView} events={$filteredEvents} oneventClick={handleEventClick} />\n {:else}\n <TimePillsCarouselView\n events={browseEvents}\n oneventClick={handleBrowseEventClick}\n />\n {/if}\n {:else if $publicView === VIEW.FEATURED}\n {#if useLegacy && LegacyFeaturedView}\n <svelte:component this={LegacyFeaturedView} events={$filteredEvents} {featuredItem} oneventClick={handleEventClick} />\n {:else}\n <TimePillsFeaturedView\n events={browseEvents}\n {featuredItem}\n oneventClick={handleBrowseEventClick}\n />\n {/if}\n {/if}\n </main>\n\n <PoweredByMicdrop />\n</div>\n\n<!-- Network Error Modal -->\n<NetworkErrorModal\n open={showNetworkError}\n onRetry={handleNetworkRetry}\n onClose={handleNetworkErrorClose}\n loading={networkErrorRetrying}\n message=\"We couldn't load the events. Please check your internet connection and try again.\"\n/>\n\n<style>\n /* Screen reader only text */\n .sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n white-space: nowrap;\n border-width: 0;\n }\n</style>\n","export default \"data:image/svg+xml,%3csvg%20width='24'%20height='24'%20viewBox='0%200%2024%2024'%20fill='none'%20xmlns='http://www.w3.org/2000/svg'%3e%3cpath%20d='M21.6%202.4H19.2V1.2C19.2%200.88174%2019.0736%200.576515%2018.8485%200.351472C18.6235%200.126428%2018.3183%200%2018%200C17.6817%200%2017.3765%200.126428%2017.1515%200.351472C16.9264%200.576515%2016.8%200.88174%2016.8%201.2V2.4H13.2V1.2C13.2%200.88174%2013.0736%200.576515%2012.8485%200.351472C12.6235%200.126428%2012.3183%200%2012%200C11.6817%200%2011.3765%200.126428%2011.1515%200.351472C10.9264%200.576515%2010.8%200.88174%2010.8%201.2V2.4H7.2V1.2C7.2%200.88174%207.07357%200.576515%206.84853%200.351472C6.62348%200.126428%206.31826%200%206%200C5.68174%200%205.37652%200.126428%205.15147%200.351472C4.92643%200.576515%204.8%200.88174%204.8%201.2V2.4H2.4C1.76348%202.4%201.15303%202.65286%200.702944%203.10294C0.252856%203.55303%200%204.16348%200%204.8V21.6C0%2022.2365%200.252856%2022.847%200.702944%2023.2971C1.15303%2023.7471%201.76348%2024%202.4%2024H21.6C22.2365%2024%2022.847%2023.7471%2023.2971%2023.2971C23.7471%2022.847%2024%2022.2365%2024%2021.6V4.8C24%204.16348%2023.7471%203.55303%2023.2971%203.10294C22.847%202.65286%2022.2365%202.4%2021.6%202.4ZM4.8%204.8C4.8%205.11826%204.92643%205.42348%205.15147%205.64853C5.37652%205.87357%205.68174%206%206%206C6.31826%206%206.62348%205.87357%206.84853%205.64853C7.07357%205.42348%207.2%205.11826%207.2%204.8H10.8C10.8%205.11826%2010.9264%205.42348%2011.1515%205.64853C11.3765%205.87357%2011.6817%206%2012%206C12.3183%206%2012.6235%205.87357%2012.8485%205.64853C13.0736%205.42348%2013.2%205.11826%2013.2%204.8H16.8C16.8%205.11826%2016.9264%205.42348%2017.1515%205.64853C17.3765%205.87357%2017.6817%206%2018%206C18.3183%206%2018.6235%205.87357%2018.8485%205.64853C19.0736%205.42348%2019.2%205.11826%2019.2%204.8H21.6V7.2H2.4V4.8H4.8ZM2.4%2021.6V9.6H21.6V21.6H2.4Z'%20fill='%23666C79'/%3e%3cpath%20d='M6.6%2012H5.4C5.06863%2012%204.8%2012.2686%204.8%2012.6V13.8C4.8%2014.1314%205.06863%2014.4%205.4%2014.4H6.6C6.93137%2014.4%207.2%2014.1314%207.2%2013.8V12.6C7.2%2012.2686%206.93137%2012%206.6%2012Z'%20fill='%23666C79'/%3e%3cpath%20d='M6.6%2016.8H5.4C5.06863%2016.8%204.8%2017.0686%204.8%2017.4V18.6C4.8%2018.9314%205.06863%2019.2%205.4%2019.2H6.6C6.93137%2019.2%207.2%2018.9314%207.2%2018.6V17.4C7.2%2017.0686%206.93137%2016.8%206.6%2016.8Z'%20fill='%23666C79'/%3e%3cpath%20d='M12.6%2012H11.4C11.0686%2012%2010.8%2012.2686%2010.8%2012.6V13.8C10.8%2014.1314%2011.0686%2014.4%2011.4%2014.4H12.6C12.9314%2014.4%2013.2%2014.1314%2013.2%2013.8V12.6C13.2%2012.2686%2012.9314%2012%2012.6%2012Z'%20fill='%23666C79'/%3e%3cpath%20d='M12.6%2016.8H11.4C11.0686%2016.8%2010.8%2017.0686%2010.8%2017.4V18.6C10.8%2018.9314%2011.0686%2019.2%2011.4%2019.2H12.6C12.9314%2019.2%2013.2%2018.9314%2013.2%2018.6V17.4C13.2%2017.0686%2012.9314%2016.8%2012.6%2016.8Z'%20fill='%23666C79'/%3e%3cpath%20d='M18.6%2012H17.4C17.0686%2012%2016.8%2012.2686%2016.8%2012.6V13.8C16.8%2014.1314%2017.0686%2014.4%2017.4%2014.4H18.6C18.9314%2014.4%2019.2%2014.1314%2019.2%2013.8V12.6C19.2%2012.2686%2018.9314%2012%2018.6%2012Z'%20fill='%23666C79'/%3e%3cpath%20d='M18.6%2016.8H17.4C17.0686%2016.8%2016.8%2017.0686%2016.8%2017.4V18.6C16.8%2018.9314%2017.0686%2019.2%2017.4%2019.2H18.6C18.9314%2019.2%2019.2%2018.9314%2019.2%2018.6V17.4C19.2%2017.0686%2018.9314%2016.8%2018.6%2016.8Z'%20fill='%23666C79'/%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3csvg%20width='24'%20height='16'%20viewBox='0%200%2024%2016'%20fill='none'%20xmlns='http://www.w3.org/2000/svg'%3e%3cpath%20d='M2.25%200H0.75C0.335786%200%200%200.358172%200%200.8V2.4C0%202.84183%200.335786%203.2%200.75%203.2H2.25C2.66421%203.2%203%202.84183%203%202.4V0.8C3%200.358172%202.66421%200%202.25%200Z'%20fill='%23666C79'/%3e%3cpath%20d='M2.25%206.4H0.75C0.335786%206.4%200%206.75817%200%207.2V8.8C0%209.24183%200.335786%209.6%200.75%209.6H2.25C2.66421%209.6%203%209.24183%203%208.8V7.2C3%206.75817%202.66421%206.4%202.25%206.4Z'%20fill='%23666C79'/%3e%3cpath%20d='M2.25%2012.8H0.75C0.335786%2012.8%200%2013.1582%200%2013.6V15.2C0%2015.6418%200.335786%2016%200.75%2016H2.25C2.66421%2016%203%2015.6418%203%2015.2V13.6C3%2013.1582%202.66421%2012.8%202.25%2012.8Z'%20fill='%23666C79'/%3e%3cpath%20d='M22.5%203.2H7.5C7.10218%203.2%206.72064%203.03143%206.43934%202.73137C6.15804%202.43131%206%202.02435%206%201.6C6%201.17565%206.15804%200.768688%206.43934%200.468629C6.72064%200.168571%207.10218%200%207.5%200H22.5C22.8978%200%2023.2794%200.168571%2023.5607%200.468629C23.842%200.768688%2024%201.17565%2024%201.6C24%202.02435%2023.842%202.43131%2023.5607%202.73137C23.2794%203.03143%2022.8978%203.2%2022.5%203.2Z'%20fill='%23666C79'/%3e%3cpath%20d='M22.5%209.6H7.5C7.10218%209.6%206.72064%209.43143%206.43934%209.13137C6.15804%208.83131%206%208.42435%206%208C6%207.57565%206.15804%207.16869%206.43934%206.86863C6.72064%206.56857%207.10218%206.4%207.5%206.4H22.5C22.8978%206.4%2023.2794%206.56857%2023.5607%206.86863C23.842%207.16869%2024%207.57565%2024%208C24%208.42435%2023.842%208.83131%2023.5607%209.13137C23.2794%209.43143%2022.8978%209.6%2022.5%209.6Z'%20fill='%23666C79'/%3e%3cpath%20d='M22.5%2016H7.5C7.10218%2016%206.72064%2015.8314%206.43934%2015.5314C6.15804%2015.2313%206%2014.8243%206%2014.4C6%2013.9757%206.15804%2013.5687%206.43934%2013.2686C6.72064%2012.9686%207.10218%2012.8%207.5%2012.8H22.5C22.8978%2012.8%2023.2794%2012.9686%2023.5607%2013.2686C23.842%2013.5687%2024%2013.9757%2024%2014.4C24%2014.8243%2023.842%2015.2313%2023.5607%2015.5314C23.2794%2015.8314%2022.8978%2016%2022.5%2016Z'%20fill='%23666C79'/%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3csvg%20width='24'%20height='24'%20viewBox='0%200%2024%2024'%20fill='none'%20xmlns='http://www.w3.org/2000/svg'%3e%3cpath%20d='M8.07162%201H2.17837C1.52758%201%201%201.52758%201%202.17837V8.07162C1%208.72242%201.52758%209.25%202.17837%209.25H8.07162C8.72242%209.25%209.25%208.72242%209.25%208.07162V2.17837C9.25%201.52758%208.72242%201%208.07162%201Z'%20stroke='%23666C79'%20stroke-width='2'%20stroke-linecap='round'%20stroke-linejoin='round'/%3e%3cpath%20d='M21.8216%201H15.9284C15.2776%201%2014.75%201.52758%2014.75%202.17837V8.07162C14.75%208.72242%2015.2776%209.25%2015.9284%209.25H21.8216C22.4724%209.25%2023%208.72242%2023%208.07162V2.17837C23%201.52758%2022.4724%201%2021.8216%201Z'%20stroke='%23666C79'%20stroke-width='2'%20stroke-linecap='round'%20stroke-linejoin='round'/%3e%3cpath%20d='M8.07162%2014.75H2.17837C1.52758%2014.75%201%2015.2776%201%2015.9284V21.8216C1%2022.4724%201.52758%2023%202.17837%2023H8.07162C8.72242%2023%209.25%2022.4724%209.25%2021.8216V15.9284C9.25%2015.2776%208.72242%2014.75%208.07162%2014.75Z'%20stroke='%23666C79'%20stroke-width='2'%20stroke-linecap='round'%20stroke-linejoin='round'/%3e%3cpath%20d='M21.8216%2014.75H15.9284C15.2776%2014.75%2014.75%2015.2776%2014.75%2015.9284V21.8216C14.75%2022.4724%2015.2776%2023%2015.9284%2023H21.8216C22.4724%2023%2023%2022.4724%2023%2021.8216V15.9284C23%2015.2776%2022.4724%2014.75%2021.8216%2014.75Z'%20stroke='%23666C79'%20stroke-width='2'%20stroke-linecap='round'%20stroke-linejoin='round'/%3e%3c/svg%3e\"","/**\n * Theme Configuration for Embeddable Calendar Widget\n *\n * This module provides comprehensive theming options for the calendar widget.\n * All colors use HSL format for easy manipulation.\n *\n * Usage:\n * 1. Import and call applyTheme() with your custom theme\n * 2. Or set CSS custom properties directly on the widget container\n *\n * Example:\n * ```js\n * import { applyTheme, themes } from '@getmicdrop/venue-calendar/theme';\n * applyTheme(themes.dark);\n *\n * // Or custom theme:\n * applyTheme({\n * brandPrimary: '270 76% 60%', // Purple\n * textPrimary: '0 0% 100%',\n * bgPrimary: '0 0% 10%',\n * });\n * ```\n */\n\n// Default light theme\nexport const lightTheme = {\n // Brand colors\n brandPrimary: '217 91% 60%', // #2563EB - Blue\n\n // Text colors\n textPrimary: '0 0% 0%', // Black\n textSecondary: '0 0% 40%', // Dark Gray\n textTertiary: '0 0% 60%', // Gray\n\n // Background colors\n bgPrimary: '0 0% 100%', // White\n bgSecondary: '0 0% 98%', // Light Gray\n bgQuaternary: '0 0% 96%', // Very Light Gray\n\n // Border/Stroke colors\n strokePrimary: '0 0% 80%', // Medium Gray\n strokeSecondary: '0 0% 90%', // Light Gray\n\n // Status colors\n statusOnSale: '217 91% 60%', // Blue\n statusSellingFast: '38 92% 50%', // Orange\n statusSoldOut: '0 84% 60%', // Red\n\n // Calendar specific\n todayBg: '217 91% 97%', // Light blue\n todayText: '217 91% 50%', // Blue\n eventDotOnSale: '217 91% 60%',\n eventDotSellingFast: '38 92% 50%',\n eventDotSoldOut: '0 84% 60%',\n\n // Interaction states\n hoverBg: '0 0% 96%',\n focusRing: '217 91% 60%',\n};\n\n// Dark theme\nexport const darkTheme = {\n // Brand colors\n brandPrimary: '217 91% 65%', // Lighter blue for dark mode\n\n // Text colors\n textPrimary: '0 0% 98%', // Near white\n textSecondary: '0 0% 70%', // Light gray\n textTertiary: '0 0% 50%', // Gray\n\n // Background colors\n bgPrimary: '0 0% 9%', // Very dark gray\n bgSecondary: '0 0% 13%', // Dark gray\n bgQuaternary: '0 0% 17%', // Slightly lighter\n\n // Border/Stroke colors\n strokePrimary: '0 0% 30%',\n strokeSecondary: '0 0% 20%',\n\n // Status colors\n statusOnSale: '217 91% 65%',\n statusSellingFast: '38 92% 55%',\n statusSoldOut: '0 84% 65%',\n\n // Calendar specific\n todayBg: '217 50% 20%',\n todayText: '217 91% 70%',\n eventDotOnSale: '217 91% 65%',\n eventDotSellingFast: '38 92% 55%',\n eventDotSoldOut: '0 84% 65%',\n\n // Interaction states\n hoverBg: '0 0% 20%',\n focusRing: '217 91% 65%',\n};\n\n// High contrast theme for accessibility\nexport const highContrastTheme = {\n brandPrimary: '217 100% 50%',\n textPrimary: '0 0% 0%',\n textSecondary: '0 0% 20%',\n textTertiary: '0 0% 30%',\n bgPrimary: '0 0% 100%',\n bgSecondary: '0 0% 95%',\n bgQuaternary: '0 0% 90%',\n strokePrimary: '0 0% 0%',\n strokeSecondary: '0 0% 30%',\n statusOnSale: '217 100% 40%',\n statusSellingFast: '30 100% 40%',\n statusSoldOut: '0 100% 40%',\n todayBg: '217 100% 90%',\n todayText: '217 100% 30%',\n eventDotOnSale: '217 100% 40%',\n eventDotSellingFast: '30 100% 40%',\n eventDotSoldOut: '0 100% 40%',\n hoverBg: '217 100% 95%',\n focusRing: '217 100% 40%',\n};\n\n// Preset themes collection\nexport const themes = {\n light: lightTheme,\n dark: darkTheme,\n highContrast: highContrastTheme,\n};\n\n/**\n * Apply a theme to the calendar widget\n * @param {Object} theme - Theme object with HSL color values\n * @param {HTMLElement} container - Optional container element (defaults to :root)\n */\nexport function applyTheme(theme, container = document.documentElement) {\n const cssVarMap = {\n brandPrimary: '--Brand-Primary',\n textPrimary: '--Text-Primary',\n textSecondary: '--Text-Secondary',\n textTertiary: '--Text-Tertiary',\n bgPrimary: '--BG-Primary',\n bgSecondary: '--BG-Secondary',\n bgQuaternary: '--BG-Quaternary',\n strokePrimary: '--Stroke-Primary',\n strokeSecondary: '--Stroke-Secondary',\n statusOnSale: '--Status-OnSale',\n statusSellingFast: '--Status-SellingFast',\n statusSoldOut: '--Status-SoldOut',\n todayBg: '--Today-BG',\n todayText: '--Today-Text',\n eventDotOnSale: '--EventDot-OnSale',\n eventDotSellingFast: '--EventDot-SellingFast',\n eventDotSoldOut: '--EventDot-SoldOut',\n hoverBg: '--Hover-BG',\n focusRing: '--Focus-Ring',\n };\n\n Object.entries(theme).forEach(([key, value]) => {\n const cssVar = cssVarMap[key];\n if (cssVar) {\n container.style.setProperty(cssVar, value);\n // Backwards compat: also set the typo'd variable name\n if (key === 'textTertiary') {\n container.style.setProperty('--Text-Tartiary', value);\n }\n }\n });\n}\n\n/**\n * Generate CSS string for embedding\n * @param {Object} theme - Theme object\n * @returns {string} CSS string\n */\nexport function generateThemeCSS(theme) {\n const cssVarMap = {\n brandPrimary: '--Brand-Primary',\n textPrimary: '--Text-Primary',\n textSecondary: '--Text-Secondary',\n textTertiary: '--Text-Tertiary',\n bgPrimary: '--BG-Primary',\n bgSecondary: '--BG-Secondary',\n bgQuaternary: '--BG-Quaternary',\n strokePrimary: '--Stroke-Primary',\n strokeSecondary: '--Stroke-Secondary',\n statusOnSale: '--Status-OnSale',\n statusSellingFast: '--Status-SellingFast',\n statusSoldOut: '--Status-SoldOut',\n todayBg: '--Today-BG',\n todayText: '--Today-Text',\n eventDotOnSale: '--EventDot-OnSale',\n eventDotSellingFast: '--EventDot-SellingFast',\n eventDotSoldOut: '--EventDot-SoldOut',\n hoverBg: '--Hover-BG',\n focusRing: '--Focus-Ring',\n };\n\n const lines = [];\n Object.entries(theme).forEach(([key, value]) => {\n const cssVar = cssVarMap[key];\n if (cssVar) {\n lines.push(` ${cssVar}: ${value};`);\n // Backwards compat: also emit the typo'd variable name\n if (key === 'textTertiary') {\n lines.push(` --Text-Tartiary: ${value};`);\n }\n }\n });\n\n return `:root {\\n${lines.join('\\n')}\\n}`;\n}\n\nexport default {\n themes,\n lightTheme,\n darkTheme,\n highContrastTheme,\n applyTheme,\n generateThemeCSS,\n};\n","\n export function goto(url, opts) {\n if (typeof window !== 'undefined' && window.location) {\n if (opts?.replaceState) {\n window.history.replaceState({}, '', url);\n } else {\n window.location.href = url;\n }\n }\n }\n export function beforeNavigate(callback) {\n // No-op for library builds\n }\n export function afterNavigate(callback) {\n // No-op for library builds\n }\n export function disable() {\n // No-op for library builds\n }\n export function enable() {\n // No-op for library builds\n }\n ","<script>\n let {\n price,\n fee,\n tickets,\n } = $props();\n\n const onlyOneFreeTicket = $derived(\n tickets.length === 1 && parseFloat(tickets[0].price) === 0\n );\n</script>\n\n<div class=\"flex flex-col items-end gap-0.5\" aria-label=\"Ticket price: {price === 0 ? (onlyOneFreeTicket ? 'Free' : '$0.00') : `$${price.toFixed(2)}`}{fee > 0 ? `, including $${fee.toFixed(2)} fee` : ''}\">\n {#if price === 0}\n <span class=\"text-lg font-semibold text-gray-900\">\n {onlyOneFreeTicket ? 'Free' : '$0.00'}\n </span>\n {:else}\n <span class=\"text-lg font-semibold text-gray-900\">\n ${price.toFixed(2)}\n </span>\n {/if}\n\n {#if fee > 0}\n <span class=\"text-xs text-gray-500\" aria-hidden=\"true\">\n incl. ${fee.toFixed(2)} fee\n </span>\n {/if}\n</div>\n","<div class=\"flex items-center gap-2 animate-pulse\" role=\"status\" aria-busy=\"true\" aria-label=\"Loading price\">\n <span class=\"sr-only\">Loading price...</span>\n <div class=\"h-5 w-16 rounded-md bg-gray-200 dark:bg-gray-700\" aria-hidden=\"true\"></div>\n <div class=\"h-3 w-12 rounded-md bg-gray-100 dark:bg-gray-800\" aria-hidden=\"true\"></div>\n</div>\n\n<style>\n .sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n white-space: nowrap;\n border: 0;\n }\n</style>\n","<script>\n import PriceTag from './PriceTag.svelte';\n import PriceTagSkeleton from './PriceTagSkeleton.svelte';\n import { Button } from '@getmicdrop/svelte-components';\n import { Locked, Time } from 'carbon-icons-svelte';\n\n let {\n dataReady = false,\n event,\n ticketType,\n availableTickets = [],\n goToCheckout,\n venueServiceCharge = {\n serviceFeeCents: 0,\n serviceFeePercentage: 0,\n serviceFeeChargeType: 'both',\n maxServiceFeeCents: 0,\n },\n isMobileDrawer = false,\n isCancelled = false,\n purchasedTickets = event.purchasedTickets || 0,\n waitlistEnabled = false,\n onJoinWaitlist = () => {},\n } = $props();\n\n const visibleTickets = $derived(availableTickets.filter(\n t => t.visibility === 0 || t.visibility === 1\n ));\n\n const totalRemainingCapacity = $derived(visibleTickets.reduce(\n (acc, t) => acc + t.remainingCapacity,\n 0\n ));\n const isSoldOut = $derived(purchasedTickets >= totalRemainingCapacity);\n const hasNoTickets = $derived(visibleTickets.length === 0);\n\n const basePrice = $derived(\n visibleTickets.length > 0\n ? Math.min(...visibleTickets.map(t => t.price))\n : 0\n );\n const calculatedFee = $derived((() => {\n if (!venueServiceCharge || !basePrice) return 0;\n\n const chargeType = venueServiceCharge.serviceFeeChargeType || 'both';\n let fee = 0;\n\n if (chargeType === 'flat' || chargeType === 'both') {\n fee += (venueServiceCharge.serviceFeeCents || 0) / 100;\n }\n if (chargeType === 'percent' || chargeType === 'both') {\n fee += ((venueServiceCharge.serviceFeePercentage || 0) * basePrice) / 100;\n }\n\n const maxFee = venueServiceCharge.maxServiceFeeCents || 0;\n if (maxFee > 0 && fee > maxFee / 100) {\n fee = maxFee / 100;\n }\n\n return fee;\n })());\n</script>\n\n{#if isMobileDrawer}\n <!-- Mobile drawer: compact horizontal layout -->\n <div class=\"mobile-drawer flex items-center justify-between gap-4 px-4 py-3 safe-area-bottom\" role=\"region\" aria-label=\"Ticket purchase\">\n <div class=\"flex flex-col min-w-0\">\n <span class=\"text-xs text-gray-500\">From</span>\n {#if dataReady}\n <div class=\"flex items-baseline gap-1.5\" aria-label=\"Price: ${(basePrice + calculatedFee).toFixed(2)}{calculatedFee > 0 ? ', including fees' : ''}\">\n <span class=\"text-xl font-semibold text-gray-900\">\n ${(basePrice + calculatedFee).toFixed(2)}\n </span>\n {#if calculatedFee > 0}\n <span class=\"text-xs text-gray-500\" aria-hidden=\"true\">incl. ${calculatedFee.toFixed(2)} fee</span>\n {/if}\n </div>\n {:else}\n <div class=\"h-6 w-20 skeleton rounded\" role=\"status\" aria-busy=\"true\" aria-label=\"Loading price\"></div>\n {/if}\n </div>\n\n <div class=\"shrink-0\">\n {#if isCancelled}\n <Button variant=\"red-outline\" disabled aria-label=\"Event has been cancelled\">Event Cancelled</Button>\n {:else if hasNoTickets}\n <Button variant=\"red-outline\" disabled aria-label=\"Ticket sales have ended\">Sales Ended</Button>\n {:else if isSoldOut}\n {#if waitlistEnabled}\n <Button onclick={onJoinWaitlist} class=\"px-6 py-3 text-base font-semibold\" aria-label=\"Join waitlist for this sold out event\">\n <Time size={16} class=\"mr-1.5\" aria-hidden=\"true\" />\n Join Waitlist\n </Button>\n {:else}\n <Button variant=\"alternative\" disabled aria-label=\"Event is sold out\">Sold Out</Button>\n {/if}\n {:else}\n <Button onclick={goToCheckout} class=\"px-6 py-3 text-base font-semibold\" aria-label={ticketType === 1 ? 'Reserve a spot for this event' : 'Get tickets for this event'}>\n {ticketType === 1 ? 'Reserve' : 'Get tickets'}\n </Button>\n {/if}\n </div>\n </div>\n{:else}\n <!-- Desktop: full layout with trust signals -->\n <div class=\"card p-5 mt-5\" role=\"region\" aria-label=\"Ticket purchase options\">\n <div class=\"flex flex-col gap-3\">\n <div class=\"flex items-center justify-between\">\n <span class=\"text-sm text-gray-500\">Starts from</span>\n\n {#if dataReady}\n <PriceTag\n price={basePrice + calculatedFee}\n fee={calculatedFee}\n tickets={availableTickets}\n />\n {:else}\n <PriceTagSkeleton />\n {/if}\n </div>\n\n <div>\n {#if isCancelled}\n <Button size=\"full\" variant=\"red-outline\" disabled aria-label=\"Event has been cancelled\">Event Cancelled</Button>\n {:else if hasNoTickets}\n <Button size=\"full\" variant=\"red-outline\" disabled aria-label=\"Ticket sales have ended\">Sales Ended</Button>\n {:else if isSoldOut}\n {#if waitlistEnabled}\n <Button size=\"full\" onclick={onJoinWaitlist} aria-label=\"Join waitlist for this sold out event\">\n <Time size={16} class=\"mr-1.5\" aria-hidden=\"true\" />\n Join Waitlist\n </Button>\n <!-- Waitlist info -->\n <div class=\"flex items-center justify-center gap-1.5 mt-3 text-color-tertiary\" aria-hidden=\"true\">\n <span class=\"caption\">Get notified when tickets are available</span>\n </div>\n {:else}\n <Button size=\"full\" variant=\"alternative\" disabled aria-label=\"Event is sold out\">Sold Out</Button>\n {/if}\n {:else}\n <Button size=\"full\" onclick={goToCheckout} aria-label={ticketType === 1 ? 'Reserve a spot for this event' : 'Get tickets for this event'}>\n {ticketType === 1 ? 'Reserve a spot' : 'Get tickets'}\n </Button>\n <!-- Trust signal -->\n <div class=\"flex items-center justify-center gap-1.5 mt-3 text-gray-400\" aria-hidden=\"true\">\n <Locked size={12} aria-hidden=\"true\" />\n <span class=\"text-xs\">Secure checkout</span>\n </div>\n {/if}\n </div>\n </div>\n </div>\n{/if}\n\n<style>\n .safe-area-bottom {\n padding-bottom: max(0.75rem, env(safe-area-inset-bottom));\n }\n</style>\n","<script>\n import { ShowCard } from '@getmicdrop/svelte-components';\n import TicketActions from './TicketActions.svelte';\n\n let {\n dataReady = false,\n event,\n showtimes = [],\n ticketType,\n availableTickets = [],\n isSticky = false,\n sidebarLeft = 0,\n goToCheckout,\n venueServiceCharge = {},\n isCancelled = false,\n waitlistEnabled = false,\n onJoinWaitlist = () => {},\n } = $props();\n</script>\n\n<!-- Desktop sidebar - hidden on mobile -->\n<aside\n class=\"hidden lg:flex w-80 flex-col transition-all duration-200 {isSticky ? 'fixed top-5 max-h-[calc(100vh-40px)] overflow-y-auto' : 'relative max-h-none overflow-visible'}\"\n style:left={isSticky ? `${sidebarLeft}px` : 'auto'}\n aria-label=\"Event booking\"\n>\n <ShowCard {event} {showtimes} />\n\n <TicketActions\n {event}\n {ticketType}\n {availableTickets}\n {goToCheckout}\n {venueServiceCharge}\n {dataReady}\n {isCancelled}\n {waitlistEnabled}\n {onJoinWaitlist}\n />\n</aside>\n\n<!-- Mobile sticky bottom CTA - only shows on mobile -->\n<div class=\"lg:hidden fixed bottom-0 left-0 right-0 z-50 bg-white border-t border-gray-200 shadow-xl\" role=\"region\" aria-label=\"Get tickets\">\n <TicketActions\n {event}\n {ticketType}\n {availableTickets}\n {goToCheckout}\n {venueServiceCharge}\n {dataReady}\n {isCancelled}\n {waitlistEnabled}\n {onJoinWaitlist}\n isMobileDrawer={true}\n />\n</div>\n","<script>\n import { Modal, Button, Input } from '@getmicdrop/svelte-components';\n import { Time, Email, Phone, CheckmarkFilled } from 'carbon-icons-svelte';\n import { joinWaitlist } from '$lib/utils/api.js';\n\n let {\n show = $bindable(false),\n eventId,\n eventName = 'this event',\n onClose = () => {},\n } = $props();\n\n // Form state\n let email = $state('');\n let phone = $state('');\n let smsOptIn = $state(false);\n let loading = $state(false);\n let error = $state('');\n let success = $state(false);\n let position = $state(0);\n\n // Validation\n let emailError = $derived(email && !isValidEmail(email) ? 'Please enter a valid email' : '');\n let phoneError = $derived(phone && smsOptIn && !isValidPhone(phone) ? 'Please enter a valid phone number' : '');\n\n function isValidEmail(email) {\n return /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(email);\n }\n\n function isValidPhone(phone) {\n // Allow various phone formats\n const cleaned = phone.replace(/\\D/g, '');\n return cleaned.length >= 10 && cleaned.length <= 15;\n }\n\n async function handleSubmit() {\n error = '';\n\n if (!email || !isValidEmail(email)) {\n error = 'Please enter a valid email address';\n return;\n }\n\n if (smsOptIn && phone && !isValidPhone(phone)) {\n error = 'Please enter a valid phone number';\n return;\n }\n\n loading = true;\n\n const result = await joinWaitlist(\n eventId,\n email,\n smsOptIn ? phone : null,\n smsOptIn\n );\n\n loading = false;\n\n if (result.success) {\n success = true;\n position = result.position;\n } else {\n error = result.error;\n }\n }\n\n function handleClose() {\n // Reset state when closing\n email = '';\n phone = '';\n smsOptIn = false;\n error = '';\n success = false;\n position = 0;\n show = false;\n onClose();\n }\n</script>\n\n<Modal\n bind:show\n size=\"small\"\n role=\"dialog\"\n aria-labelledby=\"waitlist-title\"\n aria-describedby=\"waitlist-description\"\n>\n {#snippet body()}\n {#if success}\n <!-- Success State -->\n <div class=\"flex flex-col items-center text-center pt-6 px-4 pb-4\">\n <div class=\"w-16 h-16 rounded-full flex items-center justify-center mb-4 bg-green-500/10 text-green-600 dark:text-green-400\" aria-hidden=\"true\">\n <CheckmarkFilled size={32} aria-hidden=\"true\" />\n </div>\n <h3 id=\"waitlist-title\" class=\"text-xl font-semibold text-gray-900 dark:text-white mb-2\">\n You're on the list!\n </h3>\n <p id=\"waitlist-description\" class=\"text-sm text-gray-600 dark:text-gray-300 leading-relaxed max-w-72\">\n {#if position > 0}\n You're #{position} in line for {eventName}.\n {:else}\n You've been added to the waitlist for {eventName}.\n {/if}\n We'll notify you by email if tickets become available.\n </p>\n {#if smsOptIn && phone}\n <p class=\"text-xs text-gray-500 dark:text-gray-400 mt-2\">\n You'll also receive SMS alerts.\n </p>\n {/if}\n </div>\n {:else}\n <!-- Form State -->\n <div class=\"flex flex-col pt-6 px-4 pb-4\">\n <div class=\"flex items-center justify-center mb-4\">\n <div class=\"w-12 h-12 rounded-full flex items-center justify-center bg-blue-500/10 text-blue-600 dark:text-blue-400\" aria-hidden=\"true\">\n <Time size={24} aria-hidden=\"true\" />\n </div>\n </div>\n <h3 id=\"waitlist-title\" class=\"text-xl font-semibold text-gray-900 dark:text-white mb-2 text-center\">\n Join the Waitlist\n </h3>\n <p id=\"waitlist-description\" class=\"text-sm text-gray-600 dark:text-gray-300 leading-relaxed text-center mb-6\">\n This event is sold out. Join the waitlist and we'll notify you if tickets become available.\n </p>\n\n <form onsubmit={(e) => { e.preventDefault(); handleSubmit(); }} class=\"space-y-4\">\n <!-- Email Input -->\n <div>\n <label for=\"waitlist-email\" class=\"block text-sm font-medium text-gray-700 dark:text-gray-300 mb-1\">\n Email address\n </label>\n <div class=\"relative\">\n <Input\n id=\"waitlist-email\"\n type=\"email\"\n bind:value={email}\n placeholder=\"you@example.com\"\n required\n disabled={loading}\n class={emailError ? 'border-red-500' : ''}\n />\n </div>\n {#if emailError}\n <p class=\"text-xs text-red-500 mt-1\">{emailError}</p>\n {/if}\n </div>\n\n <!-- SMS Opt-in -->\n <div class=\"space-y-2\">\n <label class=\"flex items-start gap-3 cursor-pointer\">\n <input\n type=\"checkbox\"\n bind:checked={smsOptIn}\n disabled={loading}\n class=\"mt-0.5 w-4 h-4 text-blue-600 border-gray-300 rounded focus:ring-blue-500\"\n />\n <span class=\"text-sm text-gray-700 dark:text-gray-300\">\n Also notify me by SMS for faster alerts\n </span>\n </label>\n\n {#if smsOptIn}\n <div class=\"ml-7\">\n <Input\n id=\"waitlist-phone\"\n type=\"tel\"\n bind:value={phone}\n placeholder=\"(555) 123-4567\"\n disabled={loading}\n class={phoneError ? 'border-red-500' : ''}\n />\n {#if phoneError}\n <p class=\"text-xs text-red-500 mt-1\">{phoneError}</p>\n {/if}\n <p class=\"text-xs text-gray-500 dark:text-gray-400 mt-1\">\n Message & data rates may apply. Reply STOP to unsubscribe.\n </p>\n </div>\n {/if}\n </div>\n\n {#if error}\n <div class=\"p-3 bg-red-50 dark:bg-red-900/20 border border-red-200 dark:border-red-800 rounded-lg\">\n <p class=\"text-sm text-red-600 dark:text-red-400\">{error}</p>\n </div>\n {/if}\n </form>\n </div>\n {/if}\n {/snippet}\n {#snippet footer()}\n <div class=\"flex gap-3 w-full\" role=\"group\" aria-label=\"Dialog actions\">\n {#if success}\n <Button size=\"full\" variant=\"default\" onclick={handleClose}>\n Done\n </Button>\n {:else}\n <Button size=\"full\" variant=\"alternative\" onclick={handleClose} disabled={loading}>\n Cancel\n </Button>\n <Button\n size=\"full\"\n variant=\"default\"\n onclick={handleSubmit}\n {loading}\n disabled={!email || !!emailError || (smsOptIn && phone && !!phoneError)}\n >\n {loading ? 'Joining...' : 'Join Waitlist'}\n </Button>\n {/if}\n </div>\n {/snippet}\n</Modal>\n","<script>\n let {\n disclaimer = [],\n } = $props();\n\n const fullText = $derived(Array.isArray(disclaimer) ? disclaimer.join(' ') : disclaimer);\n</script>\n\n<section class=\"flex flex-col gap-3\" aria-labelledby=\"disclaimer-title\">\n <h2 id=\"disclaimer-title\" class=\"heading-lg text-color-primary\">Disclaimer</h2>\n\n <p class=\"body-sm text-color-secondary\">\n {fullText}\n </p>\n</section>\n","<script>\n import { onMount, onDestroy } from 'svelte';\n\n let {\n items = [],\n } = $props();\n\n let activeTab = $state(items[0]?.id || '');\n let observer;\n\n function scrollToSection(tabId) {\n activeTab = tabId;\n const section = document.getElementById(tabId);\n if (section) {\n section.scrollIntoView({ behavior: 'smooth' });\n }\n }\n\n function handleTabKeydown(e, currentIndex) {\n let newIndex = currentIndex;\n\n if (e.key === 'ArrowRight') {\n e.preventDefault();\n newIndex = (currentIndex + 1) % items.length;\n } else if (e.key === 'ArrowLeft') {\n e.preventDefault();\n newIndex = (currentIndex - 1 + items.length) % items.length;\n } else if (e.key === 'Home') {\n e.preventDefault();\n newIndex = 0;\n } else if (e.key === 'End') {\n e.preventDefault();\n newIndex = items.length - 1;\n } else {\n return; // Don't handle other keys\n }\n\n // Focus the new tab and activate it\n const newTabId = items[newIndex].id;\n scrollToSection(newTabId);\n document.getElementById(`tab-${newTabId}`)?.focus();\n }\n\n onMount(() => {\n // Observe sections to update active tab on scroll\n observer = new IntersectionObserver(\n (entries) => {\n entries.forEach((entry) => {\n if (entry.isIntersecting) {\n activeTab = entry.target.id;\n }\n });\n },\n { rootMargin: '-20% 0px -70% 0px' }\n );\n\n items.forEach((item) => {\n const section = document.getElementById(item.id);\n if (section) observer.observe(section);\n });\n });\n\n onDestroy(() => {\n if (observer) observer.disconnect();\n });\n </script>\n\n <div class=\"tab-container flex justify-start gap-1 sm:gap-2 border-b\" role=\"tablist\" aria-label=\"Page sections\">\n {#each items as item, index}\n <button\n type=\"button\"\n onclick={() => scrollToSection(item.id)}\n onkeydown={(e) => handleTabKeydown(e, index)}\n class=\"tab-button py-3 px-3 sm:px-4 text-sm sm:text-base font-medium transition-colors relative\"\n class:active={activeTab === item.id}\n role=\"tab\"\n aria-selected={activeTab === item.id}\n aria-controls={item.id}\n tabindex={activeTab === item.id ? 0 : -1}\n id=\"tab-{item.id}\"\n >\n {item.label}\n {#if activeTab === item.id}\n <span class=\"tab-indicator absolute bottom-0 left-0 right-0 h-0.5\" aria-hidden=\"true\"></span>\n {/if}\n </button>\n {/each}\n </div>\n\n<style>\n @reference \"../../app.css\";\n\n /* Theme-responsive tab styles */\n .tab-container {\n @apply border-gray-200 dark:border-gray-700;\n }\n\n .tab-button {\n @apply text-gray-500 dark:text-gray-400;\n }\n\n .tab-button:hover {\n @apply text-gray-900 dark:text-white;\n }\n\n .tab-button.active {\n @apply text-gray-900 dark:text-white;\n }\n\n .tab-indicator {\n @apply bg-gray-900 dark:bg-white;\n }\n\n .tab-button:focus-visible {\n @apply outline-2 outline-blue-700 dark:outline-blue-500 outline-offset-2;\n }\n</style>\n ","<script>\n import { onMount, onDestroy } from \"svelte\";\n import { goto } from \"$app/navigation\";\n import { transformEvent, getImageUrl, getVenueDetails, generateSlug } from \"$lib/utils/utils.js\";\n import { fetchEventDetails, checkEventPassword } from \"$lib/utils/api.js\";\n import StickySidebar from \"../Events/Details/StickySidebar.svelte\";\n import WaitlistModal from \"../Modals/WaitlistModal.svelte\";\n import { ArrowLeft, Locked, WarningAltFilled } from \"carbon-icons-svelte\";\n import { AboutShow, FAQs, InputModal } from '@getmicdrop/svelte-components';\n import Disclaimer from \"../Events/Details/Disclaimer.svelte\";\n import Tab from \"../Tab/+page.svelte\";\n\n let {\n eventId,\n organizationId = \"\",\n venueId = \"\",\n onNavigateToCart,\n onNavigateBack,\n } = $props();\n\n let event = $state(null);\n let rawEvent = $state(null);\n let isLoading = $state(true);\n let error = $state(null);\n let dataReady = $state(false);\n let showtimes = $state([]);\n let venueServiceCharge = $state({});\n let isMounted = $state(false);\n\n let isMobile = $state(false);\n let containerRef = $state();\n let stickyRef = $state();\n let isSticky = $state(false);\n let stickyTop = $state(0);\n let sidebarLeft = $state(0);\n let imageHeight = $state(0);\n\n // Password protection state\n let showPasswordModal = $state(false);\n let passwordValue = $state(\"\");\n let passwordError = $state(\"\");\n let passwordLoading = $state(false);\n let isPasswordVerified = $state(false);\n\n // Waitlist state\n let showWaitlistModal = $state(false);\n\n // Check if event is already authenticated in sessionStorage\n function isEventAuthenticated(evtId) {\n if (typeof window === 'undefined') return false;\n const authedEvents = JSON.parse(sessionStorage.getItem('authedEvents') || '[]');\n return authedEvents.includes(evtId);\n }\n\n // Store event authentication in sessionStorage\n function setEventAuthenticated(evtId) {\n if (typeof window === 'undefined') return;\n const authedEvents = JSON.parse(sessionStorage.getItem('authedEvents') || '[]');\n if (!authedEvents.includes(evtId)) {\n authedEvents.push(evtId);\n sessionStorage.setItem('authedEvents', JSON.stringify(authedEvents));\n }\n }\n\n // Handle password submission\n async function handlePasswordSubmit(e) {\n const password = e.detail?.value || passwordValue;\n if (!password || !eventId) return;\n\n passwordLoading = true;\n passwordError = \"\";\n\n try {\n const result = await checkEventPassword(eventId, password);\n if (result.valid) {\n setEventAuthenticated(eventId);\n isPasswordVerified = true;\n showPasswordModal = false;\n passwordValue = \"\";\n } else {\n passwordError = \"Incorrect password. Please try again.\";\n }\n } catch (err) {\n passwordError = \"Unable to verify password. Please try again.\";\n } finally {\n passwordLoading = false;\n }\n }\n\n // Check if password protection is required\n let requiresPassword = $derived(event?.password && event.password.trim() !== \"\");\n let isLocked = $derived(requiresPassword && !isPasswordVerified && !isEventAuthenticated(eventId));\n\n // Check if event is cancelled\n let isCancelled = $derived(event?.status?.toLowerCase() === 'cancelled' || event?.status?.toLowerCase() === 'canceled');\n\n // Check if waitlist is enabled for this event\n let waitlistEnabled = $derived(rawEvent?.waitlistEnabled === true);\n\n // Handler for joining waitlist\n function handleJoinWaitlist() {\n showWaitlistModal = true;\n }\n\n // Filter out unpublished series events from showtimes\n // Each showtime in a series may have its own published status\n function filterPublishedShowtimes(rawShowtimes) {\n if (!Array.isArray(rawShowtimes)) return [];\n return rawShowtimes.filter(showtime => {\n // Include if no published field exists (backwards compatible)\n if (showtime.published === undefined && showtime.isPublished === undefined) {\n return true;\n }\n // Check both possible field names for published status\n return showtime.published === true || showtime.isPublished === true;\n });\n }\n\n const toFaqArray = (src) => {\n if (!src) return [];\n if (Array.isArray(src)) {\n return src.map((item) =>\n typeof item === \"string\" ? { question: \"\", answer: item.trim() } : item\n );\n }\n return [{ question: \"\", answer: String(src).trim() }];\n };\n\n let venue = $derived(rawEvent?.venue || {});\n let venueFAQs = $derived(toFaqArray(venue.faq));\n let venueDisclaimer = $derived(venue.disclaimer || \"\");\n let parsedVenueDisclaimer = $derived(\n venueDisclaimer\n ? venueDisclaimer\n .split(/(?<=[.?!])\\s+(?=[A-Z])/g)\n .map((s) => s.trim())\n .filter(Boolean)\n : []\n );\n\n let hasPerformers = $derived(event?.performers && event.performers.length > 0);\n\n let tabsData = $derived([\n { id: \"about\", label: \"About the show\" },\n ...(hasPerformers ? [{ id: \"featuring\", label: \"Featuring\" }] : []),\n ...(venueFAQs.length ? [{ id: \"faqs\", label: \"FAQs\" }] : []),\n ...(parsedVenueDisclaimer.length ? [{ id: \"disclaimers\", label: \"Disclaimers\" }] : []),\n ]);\n\n let ticketType = $derived(event?.eventTicketingType ?? event?.ticketType ?? 0);\n let availableTickets = $derived(event?.availableTickets || []);\n\n function goBack() {\n if (onNavigateBack) {\n onNavigateBack();\n } else {\n const params = new URLSearchParams(window.location.search);\n params.set(\"subroute\", \"calendar\");\n params.delete(\"event_id\");\n params.delete(\"slug\");\n const url = `/?${params.toString()}`;\n goto(url, { noScroll: false });\n }\n }\n\n function goToCheckout() {\n if (onNavigateToCart) {\n onNavigateToCart(eventId, generateSlug(event?.name || \"event\"));\n } else {\n const params = new URLSearchParams(window.location.search);\n params.set(\"event_id\", eventId);\n params.set(\"subroute\", \"cart\");\n params.set(\"slug\", generateSlug(event?.name || \"event\"));\n const url = `/?${params.toString()}`;\n goto(url, { noScroll: false });\n }\n }\n\n function updateScreenSize() {\n isMobile = window.innerWidth < 640;\n }\n\n function handleScroll() {\n if (isMobile) {\n isSticky = false;\n return;\n }\n const rect = stickyRef?.getBoundingClientRect();\n if (!rect) return;\n\n isSticky = rect.top + imageHeight <= 20;\n\n if (isSticky && containerRef) {\n const containerBounding = containerRef.getBoundingClientRect();\n sidebarLeft = containerBounding.left + containerRef.clientWidth - 340 - 40;\n }\n }\n\n function getTestEventData(eventId) {\n if (!eventId) return null;\n\n const today = new Date();\n const testDate = new Date(today);\n testDate.setDate(today.getDate() + 7);\n\n return {\n id: String(eventId),\n ID: String(eventId),\n title: \"Test Comedy Show\",\n name: \"Test Comedy Show\",\n description:\n \"This is a test event for development and testing purposes. Join us for an amazing comedy show featuring top comedians!\",\n coverImage:\n \"https://images.unsplash.com/photo-1492684223066-81342ee5ff30?w=1200&h=800&fit=crop\",\n startDateTime: testDate.toISOString(),\n endDateTime: new Date(testDate.getTime() + 2 * 60 * 60 * 1000).toISOString(),\n venueID: \"test-venue-1\",\n venue: {\n name: \"Test Comedy Club\",\n address: \"123 Test Street, Test City\",\n faq: [\n { question: \"What time does the show start?\", answer: \"The show starts at 8:00 PM.\" },\n { question: \"Is there parking available?\", answer: \"Yes, free parking is available.\" },\n ],\n disclaimer: \"All ticket sales are final. No refunds unless event is cancelled.\",\n },\n eventTicketingType: 0,\n ticketType: 0,\n status: \"On Sale\",\n availableTickets: [\n { ID: \"ticket-1\", name: \"General Admission\", price: 25, remainingCapacity: 50, visibility: 0 },\n { ID: \"ticket-2\", name: \"VIP\", price: 50, remainingCapacity: 10, visibility: 0 },\n ],\n showtimes: [\n {\n startTime: testDate.toISOString(),\n endTime: new Date(testDate.getTime() + 2 * 60 * 60 * 1000).toISOString(),\n },\n ],\n performers: [],\n };\n }\n\n async function loadEventData() {\n if (!isMounted) {\n return;\n }\n if (!eventId) {\n error = \"No event ID provided\";\n isLoading = false;\n return;\n }\n\n isLoading = true;\n error = null;\n\n try {\n try {\n rawEvent = await fetchEventDetails(eventId);\n if (!isMounted) return;\n event = transformEvent(rawEvent);\n // Filter out unpublished series events from showtimes\n showtimes = filterPublishedShowtimes(rawEvent?.showtimes || []);\n } catch (apiErr) {\n await new Promise((resolve) => setTimeout(resolve, 100));\n if (!isMounted) return;\n rawEvent = getTestEventData(eventId);\n event = transformEvent(rawEvent);\n // Filter out unpublished series events from showtimes\n showtimes = filterPublishedShowtimes(rawEvent?.showtimes || []);\n }\n\n const effectiveVenueId = event?.venueID || venueId || null;\n if (effectiveVenueId) {\n try {\n const venueData = await getVenueDetails(effectiveVenueId);\n if (!isMounted) return;\n venueServiceCharge = {\n serviceFeeCents: venueData.serviceFeeCents || 0,\n serviceFeePercentage: venueData.serviceFeePercentage || 0,\n serviceFeeChargeType: venueData.serviceFeeChargeType || 'both',\n maxServiceFeeCents: venueData.maxServiceFeeCents || 0,\n taxPercentage: venueData.taxPercentage ?? 0,\n };\n } catch (err) {\n if (!isMounted) return;\n console.error(\"Error fetching venue data:\", err);\n }\n }\n if (isMounted) {\n dataReady = true;\n\n // Check if password protection is needed after data is ready\n if (event?.password && event.password.trim() !== '') {\n // Check if already authenticated in this session\n if (!isEventAuthenticated(eventId)) {\n showPasswordModal = true;\n } else {\n isPasswordVerified = true;\n }\n }\n }\n } catch (err) {\n if (isMounted) {\n console.error(\"Error loading event:\", err);\n error = err.message || \"Failed to load event\";\n }\n } finally {\n if (isMounted) {\n isLoading = false;\n }\n }\n }\n\n // Handle cancel - go back if password modal is cancelled\n function handlePasswordCancel() {\n showPasswordModal = false;\n goBack();\n }\n\n onMount(async () => {\n isMounted = true;\n updateScreenSize();\n window.addEventListener(\"resize\", updateScreenSize);\n window.addEventListener(\"scroll\", handleScroll);\n\n await loadEventData();\n\n if (stickyRef && isMounted) {\n stickyTop = stickyRef.getBoundingClientRect().top || 0;\n const imageElement = stickyRef.querySelector(\"img\");\n if (imageElement) {\n imageHeight = imageElement.offsetHeight;\n }\n }\n\n return () => {\n window.removeEventListener(\"resize\", updateScreenSize);\n window.removeEventListener(\"scroll\", handleScroll);\n };\n });\n\n onDestroy(() => {\n isMounted = false;\n });\n</script>\n\n<div class=\"px-5 sm:px-10 py-12 bg-white\" bind:this={containerRef} data-org-id={organizationId}>\n <!-- Visually hidden h1 for accessibility - event name announced as page title -->\n <h1 class=\"sr-only\">{event?.name || 'Event Details'}</h1>\n\n {#if isLoading}\n <div class=\"flex items-center justify-center py-12\" role=\"status\" aria-live=\"polite\">\n <p class=\"loading-text\">Loading event...</p>\n </div>\n {:else if error}\n <div class=\"text-center py-8\" role=\"alert\">\n <p class=\"error-text mb-2\">Error: {error}</p>\n <button\n class=\"go-back-btn mt-4 px-4 py-2 rounded-lg\"\n onclick={goBack}\n aria-label=\"Go back to calendar\"\n >\n Go back\n </button>\n </div>\n {:else if event}\n <div class=\"flex flex-col w-full relative\">\n {#if isLocked}\n <!-- Locked overlay when password is required but not verified -->\n <div class=\"locked-overlay absolute inset-0 z-20 flex flex-col items-center justify-center bg-white/95 rounded-lg\">\n <div class=\"locked-content text-center p-8\">\n <div class=\"locked-icon-wrapper mx-auto mb-4\">\n <Locked class=\"w-12 h-12 text-gray-400\" />\n </div>\n <h2 class=\"locked-title text-xl font-semibold mb-2\">This event is password protected</h2>\n <p class=\"locked-description text-sm mb-6\">Enter the event password to view details and purchase tickets.</p>\n <button\n class=\"unlock-btn px-6 py-3 rounded-lg font-medium\"\n onclick={() => showPasswordModal = true}\n >\n Enter password\n </button>\n </div>\n </div>\n {/if}\n\n {#if isCancelled}\n <!-- Cancelled event banner -->\n <div class=\"cancelled-banner mb-6 p-4 rounded-lg\" role=\"alert\" aria-live=\"assertive\">\n <div class=\"flex items-start gap-3\">\n <div class=\"cancelled-icon-wrapper shrink-0 mt-0.5\" aria-hidden=\"true\">\n <WarningAltFilled size={24} class=\"cancelled-icon\" />\n </div>\n <div class=\"cancelled-content\">\n <h3 class=\"cancelled-title text-base font-semibold mb-1\">This event has been cancelled</h3>\n <p class=\"cancelled-message text-sm mb-2\">\n We're sorry, but this event is no longer taking place.\n </p>\n <p class=\"cancelled-refund text-sm\">\n <strong>Refund information:</strong> If you purchased tickets, a full refund will be processed automatically to your original payment method within 5-10 business days. Check your email for confirmation.\n </p>\n </div>\n </div>\n </div>\n {/if}\n\n <div class=\"flex-1 flex flex-col lg:flex-row w-full gap-7 relative\" class:blur-content={isLocked} class:cancelled-content={isCancelled}>\n <div class=\"flex-1 relative\" bind:this={stickyRef}>\n <img\n src={event.coverImage\n ? getImageUrl(event.coverImage)\n : \"https://images.unsplash.com/photo-1558618666-fcd25c85cd64?w=1200&h=800&fit=crop\"}\n alt={event.name ? `Event poster for ${event.name}` : \"Event poster\"}\n class=\"w-full rounded-lg object-contain bg-bg-secondary\"\n />\n <button\n class=\"bg-gray-700 rounded-full size-8 sm:size-10 flex items-center justify-center absolute top-3 left-3 z-10\"\n onclick={goBack}\n aria-label=\"Go back to calendar\"\n >\n <ArrowLeft class=\"size-3.5 sm:size-5 text-white\" aria-hidden=\"true\" />\n </button>\n </div>\n\n {#if isSticky}\n <!-- Spacer to maintain layout when sidebar becomes fixed -->\n <div class=\"hidden lg:block w-80 shrink-0\" aria-hidden=\"true\"></div>\n {/if}\n\n <StickySidebar\n {event}\n {showtimes}\n {ticketType}\n {availableTickets}\n {isSticky}\n {sidebarLeft}\n goToCheckout={goToCheckout}\n {venueServiceCharge}\n {dataReady}\n {isCancelled}\n {waitlistEnabled}\n onJoinWaitlist={handleJoinWaitlist}\n />\n </div>\n\n <div class=\"flex-1 flex flex-col lg:flex-row w-full gap-7\" class:blur-content={isLocked} class:cancelled-content={isCancelled}>\n <div class=\"flex-1\">\n <div class=\"my-3 px-0 sm:my-5 sm:px-4\">\n <Tab items={tabsData} />\n </div>\n\n <div id=\"about\" class=\"my-8\">\n <AboutShow\n ShowImage=\"\"\n description={event.description}\n performers={[]}\n title=\"About the show\"\n showTitle={true}\n />\n </div>\n\n {#if hasPerformers}\n <section id=\"featuring\" class=\"my-8\" aria-labelledby=\"featuring-title\">\n <h2 id=\"featuring-title\" class=\"section-title font-medium text-2xl mb-4\">Featuring</h2>\n <AboutShow ShowImage=\"\" description=\"\" performers={event.performers} showTitle={false} />\n </section>\n {/if}\n\n {#if venueFAQs.length}\n <section id=\"faqs\" class=\"my-8\" aria-label=\"Frequently asked questions\">\n <FAQs faqs={venueFAQs} />\n </section>\n {/if}\n\n {#if parsedVenueDisclaimer.length}\n <section id=\"disclaimers\" class=\"my-8\" aria-label=\"Disclaimers\">\n <Disclaimer disclaimer={parsedVenueDisclaimer.join(\" \")} />\n </section>\n {/if}\n </div>\n\n <!-- svelte-ignore element_invalid_self_closing_tag -->\n <div class=\"w-full sm:w-80 flex flex-col\" />\n </div>\n </div>\n {/if}\n</div>\n\n<!-- Password Protection Modal -->\n<InputModal\n bind:open={showPasswordModal}\n size=\"md\"\n title=\"Enter event password\"\n description=\"This event requires a password to view. Please enter the password provided by the event organizer.\"\n inputLabel=\"Password\"\n inputType=\"password\"\n bind:inputValue={passwordValue}\n inputRequired={true}\n errorMessage={passwordError}\n showError={!!passwordError}\n primaryButtonText=\"Unlock event\"\n secondaryButtonText=\"Go back\"\n loading={passwordLoading}\n onconfirm={handlePasswordSubmit}\n oncancel={handlePasswordCancel}\n onclose={handlePasswordCancel}\n/>\n\n<!-- Waitlist Modal -->\n<WaitlistModal\n bind:show={showWaitlistModal}\n eventId={eventId}\n eventName={event?.name || 'this event'}\n onClose={() => showWaitlistModal = false}\n/>\n\n<style>\n /* Theme-responsive colors */\n .loading-text {\n color: hsl(var(--Text-Secondary));\n }\n\n .error-text {\n color: hsl(var(--Status-SoldOut));\n }\n\n .go-back-btn {\n background-color: hsl(var(--Brand-Primary));\n color: white;\n }\n\n .go-back-btn:hover {\n background-color: hsl(var(--Brand-Primary) / 0.9);\n }\n\n .section-title {\n color: hsl(var(--Text-Primary));\n }\n\n /* Password protection styles */\n .blur-content {\n filter: blur(8px);\n pointer-events: none;\n user-select: none;\n }\n\n .locked-overlay {\n min-height: 400px;\n background-color: hsl(var(--BG-Primary) / 0.95);\n }\n\n .locked-title {\n color: hsl(var(--Text-Primary));\n }\n\n .locked-description {\n color: hsl(var(--Text-Secondary));\n max-width: 300px;\n margin-left: auto;\n margin-right: auto;\n }\n\n .locked-icon-wrapper {\n width: 80px;\n height: 80px;\n border-radius: 50%;\n background-color: hsl(var(--BG-Secondary, var(--BG-Primary)));\n display: flex;\n align-items: center;\n justify-content: center;\n }\n\n .unlock-btn {\n background-color: hsl(var(--Brand-Primary));\n color: white;\n transition: background-color 0.2s ease;\n }\n\n .unlock-btn:hover {\n background-color: hsl(var(--Brand-Primary) / 0.9);\n }\n\n /* Cancelled event styles */\n .cancelled-banner {\n background-color: hsl(0 84% 97%);\n border: 1px solid hsl(0 70% 85%);\n }\n\n :global(.cancelled-icon) {\n color: hsl(0 72% 51%);\n }\n\n .cancelled-title {\n color: hsl(0 72% 40%);\n }\n\n .cancelled-message {\n color: hsl(0 50% 35%);\n }\n\n .cancelled-refund {\n color: hsl(0 40% 40%);\n line-height: 1.5;\n }\n\n .cancelled-refund strong {\n color: hsl(0 50% 35%);\n }\n\n .cancelled-content {\n filter: grayscale(60%);\n opacity: 0.85;\n }\n\n .cancelled-content img {\n filter: grayscale(70%);\n }\n\n /* Screen reader only text */\n .sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n white-space: nowrap;\n border-width: 0;\n }\n</style>\n","function _typeof(obj) {\n \"@babel/helpers - typeof\";\n\n if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") {\n _typeof = function (obj) {\n return typeof obj;\n };\n } else {\n _typeof = function (obj) {\n return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n };\n }\n\n return _typeof(obj);\n}\n\nvar RELEASE_TRAIN = 'clover';\n\nvar runtimeVersionToUrlVersion = function runtimeVersionToUrlVersion(version) {\n return version === 3 ? 'v3' : version;\n};\n\nvar ORIGIN = 'https://js.stripe.com';\nvar STRIPE_JS_URL = \"\".concat(ORIGIN, \"/\").concat(RELEASE_TRAIN, \"/stripe.js\");\nvar V3_URL_REGEX = /^https:\\/\\/js\\.stripe\\.com\\/v3\\/?(\\?.*)?$/;\nvar STRIPE_JS_URL_REGEX = /^https:\\/\\/js\\.stripe\\.com\\/(v3|[a-z]+)\\/stripe\\.js(\\?.*)?$/;\nvar EXISTING_SCRIPT_MESSAGE = 'loadStripe.setLoadParameters was called but an existing Stripe.js script already exists in the document; existing script parameters will be used';\n\nvar isStripeJSURL = function isStripeJSURL(url) {\n return V3_URL_REGEX.test(url) || STRIPE_JS_URL_REGEX.test(url);\n};\n\nvar findScript = function findScript() {\n var scripts = document.querySelectorAll(\"script[src^=\\\"\".concat(ORIGIN, \"\\\"]\"));\n\n for (var i = 0; i < scripts.length; i++) {\n var script = scripts[i];\n\n if (!isStripeJSURL(script.src)) {\n continue;\n }\n\n return script;\n }\n\n return null;\n};\n\nvar injectScript = function injectScript(params) {\n var queryString = params && !params.advancedFraudSignals ? '?advancedFraudSignals=false' : '';\n var script = document.createElement('script');\n script.src = \"\".concat(STRIPE_JS_URL).concat(queryString);\n var headOrBody = document.head || document.body;\n\n if (!headOrBody) {\n throw new Error('Expected document.body not to be null. Stripe.js requires a <body> element.');\n }\n\n headOrBody.appendChild(script);\n return script;\n};\n\nvar registerWrapper = function registerWrapper(stripe, startTime) {\n if (!stripe || !stripe._registerWrapper) {\n return;\n }\n\n stripe._registerWrapper({\n name: 'stripe-js',\n version: \"8.8.0\",\n startTime: startTime\n });\n};\n\nvar stripePromise$1 = null;\nvar onErrorListener = null;\nvar onLoadListener = null;\n\nvar onError = function onError(reject) {\n return function (cause) {\n reject(new Error('Failed to load Stripe.js', {\n cause: cause\n }));\n };\n};\n\nvar onLoad = function onLoad(resolve, reject) {\n return function () {\n if (window.Stripe) {\n resolve(window.Stripe);\n } else {\n reject(new Error('Stripe.js not available'));\n }\n };\n};\n\nvar loadScript = function loadScript(params) {\n // Ensure that we only attempt to load Stripe.js at most once\n if (stripePromise$1 !== null) {\n return stripePromise$1;\n }\n\n stripePromise$1 = new Promise(function (resolve, reject) {\n if (typeof window === 'undefined' || typeof document === 'undefined') {\n // Resolve to null when imported server side. This makes the module\n // safe to import in an isomorphic code base.\n resolve(null);\n return;\n }\n\n if (window.Stripe && params) {\n console.warn(EXISTING_SCRIPT_MESSAGE);\n }\n\n if (window.Stripe) {\n resolve(window.Stripe);\n return;\n }\n\n try {\n var script = findScript();\n\n if (script && params) {\n console.warn(EXISTING_SCRIPT_MESSAGE);\n } else if (!script) {\n script = injectScript(params);\n } else if (script && onLoadListener !== null && onErrorListener !== null) {\n var _script$parentNode;\n\n // remove event listeners\n script.removeEventListener('load', onLoadListener);\n script.removeEventListener('error', onErrorListener); // if script exists, but we are reloading due to an error,\n // reload script to trigger 'load' event\n\n (_script$parentNode = script.parentNode) === null || _script$parentNode === void 0 ? void 0 : _script$parentNode.removeChild(script);\n script = injectScript(params);\n }\n\n onLoadListener = onLoad(resolve, reject);\n onErrorListener = onError(reject);\n script.addEventListener('load', onLoadListener);\n script.addEventListener('error', onErrorListener);\n } catch (error) {\n reject(error);\n return;\n }\n }); // Resets stripePromise on error\n\n return stripePromise$1[\"catch\"](function (error) {\n stripePromise$1 = null;\n return Promise.reject(error);\n });\n};\nvar initStripe = function initStripe(maybeStripe, args, startTime) {\n if (maybeStripe === null) {\n return null;\n }\n\n var pk = args[0];\n\n if (typeof pk !== 'string') {\n throw new Error(\"Expected publishable key to be of type string, got type \".concat(_typeof(pk), \" instead.\"));\n }\n\n var isTestKey = pk.match(/^pk_test/); // @ts-expect-error this is not publicly typed\n\n var version = runtimeVersionToUrlVersion(maybeStripe.version);\n var expectedVersion = RELEASE_TRAIN;\n\n if (isTestKey && version !== expectedVersion) {\n console.warn(\"Stripe.js@\".concat(version, \" was loaded on the page, but @stripe/stripe-js@\").concat(\"8.8.0\", \" expected Stripe.js@\").concat(expectedVersion, \". This may result in unexpected behavior. For more information, see https://docs.stripe.com/sdks/stripejs-versioning\"));\n }\n\n var stripe = maybeStripe.apply(undefined, args);\n registerWrapper(stripe, startTime);\n return stripe;\n}; // eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types\n\nvar stripePromise;\nvar loadCalled = false;\n\nvar getStripePromise = function getStripePromise() {\n if (stripePromise) {\n return stripePromise;\n }\n\n stripePromise = loadScript(null)[\"catch\"](function (error) {\n // clear cache on error\n stripePromise = null;\n return Promise.reject(error);\n });\n return stripePromise;\n}; // Execute our own script injection after a tick to give users time to do their\n// own script injection.\n\n\nPromise.resolve().then(function () {\n return getStripePromise();\n})[\"catch\"](function (error) {\n if (!loadCalled) {\n console.warn(error);\n }\n});\nvar loadStripe = function loadStripe() {\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n loadCalled = true;\n var startTime = Date.now(); // if previous attempts are unsuccessful, will re-load script\n\n return getStripePromise().then(function (maybeStripe) {\n return initStripe(maybeStripe, args, startTime);\n });\n};\n\nexport { loadStripe };\n","// Stripe error code to user-friendly message mapping.\n// Extracted from Views/Checkout.svelte for reuse across checkout implementations.\n\nexport interface PaymentErrorDetails {\n\ttype: string; // 'card_declined', 'network', 'validation', 'general', 'rate_limit'\n\ttitle: string;\n\tmessage: string;\n\tsuggestion: string;\n\tretryable: boolean;\n}\n\n/**\n * Maps a Stripe error object to user-friendly error details.\n * Handles card_declined (insufficient_funds, lost_card, stolen_card, expired_card),\n * api_connection_error/network, rate_limit, incorrect_number/invalid_cvc/invalid_expiry,\n * and a default fallback.\n */\nexport function getPaymentErrorDetails(error: any): PaymentErrorDetails {\n\tconst errorCode = error?.code || error?.decline_code || '';\n\tconst errorType = error?.type || '';\n\tconst errorMessage = error?.message || '';\n\n\t// Card declined errors\n\tif (errorCode === 'card_declined' || errorType === 'card_error') {\n\t\tconst declineCode = error?.decline_code || '';\n\n\t\tif (declineCode === 'insufficient_funds') {\n\t\t\treturn {\n\t\t\t\ttype: 'card_declined',\n\t\t\t\ttitle: 'Insufficient funds',\n\t\t\t\tmessage: 'Your card has insufficient funds to complete this purchase.',\n\t\t\t\tsuggestion: 'Please try a different payment method or contact your bank.',\n\t\t\t\tretryable: true,\n\t\t\t};\n\t\t}\n\n\t\tif (declineCode === 'lost_card' || declineCode === 'stolen_card') {\n\t\t\treturn {\n\t\t\t\ttype: 'card_declined',\n\t\t\t\ttitle: 'Card cannot be used',\n\t\t\t\tmessage: 'This card cannot be used for this transaction.',\n\t\t\t\tsuggestion: 'Please use a different payment method.',\n\t\t\t\tretryable: true,\n\t\t\t};\n\t\t}\n\n\t\tif (declineCode === 'expired_card') {\n\t\t\treturn {\n\t\t\t\ttype: 'card_declined',\n\t\t\t\ttitle: 'Card expired',\n\t\t\t\tmessage: 'Your card has expired.',\n\t\t\t\tsuggestion: 'Please use a different card or update your card details.',\n\t\t\t\tretryable: true,\n\t\t\t};\n\t\t}\n\n\t\treturn {\n\t\t\ttype: 'card_declined',\n\t\t\ttitle: 'Card declined',\n\t\t\tmessage: 'Your card was declined by your bank.',\n\t\t\tsuggestion: 'Please try a different card or contact your bank for more information.',\n\t\t\tretryable: true,\n\t\t};\n\t}\n\n\t// Network/connection errors\n\tif (\n\t\terrorType === 'api_connection_error' ||\n\t\terrorMessage.includes('network') ||\n\t\terrorMessage.includes('connection')\n\t) {\n\t\treturn {\n\t\t\ttype: 'network',\n\t\t\ttitle: 'Connection error',\n\t\t\tmessage: \"We couldn't connect to the payment server.\",\n\t\t\tsuggestion: 'Please check your internet connection and try again.',\n\t\t\tretryable: true,\n\t\t};\n\t}\n\n\t// Rate limiting\n\tif (errorCode === 'rate_limit') {\n\t\treturn {\n\t\t\ttype: 'rate_limit',\n\t\t\ttitle: 'Too many attempts',\n\t\t\tmessage: 'Too many payment attempts. Please wait a moment.',\n\t\t\tsuggestion: 'Wait 30 seconds before trying again.',\n\t\t\tretryable: true,\n\t\t};\n\t}\n\n\t// Invalid card details\n\tif (errorCode === 'incorrect_number' || errorCode === 'invalid_number') {\n\t\treturn {\n\t\t\ttype: 'validation',\n\t\t\ttitle: 'Invalid card number',\n\t\t\tmessage: 'The card number you entered is invalid.',\n\t\t\tsuggestion: 'Please check your card number and try again.',\n\t\t\tretryable: true,\n\t\t};\n\t}\n\n\tif (errorCode === 'incorrect_cvc' || errorCode === 'invalid_cvc') {\n\t\treturn {\n\t\t\ttype: 'validation',\n\t\t\ttitle: 'Invalid security code',\n\t\t\tmessage: 'The security code (CVC) is incorrect.',\n\t\t\tsuggestion: 'Please check the 3-digit code on the back of your card.',\n\t\t\tretryable: true,\n\t\t};\n\t}\n\n\tif (errorCode === 'invalid_expiry_month' || errorCode === 'invalid_expiry_year') {\n\t\treturn {\n\t\t\ttype: 'validation',\n\t\t\ttitle: 'Invalid expiration date',\n\t\t\tmessage: 'The expiration date is invalid.',\n\t\t\tsuggestion: \"Please check your card's expiration date.\",\n\t\t\tretryable: true,\n\t\t};\n\t}\n\n\t// Default error\n\treturn {\n\t\ttype: 'general',\n\t\ttitle: 'Payment failed',\n\t\tmessage: errorMessage || 'Something went wrong with your payment.',\n\t\tsuggestion: 'Please try again or use a different payment method.',\n\t\tretryable: true,\n\t};\n}\n","// Premium Ticket Experience — Mock Data\n// Realistic event data for all design variants. DO NOT MODIFY per-variant.\n\nimport type { EventData, PerformerData, FAQItem, VenueData, TicketTypeData } from './types';\n\n// --- Venue ---\nexport const mockVenue: VenueData = {\n\tid: 101,\n\tname: 'The Laugh Factory',\n\taddress: '8001 Sunset Blvd, Los Angeles, CA 90046',\n\ttimezone: 'America/Los_Angeles',\n\tserviceFeePercentage: 10,\n\tserviceFeeCents: 0,\n\ttaxPercentage: 9.5,\n\tcontactEmail: 'help@thelaughfactory.com'\n};\n\n// --- Performers ---\nexport const mockPerformers: PerformerData[] = [\n\t{\n\t\tid: 1,\n\t\tdisplayName: 'Dave Martinez',\n\t\tprofileImage: 'https://images.unsplash.com/photo-1506794778202-cad84cf45f1d?w=200&h=200&fit=crop'\n\t},\n\t{\n\t\tid: 2,\n\t\tdisplayName: 'Sarah Chen',\n\t\tprofileImage: 'https://images.unsplash.com/photo-1494790108377-be9c29b29330?w=200&h=200&fit=crop'\n\t},\n\t{\n\t\tid: 3,\n\t\tdisplayName: 'Mike Thompson',\n\t\tprofileImage: 'https://images.unsplash.com/photo-1507003211169-0a1dd7228f2d?w=200&h=200&fit=crop'\n\t}\n];\n\n// --- FAQs ---\nexport const mockFaqs: FAQItem[] = [\n\t{\n\t\tquestion: 'What time do doors open?',\n\t\tanswer: 'Doors open at 7:00 PM, one hour before showtime. We recommend arriving early to get the best seats.'\n\t},\n\t{\n\t\tquestion: 'Is there a drink minimum?',\n\t\tanswer: 'Yes, there is a 2-drink minimum per person. Both alcoholic and non-alcoholic beverages count toward the minimum.'\n\t},\n\t{\n\t\tquestion: 'Can I get a refund?',\n\t\tanswer: 'Tickets are non-refundable but can be transferred to another person up to 24 hours before the show. Contact us for transfers.'\n\t},\n\t{\n\t\tquestion: 'Is the venue accessible?',\n\t\tanswer: 'Yes, the venue is fully wheelchair accessible with ADA-compliant seating available. Please contact us to reserve accessible seating.'\n\t}\n];\n\n// --- Ticket Types ---\nexport const mockTickets: TicketTypeData[] = [\n\t{\n\t\tid: 101,\n\t\tname: 'General Admission',\n\t\tdescription: 'Standard seating in the main room',\n\t\tprice: 25,\n\t\tfee: 2.5,\n\t\tquantityAvailable: 12,\n\t\tquantityTotal: 150,\n\t\tminPerOrder: 1,\n\t\tmaxPerOrder: 8,\n\t\tstatus: 'on_sale',\n\t\tsalesEndDate: '2026-02-20T20:00:00-08:00',\n\t\tisDonation: false,\n\t\tisHidden: false\n\t},\n\t{\n\t\tid: 102,\n\t\tname: 'VIP Front Row',\n\t\tdescription: 'Premium seats in the first two rows with a complimentary drink',\n\t\tprice: 55,\n\t\tfee: 5.5,\n\t\tquantityAvailable: 3,\n\t\tquantityTotal: 20,\n\t\tminPerOrder: 1,\n\t\tmaxPerOrder: 4,\n\t\tstatus: 'on_sale',\n\t\tsalesEndDate: '2026-02-20T20:00:00-08:00',\n\t\tisDonation: false,\n\t\tisHidden: false\n\t},\n\t{\n\t\tid: 103,\n\t\tname: 'Table for 4',\n\t\tdescription: 'Reserved table for four guests with bottle service',\n\t\tprice: 180,\n\t\tfee: 18,\n\t\tquantityAvailable: 8,\n\t\tquantityTotal: 15,\n\t\tminPerOrder: 1,\n\t\tmaxPerOrder: 3,\n\t\tstatus: 'on_sale',\n\t\tisDonation: false,\n\t\tisHidden: false\n\t},\n\t{\n\t\tid: 104,\n\t\tname: 'Student Discount',\n\t\tdescription: 'Valid student ID required at the door',\n\t\tprice: 15,\n\t\tfee: 1.5,\n\t\tquantityAvailable: 45,\n\t\tquantityTotal: 50,\n\t\tminPerOrder: 1,\n\t\tmaxPerOrder: 2,\n\t\tstatus: 'on_sale',\n\t\tisDonation: false,\n\t\tisHidden: false\n\t},\n\t{\n\t\tid: 105,\n\t\tname: 'Early Bird Special',\n\t\tdescription: 'Limited early bird pricing — first come, first served',\n\t\tprice: 20,\n\t\tfee: 2,\n\t\tquantityAvailable: 0,\n\t\tquantityTotal: 30,\n\t\tminPerOrder: 1,\n\t\tmaxPerOrder: 4,\n\t\tstatus: 'sold_out',\n\t\tisDonation: false,\n\t\tisHidden: false\n\t}\n];\n\n// --- Main Event (on sale, multiple ticket types, scarcity on VIP) ---\nexport const mockEvent: EventData = {\n\tid: 2405,\n\ttitle: 'Friday Night Comedy Throwdown',\n\tslug: 'friday-night-comedy-throwdown',\n\tdescription: `Get ready for the funniest night of the week! The Friday Night Comedy Throwdown brings together three of LA's hottest stand-up comics for two hours of non-stop laughs.\n\nHeadliner Dave Martinez (as seen on Netflix's \"Comedy Knockout\") brings his signature high-energy style, while Sarah Chen delivers her razor-sharp observational humor that's earned her a devoted following. Host Mike Thompson keeps the energy up between sets with crowd work that'll have you crying laughing.\n\nWhether you're a comedy regular or a first-timer, this show delivers. Grab your crew, grab some drinks, and prepare to laugh until your abs hurt.`,\n\tdate: '2026-02-20',\n\tstartDateTime: '2026-02-20T20:00:00-08:00',\n\tendDateTime: '2026-02-20T22:00:00-08:00',\n\tdoorsOpenTime: '2026-02-20T19:00:00-08:00',\n\ttimezone: 'America/Los_Angeles',\n\timageUrl: '/posters/Friday Night Showdown.jpg', // wide landscape 800×400\n\tvenue: mockVenue,\n\tperformers: mockPerformers,\n\ttickets: mockTickets,\n\tfaqs: mockFaqs,\n\tdisclaimer: '',\n\tstatus: 'on_sale',\n\tisPasswordProtected: false,\n\tisRegistrationEvent: false,\n\ttotalTicketsRemaining: 68,\n\ttotalTicketsCapacity: 265,\n\tdisplayStartTime: true,\n\tdisplayEndTime: true,\n\tdisplayDoorsTime: true\n};\n\n// --- Sold Out Event (no end time shown) ---\nexport const mockSoldOutEvent: EventData = {\n\t...mockEvent,\n\tid: 2406,\n\ttitle: 'Saturday Night Special',\n\tslug: 'saturday-night-special',\n\timageUrl: '/posters/the-duel-square.webp', // square 3000×3000\n\tdate: '2026-02-21',\n\tstartDateTime: '2026-02-21T21:00:00-08:00',\n\tendDateTime: '2026-02-21T23:00:00-08:00',\n\tdisplayEndTime: false,\n\tstatus: 'sold_out',\n\ttotalTicketsRemaining: 0,\n\ttickets: mockTickets.map((t) => ({ ...t, quantityAvailable: 0, status: 'sold_out' as const }))\n};\n\n// --- Free Event (no doors time shown) ---\nexport const mockFreeEvent: EventData = {\n\t...mockEvent,\n\tid: 2407,\n\ttitle: 'Open Mic Night',\n\tslug: 'open-mic-night',\n\timageUrl: '/posters/OpenMic-Twitter.jpg', // wide landscape 2127×1075\n\tdate: '2026-02-18',\n\tstartDateTime: '2026-02-18T19:00:00-08:00',\n\tendDateTime: '2026-02-18T21:00:00-08:00',\n\tdisplayDoorsTime: false,\n\tdescription: 'Free open mic night! Sign up at the door. All skill levels welcome.',\n\tstatus: 'on_sale',\n\ttickets: [\n\t\t{\n\t\t\tid: 201,\n\t\t\tname: 'Free Entry',\n\t\t\tdescription: 'Sign up at the door for a 5-minute set',\n\t\t\tprice: 0,\n\t\t\tfee: 0,\n\t\t\tquantityAvailable: 40,\n\t\t\tquantityTotal: 50,\n\t\t\tminPerOrder: 1,\n\t\t\tmaxPerOrder: 2,\n\t\t\tstatus: 'on_sale',\n\t\t\tisDonation: false,\n\t\t\tisHidden: false\n\t\t}\n\t],\n\ttotalTicketsRemaining: 40,\n\ttotalTicketsCapacity: 50\n};\n\n// --- Series Event (with occurrences) ---\nexport const mockSeriesEvent: EventData = {\n\t...mockEvent,\n\tid: 2410,\n\ttitle: 'Improv Throwdown',\n\tslug: 'improv-throwdown',\n\timageUrl: '/posters/laughlab-tall.webp', // tall portrait 2550×3300\n\teventSeriesId: 42,\n\tdescription: 'Weekly improv comedy show featuring rotating guest performers and audience participation games.',\n\tseriesOccurrences: [\n\t\t// Same-day shows (Fri Feb 20 — 7pm, 8pm, 9:30pm)\n\t\t{\n\t\t\tid: 2410,\n\t\t\tslug: 'improv-throwdown-feb-20-7pm',\n\t\t\tstartDateTime: '2026-02-20T19:00:00-08:00',\n\t\t\tendDateTime: '2026-02-20T20:30:00-08:00',\n\t\t\tstatus: 'sold_out',\n\t\t\tctaText: 'Sold out',\n\t\t\tctaDisabled: true\n\t\t},\n\t\t{\n\t\t\tid: 2414,\n\t\t\tslug: 'improv-throwdown-feb-20-8pm',\n\t\t\tstartDateTime: '2026-02-20T20:00:00-08:00',\n\t\t\tendDateTime: '2026-02-20T21:30:00-08:00',\n\t\t\tstatus: 'on_sale',\n\t\t\tctaText: 'Get tickets',\n\t\t\tctaDisabled: false\n\t\t},\n\t\t{\n\t\t\tid: 2415,\n\t\t\tslug: 'improv-throwdown-feb-20-930pm',\n\t\t\tstartDateTime: '2026-02-20T21:30:00-08:00',\n\t\t\tendDateTime: '2026-02-20T23:00:00-08:00',\n\t\t\tstatus: 'on_sale',\n\t\t\tctaText: 'Get tickets',\n\t\t\tctaDisabled: false\n\t\t},\n\t\t// Single show days\n\t\t{\n\t\t\tid: 2411,\n\t\t\tslug: 'improv-throwdown-feb-27',\n\t\t\tstartDateTime: '2026-02-27T20:00:00-08:00',\n\t\t\tendDateTime: '2026-02-27T22:00:00-08:00',\n\t\t\tstatus: 'sold_out',\n\t\t\tctaText: 'Sold out',\n\t\t\tctaDisabled: true\n\t\t},\n\t\t{\n\t\t\tid: 2412,\n\t\t\tslug: 'improv-throwdown-mar-06',\n\t\t\tstartDateTime: '2026-03-06T20:00:00-08:00',\n\t\t\tendDateTime: '2026-03-06T22:00:00-08:00',\n\t\t\tstatus: 'on_sale',\n\t\t\tctaText: 'Get tickets',\n\t\t\tctaDisabled: false\n\t\t},\n\t\t{\n\t\t\tid: 2413,\n\t\t\tslug: 'improv-throwdown-mar-13',\n\t\t\tstartDateTime: '2026-03-13T20:00:00-08:00',\n\t\t\tendDateTime: '2026-03-13T22:00:00-08:00',\n\t\t\tstatus: 'coming_soon',\n\t\t\tctaText: 'Coming soon',\n\t\t\tctaDisabled: true\n\t\t}\n\t]\n};\n\n// --- Series Instance (one specific occurrence of the series — regular event page with series link) ---\nexport const mockSeriesInstanceEvent: EventData = {\n\t...mockEvent,\n\tid: 2414,\n\ttitle: 'Improv Throwdown',\n\tslug: 'improv-throwdown-feb-20-8pm',\n\timageUrl: '/posters/laughlab-tall.webp',\n\teventSeriesId: 42,\n\tstartDateTime: '2026-02-20T20:00:00-08:00',\n\tendDateTime: '2026-02-20T21:30:00-08:00',\n\tdescription: 'Weekly improv comedy show featuring rotating guest performers and audience participation games.',\n\t// No seriesOccurrences — this is a single instance, not the series home\n};\n\n// --- Collection Home (loose grouping of different events with widgets) ---\nexport const mockCollectionEvent: EventData = {\n\t...mockEvent,\n\tid: 3000,\n\ttitle: 'February Comedy Festival',\n\tslug: 'february-comedy-festival',\n\timageUrl: '/posters/Friday Night Showdown.jpg',\n\tdescription: 'A curated collection of the best comedy shows this February. From improv to stand-up, sketch to open mic — there\\'s something for every comedy fan.',\n\tcollectionId: 7,\n\tcollectionEvents: [\n\t\t{\n\t\t\tid: 2401,\n\t\t\tname: 'Friday Night Comedy Throwdown',\n\t\t\tslug: 'friday-night-comedy-throwdown',\n\t\t\timage: '/posters/Friday Night Showdown.jpg',\n\t\t\tstartDateTime: '2026-02-20T20:00:00-08:00',\n\t\t\tstatus: 'on_sale',\n\t\t\tticketsRemaining: 42,\n\t\t\tticketsTotal: 200,\n\t\t},\n\t\t{\n\t\t\tid: 2402,\n\t\t\tname: 'Saturday Night Special',\n\t\t\tslug: 'saturday-night-special',\n\t\t\timage: '/posters/the-duel-square.webp',\n\t\t\tstartDateTime: '2026-02-21T21:00:00-08:00',\n\t\t\tstatus: 'on_sale',\n\t\t\tticketsRemaining: 8,\n\t\t\tticketsTotal: 150,\n\t\t},\n\t\t{\n\t\t\tid: 2403,\n\t\t\tname: 'Stand-Up Comedy Workshop',\n\t\t\tslug: 'standup-comedy-workshop',\n\t\t\timage: '/posters/stand up 101.png',\n\t\t\tstartDateTime: '2026-02-22T14:00:00-08:00',\n\t\t\tstatus: 'on_sale',\n\t\t\tticketsRemaining: 15,\n\t\t\tticketsTotal: 30,\n\t\t},\n\t\t{\n\t\t\tid: 2410,\n\t\t\tname: 'Improv Throwdown',\n\t\t\tslug: 'improv-throwdown',\n\t\t\timage: '/posters/laughlab-tall.webp',\n\t\t\tstartDateTime: '2026-02-27T20:00:00-08:00',\n\t\t\tstatus: 'on_sale',\n\t\t\tticketsRemaining: 65,\n\t\t\tticketsTotal: 200,\n\t\t},\n\t\t{\n\t\t\tid: 2404,\n\t\t\tname: 'Open Mic Night',\n\t\t\tslug: 'open-mic-night',\n\t\t\timage: '/posters/OpenMic-Twitter.jpg',\n\t\t\tstartDateTime: '2026-02-28T19:00:00-08:00',\n\t\t\tstatus: 'on_sale',\n\t\t\tticketsRemaining: 100,\n\t\t\tticketsTotal: 100,\n\t\t},\n\t\t{\n\t\t\tid: 2405,\n\t\t\tname: 'Late Night Comedy Underground',\n\t\t\tslug: 'late-night-comedy-underground',\n\t\t\timage: '/posters/standup-portrait.webp',\n\t\t\tstartDateTime: '2026-02-28T22:00:00-08:00',\n\t\t\tstatus: 'sold_out',\n\t\t\tticketsRemaining: 0,\n\t\t\tticketsTotal: 80,\n\t\t}\n\t]\n};\n\n// --- Registration Event (workshop — no time shown, just date + doors) ---\nexport const mockRegistrationEvent: EventData = {\n\t...mockEvent,\n\tid: 2408,\n\ttitle: 'Stand-Up Comedy Workshop',\n\tslug: 'standup-comedy-workshop',\n\timageUrl: '/posters/stand up 101.png', // 16:9 landscape 1920×1080\n\tdescription: 'Learn the fundamentals of stand-up comedy in this 3-hour intensive workshop. Write, refine, and perform your first 5-minute set.',\n\tisRegistrationEvent: true,\n\tdisplayStartTime: false,\n\tdisplayEndTime: false,\n\tstatus: 'on_sale',\n\ttickets: [\n\t\t{\n\t\t\tid: 301,\n\t\t\tname: 'Workshop Seat',\n\t\t\tdescription: 'Includes materials and performance slot',\n\t\t\tprice: 75,\n\t\t\tfee: 7.5,\n\t\t\tquantityAvailable: 8,\n\t\t\tquantityTotal: 12,\n\t\t\tminPerOrder: 1,\n\t\t\tmaxPerOrder: 1,\n\t\t\tstatus: 'on_sale',\n\t\t\tisDonation: false,\n\t\t\tisHidden: false\n\t\t}\n\t],\n\ttotalTicketsRemaining: 8,\n\ttotalTicketsCapacity: 12\n};\n\n// --- Donation Event ---\nexport const mockDonationEvent: EventData = {\n\t...mockEvent,\n\tid: 2414,\n\ttitle: 'Charity Comedy Benefit',\n\tslug: 'charity-comedy-benefit',\n\timageUrl: '/posters/Friday Night Showdown.jpg',\n\tdescription: 'All proceeds go to the LA Comedy Relief Fund. Choose your own donation amount or grab a standard ticket.',\n\tstatus: 'on_sale',\n\ttickets: [\n\t\t{\n\t\t\tid: 401,\n\t\t\tname: 'Donation',\n\t\t\tdescription: 'Support the cause — choose your amount',\n\t\t\tprice: 0,\n\t\t\tfee: 0,\n\t\t\tquantityAvailable: 200,\n\t\t\tquantityTotal: 200,\n\t\t\tminPerOrder: 1,\n\t\t\tmaxPerOrder: 10,\n\t\t\tstatus: 'on_sale',\n\t\t\tisDonation: true,\n\t\t\tisHidden: false,\n\t\t\tticketType: 2\n\t\t},\n\t\t{\n\t\t\tid: 402,\n\t\t\tname: 'Standard Admission',\n\t\t\tdescription: 'Includes one drink ticket',\n\t\t\tprice: 30,\n\t\t\tfee: 3,\n\t\t\tquantityAvailable: 80,\n\t\t\tquantityTotal: 100,\n\t\t\tminPerOrder: 1,\n\t\t\tmaxPerOrder: 6,\n\t\t\tstatus: 'on_sale',\n\t\t\tisDonation: false,\n\t\t\tisHidden: false\n\t\t}\n\t],\n\ttotalTicketsRemaining: 280,\n\ttotalTicketsCapacity: 300\n};\n\n// --- Mixed Event (ALL ticket states in one event) ---\nexport const mockMixedEvent: EventData = {\n\t...mockEvent,\n\tid: 2415,\n\ttitle: 'The Everything Show',\n\tslug: 'the-everything-show',\n\timageUrl: '/posters/the-duel-square.webp',\n\tdescription: 'A showcase event with every ticket state possible — for testing all edge cases.',\n\tstatus: 'on_sale',\n\ttickets: [\n\t\t{\n\t\t\tid: 501,\n\t\t\tname: 'General Admission',\n\t\t\tdescription: 'Standard seating in the main room',\n\t\t\tprice: 25,\n\t\t\tfee: 2.5,\n\t\t\tquantityAvailable: 45,\n\t\t\tquantityTotal: 150,\n\t\t\tminPerOrder: 1,\n\t\t\tmaxPerOrder: 8,\n\t\t\tstatus: 'on_sale',\n\t\t\tisDonation: false,\n\t\t\tisHidden: false\n\t\t},\n\t\t{\n\t\t\tid: 502,\n\t\t\tname: 'Basic Entry',\n\t\t\tprice: 15,\n\t\t\tfee: 1.5,\n\t\t\tquantityAvailable: 60,\n\t\t\tquantityTotal: 80,\n\t\t\tminPerOrder: 1,\n\t\t\tmaxPerOrder: 4,\n\t\t\tstatus: 'on_sale',\n\t\t\tisDonation: false,\n\t\t\tisHidden: false\n\t\t},\n\t\t{\n\t\t\tid: 503,\n\t\t\tname: 'VIP Front Row',\n\t\t\tdescription: 'Premium seats with complimentary drink',\n\t\t\tprice: 75,\n\t\t\tfee: 7.5,\n\t\t\tquantityAvailable: 2,\n\t\t\tquantityTotal: 20,\n\t\t\tminPerOrder: 1,\n\t\t\tmaxPerOrder: 4,\n\t\t\tstatus: 'on_sale',\n\t\t\tisDonation: false,\n\t\t\tisHidden: false\n\t\t},\n\t\t{\n\t\t\tid: 504,\n\t\t\tname: 'Early Bird',\n\t\t\tdescription: 'Limited early bird pricing',\n\t\t\tprice: 20,\n\t\t\tfee: 2,\n\t\t\tquantityAvailable: 0,\n\t\t\tquantityTotal: 30,\n\t\t\tminPerOrder: 1,\n\t\t\tmaxPerOrder: 4,\n\t\t\tstatus: 'sold_out',\n\t\t\tisDonation: false,\n\t\t\tisHidden: false\n\t\t},\n\t\t{\n\t\t\tid: 505,\n\t\t\tname: 'Late Night Add-On',\n\t\t\tdescription: 'Access to the after-party at midnight',\n\t\t\tprice: 40,\n\t\t\tfee: 4,\n\t\t\tquantityAvailable: 50,\n\t\t\tquantityTotal: 50,\n\t\t\tminPerOrder: 1,\n\t\t\tmaxPerOrder: 2,\n\t\t\tstatus: 'coming_soon',\n\t\t\tsalesStartDate: '2026-03-01T10:00:00-08:00',\n\t\t\tisDonation: false,\n\t\t\tisHidden: false\n\t\t},\n\t\t{\n\t\t\tid: 506,\n\t\t\tname: 'Weekend Bundle',\n\t\t\tdescription: 'Includes Saturday + Sunday shows',\n\t\t\tprice: 45,\n\t\t\tfee: 4.5,\n\t\t\tquantityAvailable: 0,\n\t\t\tquantityTotal: 25,\n\t\t\tminPerOrder: 1,\n\t\t\tmaxPerOrder: 4,\n\t\t\tstatus: 'sales_ended',\n\t\t\tsalesEndDate: '2026-02-10T23:59:00-08:00',\n\t\t\tisDonation: false,\n\t\t\tisHidden: false\n\t\t},\n\t\t{\n\t\t\tid: 507,\n\t\t\tname: 'Donation',\n\t\t\tdescription: 'Support the performers directly',\n\t\t\tprice: 0,\n\t\t\tfee: 0,\n\t\t\tquantityAvailable: 100,\n\t\t\tquantityTotal: 100,\n\t\t\tminPerOrder: 1,\n\t\t\tmaxPerOrder: 5,\n\t\t\tstatus: 'on_sale',\n\t\t\tisDonation: true,\n\t\t\tisHidden: false,\n\t\t\tticketType: 2\n\t\t},\n\t\t{\n\t\t\tid: 508,\n\t\t\tname: 'Secret VIP Lounge',\n\t\t\tdescription: 'Backstage access with meet & greet',\n\t\t\tprice: 150,\n\t\t\tfee: 15,\n\t\t\tquantityAvailable: 10,\n\t\t\tquantityTotal: 10,\n\t\t\tminPerOrder: 1,\n\t\t\tmaxPerOrder: 2,\n\t\t\tstatus: 'on_sale',\n\t\t\tisDonation: false,\n\t\t\tisHidden: true\n\t\t},\n\t\t{\n\t\t\tid: 509,\n\t\t\tname: 'Industry Comp',\n\t\t\tdescription: 'Complimentary ticket for industry professionals',\n\t\t\tprice: 0,\n\t\t\tfee: 0,\n\t\t\tquantityAvailable: 20,\n\t\t\tquantityTotal: 20,\n\t\t\tminPerOrder: 1,\n\t\t\tmaxPerOrder: 1,\n\t\t\tstatus: 'on_sale',\n\t\t\tisDonation: false,\n\t\t\tisHidden: true\n\t\t}\n\t],\n\ttotalTicketsRemaining: 287,\n\ttotalTicketsCapacity: 485\n};\n\n// --- Sectioned Event (tickets grouped by section) ---\nexport const mockSectionedEvent: EventData = {\n\t...mockEvent,\n\tid: 2416,\n\ttitle: 'Multi-Stage Festival',\n\tslug: 'multi-stage-festival',\n\timageUrl: '/posters/OpenMic-Twitter.jpg',\n\tdescription: 'Three stages, one incredible night. Choose your zone and enjoy performances across the venue.',\n\tstatus: 'on_sale',\n\ttickets: [\n\t\t{\n\t\t\tid: 601,\n\t\t\tname: 'Floor Standing',\n\t\t\tdescription: 'Standing room on the main floor',\n\t\t\tprice: 35,\n\t\t\tfee: 3.5,\n\t\t\tquantityAvailable: 100,\n\t\t\tquantityTotal: 200,\n\t\t\tminPerOrder: 1,\n\t\t\tmaxPerOrder: 8,\n\t\t\tstatus: 'on_sale',\n\t\t\tisDonation: false,\n\t\t\tisHidden: false,\n\t\t\tsectionName: 'Floor'\n\t\t},\n\t\t{\n\t\t\tid: 602,\n\t\t\tname: 'Floor Reserved',\n\t\t\tdescription: 'Reserved seat on the main floor',\n\t\t\tprice: 50,\n\t\t\tfee: 5,\n\t\t\tquantityAvailable: 30,\n\t\t\tquantityTotal: 80,\n\t\t\tminPerOrder: 1,\n\t\t\tmaxPerOrder: 6,\n\t\t\tstatus: 'on_sale',\n\t\t\tisDonation: false,\n\t\t\tisHidden: false,\n\t\t\tsectionName: 'Floor'\n\t\t},\n\t\t{\n\t\t\tid: 603,\n\t\t\tname: 'Balcony Standard',\n\t\t\tdescription: 'Standard balcony seating with great views',\n\t\t\tprice: 40,\n\t\t\tfee: 4,\n\t\t\tquantityAvailable: 50,\n\t\t\tquantityTotal: 60,\n\t\t\tminPerOrder: 1,\n\t\t\tmaxPerOrder: 6,\n\t\t\tstatus: 'on_sale',\n\t\t\tisDonation: false,\n\t\t\tisHidden: false,\n\t\t\tsectionName: 'Balcony'\n\t\t},\n\t\t{\n\t\t\tid: 604,\n\t\t\tname: 'Balcony Premium',\n\t\t\tdescription: 'Front-row balcony seats',\n\t\t\tprice: 60,\n\t\t\tfee: 6,\n\t\t\tquantityAvailable: 5,\n\t\t\tquantityTotal: 20,\n\t\t\tminPerOrder: 1,\n\t\t\tmaxPerOrder: 4,\n\t\t\tstatus: 'on_sale',\n\t\t\tisDonation: false,\n\t\t\tisHidden: false,\n\t\t\tsectionName: 'Balcony'\n\t\t},\n\t\t{\n\t\t\tid: 605,\n\t\t\tname: 'VIP Lounge Table',\n\t\t\tdescription: 'Private table for 4 with bottle service and backstage access',\n\t\t\tprice: 250,\n\t\t\tfee: 25,\n\t\t\tquantityAvailable: 3,\n\t\t\tquantityTotal: 8,\n\t\t\tminPerOrder: 1,\n\t\t\tmaxPerOrder: 2,\n\t\t\tstatus: 'on_sale',\n\t\t\tisDonation: false,\n\t\t\tisHidden: false,\n\t\t\tsectionName: 'VIP Lounge'\n\t\t}\n\t],\n\ttotalTicketsRemaining: 188,\n\ttotalTicketsCapacity: 368\n};\n\n// --- Promo Event (hidden tickets for promo reveal testing) ---\nexport const mockPromoEvent: EventData = {\n\t...mockEvent,\n\tid: 2417,\n\ttitle: 'Secret Show',\n\tslug: 'secret-show',\n\timageUrl: '/posters/luke-null-tall.webp',\n\tdescription: 'An intimate comedy experience. Some tickets are only available with a promo code.',\n\tstatus: 'on_sale',\n\ttickets: [\n\t\t{\n\t\t\tid: 701,\n\t\t\tname: 'General Admission',\n\t\t\tprice: 30,\n\t\t\tfee: 3,\n\t\t\tquantityAvailable: 40,\n\t\t\tquantityTotal: 60,\n\t\t\tminPerOrder: 1,\n\t\t\tmaxPerOrder: 6,\n\t\t\tstatus: 'on_sale',\n\t\t\tisDonation: false,\n\t\t\tisHidden: false\n\t\t},\n\t\t{\n\t\t\tid: 702,\n\t\t\tname: 'Premium Seat',\n\t\t\tdescription: 'Reserved seating in rows 1-5',\n\t\t\tprice: 50,\n\t\t\tfee: 5,\n\t\t\tquantityAvailable: 15,\n\t\t\tquantityTotal: 30,\n\t\t\tminPerOrder: 1,\n\t\t\tmaxPerOrder: 4,\n\t\t\tstatus: 'on_sale',\n\t\t\tisDonation: false,\n\t\t\tisHidden: false\n\t\t},\n\t\t{\n\t\t\tid: 703,\n\t\t\tname: 'Artist Meet & Greet',\n\t\t\tdescription: 'Backstage pass with photo opportunity — promo code required',\n\t\t\tprice: 100,\n\t\t\tfee: 10,\n\t\t\tquantityAvailable: 8,\n\t\t\tquantityTotal: 10,\n\t\t\tminPerOrder: 1,\n\t\t\tmaxPerOrder: 2,\n\t\t\tstatus: 'on_sale',\n\t\t\tisDonation: false,\n\t\t\tisHidden: true\n\t\t},\n\t\t{\n\t\t\tid: 704,\n\t\t\tname: 'Industry Comp',\n\t\t\tdescription: 'Complimentary entry for industry professionals',\n\t\t\tprice: 0,\n\t\t\tfee: 0,\n\t\t\tquantityAvailable: 10,\n\t\t\tquantityTotal: 10,\n\t\t\tminPerOrder: 1,\n\t\t\tmaxPerOrder: 1,\n\t\t\tstatus: 'on_sale',\n\t\t\tisDonation: false,\n\t\t\tisHidden: true\n\t\t}\n\t],\n\ttotalTicketsRemaining: 73,\n\ttotalTicketsCapacity: 110\n};\n\n// --- Multi-Stage Event (stage name + age restriction) ---\nexport const mockMultiStageEvent: EventData = {\n\t...mockEvent,\n\tid: 2418,\n\ttitle: 'Late Night Comedy Underground',\n\tslug: 'late-night-comedy-underground',\n\timageUrl: '/posters/laughlab-tall.webp',\n\tdescription: 'The raunchiest, most unfiltered comedy night in LA. Side stage, no holds barred.',\n\tstatus: 'on_sale',\n\tstageName: 'Side Stage',\n\tageRestriction: 21,\n\tdisplayAgeRestriction: true,\n\ttickets: [\n\t\t{\n\t\t\tid: 801,\n\t\t\tname: 'General Admission',\n\t\t\tprice: 20,\n\t\t\tfee: 2,\n\t\t\tquantityAvailable: 25,\n\t\t\tquantityTotal: 40,\n\t\t\tminPerOrder: 1,\n\t\t\tmaxPerOrder: 4,\n\t\t\tstatus: 'on_sale',\n\t\t\tisDonation: false,\n\t\t\tisHidden: false\n\t\t},\n\t\t{\n\t\t\tid: 802,\n\t\t\tname: 'VIP Booth',\n\t\t\tdescription: 'Reserved booth for 2 with drinks included',\n\t\t\tprice: 80,\n\t\t\tfee: 8,\n\t\t\tquantityAvailable: 4,\n\t\t\tquantityTotal: 6,\n\t\t\tminPerOrder: 1,\n\t\t\tmaxPerOrder: 2,\n\t\t\tstatus: 'on_sale',\n\t\t\tisDonation: false,\n\t\t\tisHidden: false\n\t\t}\n\t],\n\ttotalTicketsRemaining: 29,\n\ttotalTicketsCapacity: 46\n};\n\n// --- Long Name Event (Laugh Factory-style: all performers in the title) ---\nexport const mockLongNameEvent: EventData = {\n\t...mockEvent,\n\tid: 2420,\n\ttitle: 'The Friday Night All-Star Comedy Throwdown featuring Dave Martinez, Sarah Chen, Mike Thompson, Bobby Lee, Andrew Santino, Hasan Minhaj, and Very Special Guests from Netflix, Comedy Central, HBO, and Amazon Prime',\n\tslug: 'the-friday-night-all-star-comedy-throwdown',\n\timageUrl: '/posters/laughlab-tall.webp',\n\tdescription: `The biggest lineup of the year! Seven of the hottest comics in LA on one stage for one unforgettable night. This is the show comedy fans have been waiting for — a stacked bill from top to bottom with headliners you've seen on every major streaming platform.\n\nDave Martinez (Netflix's \"Comedy Knockout\") headlines with his signature high-energy style. Sarah Chen brings her razor-sharp observational humor. Mike Thompson keeps the energy sky-high between sets. Bobby Lee delivers his unhinged brilliance. Andrew Santino roasts everything in sight. Hasan Minhaj brings the political heat. Plus surprise guests you won't want to miss.\n\nTwo-drink minimum. No photography or recording. Arrive early — seating is first come, first served.`,\n\tageRestriction: 18,\n\tdisplayAgeRestriction: true,\n\tdisplayStartTime: true,\n\tdisplayEndTime: true,\n\tdisplayDoorsTime: true,\n\tperformers: [\n\t\t...mockPerformers,\n\t\t{\n\t\t\tid: 4,\n\t\t\tdisplayName: 'Bobby Lee',\n\t\t\tprofileImage: 'https://images.unsplash.com/photo-1472099645785-5658abf4ff4e?w=200&h=200&fit=crop'\n\t\t},\n\t\t{\n\t\t\tid: 5,\n\t\t\tdisplayName: 'Andrew Santino',\n\t\t\tprofileImage: 'https://images.unsplash.com/photo-1500648767791-00dcc994a43e?w=200&h=200&fit=crop'\n\t\t},\n\t\t{\n\t\t\tid: 6,\n\t\t\tdisplayName: 'Hasan Minhaj',\n\t\t\tprofileImage: 'https://images.unsplash.com/photo-1519085360753-af0119f7cbe7?w=200&h=200&fit=crop'\n\t\t}\n\t]\n};\n\n// --- Wide/Panoramic Image Event (tests min-height behavior) ---\nexport const mockWideImageEvent: EventData = {\n\t...mockEvent,\n\tid: 2421,\n\ttitle: 'Sunset Sessions: Rooftop Jazz & Cocktails',\n\tslug: 'sunset-sessions-rooftop-jazz',\n\timageUrl: '/posters/Wide.jpg',\n\tdescription: `Join us on the rooftop for an evening of smooth jazz, craft cocktails, and stunning sunset views over the city. Featuring a rotating cast of LA's finest jazz musicians in an intimate outdoor setting.\n\nFull bar available with specialty cocktails curated for the evening. Light bites and small plates from our kitchen. Dress code: smart casual.`,\n\tdisplayStartTime: true,\n\tdisplayEndTime: true,\n\tdisplayDoorsTime: true\n};\n\n// --- Password Protected Event ---\nexport const mockPasswordEvent: EventData = {\n\t...mockEvent,\n\tid: 2409,\n\ttitle: 'Secret Comedy Club',\n\tslug: 'secret-comedy-club',\n\timageUrl: '/posters/luke-null-tall.webp', // tall portrait 625×937\n\tdescription: 'An exclusive underground comedy experience. Password required.',\n\tisPasswordProtected: true,\n\tstatus: 'on_sale'\n};\n","// Premium Ticket Experience — Constants & Defaults\n// Used by all design variants. DO NOT MODIFY per-variant.\n\nimport type { EventData, TicketTypeData, ScarcityLevel, CtaConfig, PromoCodeState } from './types';\nimport { computeCtaState } from '$lib/utils/api.js';\nimport {\n\tformatFullDate,\n\tformatFullDateCompact,\n\tformatEventTime,\n\tformatTimeRange,\n\tformatDoorsTime,\n\tformatSalesDate,\n\tformatBrowseDate,\n\tformatEventDate,\n\tformatCleanTimeRange,\n\tgetDateParts\n} from '$lib/utils/datetime.js';\n\n// --- Re-export production date/time formatters (timezone-aware) ---\nexport {\n\tformatFullDate,\n\tformatFullDateCompact,\n\tformatEventTime,\n\tformatTimeRange,\n\tformatDoorsTime,\n\tformatSalesDate,\n\tformatBrowseDate,\n\tformatEventDate,\n\tformatCleanTimeRange,\n\tgetDateParts\n};\n\n// --- Scarcity Badge Rules (from SCARCITY-BADGE-RULES.md) ---\nexport const SCARCITY_THRESHOLDS = {\n\tSOLD_OUT: 0,\n\tURGENT: 0.10, // ≤10% remaining → urgent\n\tLOW: 0.15, // ≤15% remaining → low (research: lowered from 25%)\n\tMAX_EXACT_COUNT: 20, // Don't show exact count above 20\n\tABSOLUTE_CAP: 30, // Sliding scale: never trigger above 30 remaining\n\tABSOLUTE_FLOOR: 5 // Sliding scale: always trigger at 5 or fewer\n} as const;\n\n/**\n * Sliding scale threshold — adjusts percentage thresholds for pool size.\n * Large venues: caps at 30 remaining (e.g. 1000-seat venue triggers at 3%, not 15%).\n * Small venues: floors at 5 remaining (e.g. 50-seat venue triggers at 10%, not 15%).\n */\nfunction getEffectiveThreshold(basePct: number, total: number): number {\n\tif (total === 0) return 0;\n\tconst capPct = SCARCITY_THRESHOLDS.ABSOLUTE_CAP / total;\n\tconst floorPct = SCARCITY_THRESHOLDS.ABSOLUTE_FLOOR / total;\n\treturn Math.max(Math.min(basePct, capPct), floorPct);\n}\n\nexport function getScarcityLevel(remaining: number, total: number): ScarcityLevel {\n\tif (total === 0) return 'none';\n\tif (remaining <= 0) return 'sold_out';\n\tconst pct = remaining / total;\n\tif (pct <= getEffectiveThreshold(SCARCITY_THRESHOLDS.URGENT, total)) return 'urgent';\n\tif (pct <= getEffectiveThreshold(SCARCITY_THRESHOLDS.LOW, total)) return 'low';\n\treturn 'none';\n}\n\nexport function getScarcityText(\n\tlevel: ScarcityLevel,\n\tremaining: number,\n\tcontext: 'browse' | 'event' | 'ticket',\n\toptions?: { isFree?: boolean }\n): string | null {\n\tif (level === 'none') return null;\n\tif (level === 'sold_out') return 'Sold out';\n\t// No scarcity badges on free events/tickets — nothing to lose = no urgency\n\tif (options?.isFree) return null;\n\tif (level === 'urgent' && context !== 'browse' && remaining <= SCARCITY_THRESHOLDS.MAX_EXACT_COUNT) {\n\t\treturn `Only ${remaining} left`;\n\t}\n\tif (level === 'low' || level === 'urgent') return 'Few tickets left';\n\treturn null;\n}\n\n// --- CTA Rules ---\n// Delegates to production computeCtaState() but adapts our EventData shape.\n// Components keep calling getCtaConfig(event) — internal logic is production-aligned.\nexport function getCtaConfig(event: EventData): CtaConfig {\n\t// Map our EventData tickets to the shape computeCtaState expects\n\tconst apiTickets = event.tickets.map((t) => ({\n\t\tsalesBegin: t.salesStartDate,\n\t\tsalesEnd: t.salesEndDate,\n\t\tremainingCapacity: t.quantityAvailable,\n\t\ttotalCapacity: t.quantityTotal,\n\t\tsoldOut: t.status === 'sold_out',\n\t\tsalesChannel: 1 // All our tickets are online (not \"at the door only\")\n\t}));\n\n\t// Handle statuses that computeCtaState doesn't compute from tickets\n\tif (event.status === 'cancelled') {\n\t\treturn { text: 'Cancelled', disabled: true, reason: 'This event has been cancelled' };\n\t}\n\tif (event.status === 'past') {\n\t\treturn { text: 'Event ended', disabled: true, reason: 'This event has ended' };\n\t}\n\n\tconst result = computeCtaState(\n\t\t{ startDateTime: event.startDateTime, endDateTime: event.endDateTime },\n\t\tapiTickets,\n\t\t{ cancelled: false, isRegistration: event.isRegistrationEvent, waitlistEnabled: false }\n\t);\n\n\treturn {\n\t\ttext: result.text,\n\t\tdisabled: result.disabled,\n\t\treason: result.disabled ? result.reason : undefined\n\t};\n}\n\n// --- Price Display Rules (from DECISIONS.md #1) ---\nexport function getPriceDisplay(event: EventData): string | null {\n\tconst visibleTickets = event.tickets.filter(\n\t\t(t) => t.status === 'on_sale' && !t.isHidden\n\t);\n\tif (visibleTickets.length === 0) return null;\n\n\tconst hasDonation = visibleTickets.some((t) => t.isDonation || t.ticketType === 2);\n\tconst paidTickets = visibleTickets.filter((t) => !t.isDonation && t.ticketType !== 2);\n\tconst hasFree = paidTickets.some((t) => t.price === 0);\n\tconst pricedTickets = paidTickets.filter((t) => t.price > 0);\n\n\t// Only donation tickets → \"Donation\"\n\tif (pricedTickets.length === 0 && !hasFree && hasDonation) return 'Donation';\n\n\t// Only free tickets (no paid, no donation) → null (BookingWidget shows \"Free\" via isFreeEvent)\n\tif (pricedTickets.length === 0 && hasFree) return null;\n\n\tconst minPrice = Math.min(...pricedTickets.map((t) => t.price));\n\n\t// Free + paid → \"Free\" (free dominates the display)\n\tif (hasFree) return null;\n\n\t// Donation + paid → \"From $X\" (donation is an alternative option)\n\tif (hasDonation) return `From $${minPrice}`;\n\n\t// Single paid ticket type → \"$X\"\n\tif (pricedTickets.length === 1) return `$${minPrice}`;\n\n\t// Multiple paid ticket types → \"From $X\"\n\treturn `From $${minPrice}`;\n}\n\n// --- Fee Calculation ---\nexport function calculateFee(price: number, feePercentage: number, feeCents: number): number {\n\treturn Math.round(price * (feePercentage / 100) * 100) / 100 + feeCents;\n}\n\nexport function calculateTax(amount: number, taxPercentage: number): number {\n\treturn Math.round(amount * (taxPercentage / 100) * 100) / 100;\n}\n\n// --- Date Formatting ---\n// PREFERRED: Use the timezone-aware production formatters re-exported above:\n// formatBrowseDate(iso, tz) → \"Fri, Feb 20\"\n// formatFullDateCompact(iso, tz) → \"Friday, February 20\"\n// formatEventTime(iso, tz) → \"8:00 PM\"\n// formatTimeRange(start, end, tz) → \"8:00 PM - 10:00 PM\"\n// formatDoorsTime(doors, tz) → \"7:00 PM\"\n//\n// DEPRECATED: The functions below are backward-compatible wrappers for variants\n// not yet migrated to timezone-aware formatters. They use browser-local timezone.\n// Migrate to the production formatters above when updating each variant.\n\n/** @deprecated Use formatBrowseDate(dateStr, timezone) instead */\nexport function formatDate(dateStr: string): string {\n\treturn formatBrowseDate(dateStr, Intl.DateTimeFormat().resolvedOptions().timeZone);\n}\n\n/** @deprecated Use formatEventTime(dateStr, timezone) instead */\nexport function formatTime(dateStr: string): string {\n\treturn formatEventTime(dateStr, Intl.DateTimeFormat().resolvedOptions().timeZone);\n}\n\n/** @deprecated Use formatBrowseDate + formatTimeRange instead */\nexport function formatDateRange(start: string, end: string): string {\n\tconst tz = Intl.DateTimeFormat().resolvedOptions().timeZone;\n\treturn `${formatBrowseDate(start, tz)} · ${formatTimeRange(start, end, tz)}`;\n}\n\n// --- Animation Durations ---\nexport const DURATION = {\n\tinstant: 100,\n\tmicro: 150,\n\tfast: 200,\n\tnormal: 300,\n\tslow: 400,\n\telaborate: 600\n} as const;\n\n// --- Smart Sales Date Formatting ---\n// Ported from production TicketBlock.svelte — smart thresholds for human-readable dates\nexport function formatSmartSalesDate(dateStr: string): string {\n\tif (!dateStr) return '';\n\tconst date = new Date(dateStr);\n\tconst now = new Date();\n\tconst diffMs = date.getTime() - now.getTime();\n\tconst diffMinutes = Math.round(diffMs / (1000 * 60));\n\tconst diffHours = diffMs / (1000 * 60 * 60);\n\n\t// < 1 hour: \"in X minutes\"\n\tif (diffMinutes > 0 && diffMinutes < 60) {\n\t\tconst mins = Math.max(1, diffMinutes);\n\t\treturn `in ${mins} minute${mins !== 1 ? 's' : ''}`;\n\t}\n\n\t// 1-24 hours: \"in X hours\"\n\tif (diffHours > 0 && diffHours < 24) {\n\t\tconst hours = Math.max(1, Math.round(diffHours));\n\t\treturn `in ${hours} hour${hours !== 1 ? 's' : ''}`;\n\t}\n\n\t// Tomorrow: \"tomorrow at X PM\"\n\tconst tomorrow = new Date(now);\n\ttomorrow.setDate(tomorrow.getDate() + 1);\n\tif (date.toDateString() === tomorrow.toDateString()) {\n\t\tconst timeStr = date.toLocaleTimeString('en-US', { hour: 'numeric', minute: '2-digit' });\n\t\treturn `tomorrow at ${timeStr}`;\n\t}\n\n\t// 2-7 days: \"on Friday at X PM\"\n\tconst diffDays = diffMs / (1000 * 60 * 60 * 24);\n\tif (diffDays > 0 && diffDays <= 7) {\n\t\tconst dayName = new Intl.DateTimeFormat('en-US', { weekday: 'long' }).format(date);\n\t\tconst timeStr = date.toLocaleTimeString('en-US', { hour: 'numeric', minute: '2-digit' });\n\t\treturn `on ${dayName} at ${timeStr}`;\n\t}\n\n\t// > 7 days: \"on Mar 15\"\n\tconst dateFormatted = new Intl.DateTimeFormat('en-US', { month: 'short', day: 'numeric' }).format(date);\n\treturn `on ${dateFormatted}`;\n}\n\n// --- Promo Code State Factory ---\nexport function createDefaultPromoState(): PromoCodeState {\n\treturn {\n\t\tcode: '',\n\t\tisApplied: false,\n\t\tisValidating: false,\n\t\terror: '',\n\t\thint: '',\n\t\tdiscountAmount: 0,\n\t\tdiscountType: '',\n\t\tdiscountTicketIds: [],\n\t\trevealHiddenTickets: false,\n\t\trevealTicketIds: []\n\t};\n}\n\n// --- Ticket helpers ---\nexport function getAvailableTickets(tickets: TicketTypeData[]): TicketTypeData[] {\n\treturn tickets.filter((t) => !t.isHidden && t.status === 'on_sale');\n}\n","\n export const browser = typeof window !== 'undefined';\n export const dev = false;\n export const building = false;\n export const version = '';\n ","/**\n * Stripe Theme Utility\n *\n * Provides reactive dark mode detection for Stripe Elements.\n * Automatically watches for theme changes via MutationObserver.\n *\n * @example\n * ```svelte\n * <script>\n * import { useStripeTheme } from '@getmicdrop/svelte-components/stripe';\n *\n * const stripeTheme = useStripeTheme();\n * // stripeTheme.current is 'stripe' | 'night'\n * // Automatically updates when theme changes\n * </script>\n *\n * <Elements theme={stripeTheme.current} {stripe} clientSecret={paymentIntent}>\n * <PaymentElement />\n * </Elements>\n * ```\n */\nimport { onMount, onDestroy } from 'svelte';\n/**\n * Detects if dark mode is active.\n *\n * Checks in order:\n * 1. localStorage 'theme' value\n * 2. Container element classes (.dark, [data-theme=\"dark\"])\n * 3. System preference (prefers-color-scheme)\n */\nexport function detectDarkMode(containerSelector) {\n if (typeof window === 'undefined')\n return false;\n try {\n // Check localStorage first\n const saved = localStorage.getItem('theme');\n if (saved === 'dark')\n return true;\n if (saved === 'light')\n return false;\n // Check for dark class on common containers\n const selector = containerSelector || '.dark, .light, .micdrop, [data-theme]';\n const containers = document.querySelectorAll(selector);\n for (const container of containers) {\n if (container.classList.contains('dark'))\n return true;\n if (container.getAttribute('data-theme') === 'dark')\n return true;\n }\n // Check document root\n if (document.documentElement.classList.contains('dark'))\n return true;\n if (document.documentElement.getAttribute('data-theme') === 'dark')\n return true;\n // Fallback to system preference\n return window.matchMedia?.('(prefers-color-scheme: dark)')?.matches ?? false;\n }\n catch {\n return false;\n }\n}\n/**\n * Maps dark mode state to Stripe theme.\n */\nexport function getStripeTheme(isDark) {\n return isDark ? 'night' : 'stripe';\n}\n/**\n * Creates a reactive Stripe theme that watches for dark mode changes.\n *\n * Returns an object with a `current` property that is reactive and\n * automatically updates when the theme changes.\n *\n * @example\n * ```svelte\n * <script>\n * import { useStripeTheme } from '@getmicdrop/svelte-components/stripe';\n * const stripeTheme = useStripeTheme();\n * </script>\n *\n * <Elements theme={stripeTheme.current} ...>\n * ```\n */\nexport function useStripeTheme(options = {}) {\n const { containerSelector = '.dark, .light, .micdrop, [data-theme]', watchChanges = true, fallback = 'stripe', } = options;\n let current = $state(fallback);\n let observer = null;\n function updateTheme() {\n current = getStripeTheme(detectDarkMode(containerSelector));\n }\n onMount(() => {\n // Initial detection\n updateTheme();\n if (watchChanges && typeof MutationObserver !== 'undefined') {\n // Watch for class changes on potential theme containers\n const containers = document.querySelectorAll(containerSelector);\n const root = document.documentElement;\n observer = new MutationObserver(() => {\n updateTheme();\n });\n // Observe document root\n observer.observe(root, {\n attributes: true,\n attributeFilter: ['class', 'data-theme'],\n });\n // Observe other containers\n containers.forEach(container => {\n observer?.observe(container, {\n attributes: true,\n attributeFilter: ['class', 'data-theme'],\n });\n });\n // Also listen for system preference changes\n const mediaQuery = window.matchMedia('(prefers-color-scheme: dark)');\n mediaQuery.addEventListener('change', updateTheme);\n }\n });\n onDestroy(() => {\n if (observer) {\n observer.disconnect();\n observer = null;\n }\n });\n return {\n get current() {\n return current;\n },\n /** Force refresh the theme detection */\n refresh: updateTheme,\n };\n}\n/**\n * Simple synchronous dark mode detection without reactivity.\n * Use this when you only need a one-time check.\n */\nexport function getInitialStripeTheme(containerSelector) {\n return getStripeTheme(detectDarkMode(containerSelector));\n}\n","<script lang=\"ts\">\n\timport { Time } from 'carbon-icons-svelte';\n\timport { Text } from '@getmicdrop/svelte-components';\n\n\tinterface Props {\n\t\tseconds: number;\n\t\tisUrgent: boolean;\n\t}\n\n\tlet { seconds, isUrgent }: Props = $props();\n\n\tlet display = $derived((() => {\n\t\tconst m = Math.floor(seconds / 60);\n\t\tconst s = seconds % 60;\n\t\treturn `${m.toString().padStart(2, '0')}:${s.toString().padStart(2, '0')}`;\n\t})());\n\n\tlet label = $derived(isUrgent ? 'Complete soon' : 'Reservation held');\n</script>\n\n<div class=\"timer-display\" class:urgent={isUrgent}>\n\t<Time size={16} class=\"shrink-0\" />\n\t<Text size=\"sm\" class=\"font-medium tabular-nums\">\n\t\t{label} · {display}\n\t</Text>\n</div>\n\n<style>\n\t@reference \"../../../../app.css\";\n\n\t.timer-display {\n\t\t@apply inline-flex items-center gap-2 text-color-secondary;\n\t}\n\n\t.timer-display.urgent {\n\t\t@apply text-orange-500;\n\t}\n\n\t:global(.dark) .timer-display.urgent {\n\t\t@apply text-orange-400;\n\t}\n</style>\n","<script lang=\"ts\">\n\timport { onMount } from 'svelte';\n\timport { browser } from '$app/environment';\n\timport { ChevronLeft, Warning } from 'carbon-icons-svelte';\n\timport { Button, Heading, Text, Input, Checkbox } from '@getmicdrop/svelte-components';\n\timport { useStripeTheme } from '@getmicdrop/svelte-components/stripe';\n\timport type { EventData, OrderTotals, CheckoutFormData } from '$lib/premium-ticket-experience/types';\n\timport CheckoutTimer from './CheckoutTimer.svelte';\n\n\tinterface Props {\n\t\tevent: EventData;\n\t\torderTotals: OrderTotals;\n\t\ttimerSeconds: number;\n\t\tisExpired: boolean;\n\t\tisRegistration: boolean;\n\t\tisFreeOrder: boolean;\n\t\tpromoApplied: boolean;\n\t\tpromoDiscount: number;\n\t\tonBack: () => void;\n\t\tonPlaceOrder: (formData: CheckoutFormData) => void;\n\t\tprocessing: boolean;\n\t\t/** Incremented by parent to trigger form validation + submit from external buttons (sidebar, mobile footer) */\n\t\tsubmitRequested: number;\n\t\t/** Stripe instance for production mode (absence = showcase mock inputs) */\n\t\tstripe?: any;\n\t\t/** Stripe client secret for PaymentElement */\n\t\tpaymentIntent?: string;\n\t\t/** Bindable Stripe elements reference for the wrapper to use during payment confirmation */\n\t\telements?: any;\n\t\t/** Payment error message from the wrapper */\n\t\tpaymentError?: string;\n\t}\n\n\tlet {\n\t\tevent,\n\t\torderTotals,\n\t\ttimerSeconds,\n\t\tisExpired,\n\t\tisRegistration,\n\t\tisFreeOrder,\n\t\tpromoApplied,\n\t\tpromoDiscount,\n\t\tonBack,\n\t\tonPlaceOrder,\n\t\tprocessing,\n\t\tsubmitRequested,\n\t\tstripe = undefined,\n\t\tpaymentIntent = undefined,\n\t\telements = $bindable(undefined),\n\t\tpaymentError = '',\n\t}: Props = $props();\n\n\t// Dynamic imports for Stripe components (same pattern as PaymentSection.svelte)\n\tlet StripeElementsComp = $state<any>(null);\n\tlet PaymentElementComp = $state<any>(null);\n\n\tconst stripeTheme = useStripeTheme({\n\t\tcontainerSelector: '.light, .dark, .micdrop, [data-theme]',\n\t});\n\n\tonMount(async () => {\n\t\tif (stripe && paymentIntent) {\n\t\t\ttry {\n\t\t\t\tconst mod = await import('svelte-stripe');\n\t\t\t\tStripeElementsComp = mod.Elements;\n\t\t\t\tPaymentElementComp = mod.PaymentElement;\n\t\t\t} catch (err) {\n\t\t\t\tconsole.error('Failed to load Stripe components:', err);\n\t\t\t}\n\t\t}\n\t});\n\n\t// --- Form state ---\n\tlet firstName = $state('');\n\tlet lastName = $state('');\n\tlet email = $state('');\n\tlet keepUpdated = $state(false);\n\tlet agreeTerms = $state(false);\n\n\t// Payment fields (mock)\n\tlet cardNumber = $state('');\n\tlet cardExpiry = $state('');\n\tlet cardCvc = $state('');\n\n\t// Per-ticket attendee fields (for registration events)\n\tlet attendees = $state<Array<{\n\t\tfirstName: string;\n\t\tlastName: string;\n\t\temail: string;\n\t\tsameAsPurchaser: boolean;\n\t}>>([]);\n\n\t// Validation state\n\tlet submitted = $state(false);\n\tlet errors = $derived((() => {\n\t\tif (!submitted) return {};\n\t\tconst e: Record<string, string> = {};\n\t\tif (!firstName.trim()) e.firstName = 'First name is required';\n\t\tif (!lastName.trim()) e.lastName = 'Last name is required';\n\t\tif (!email.trim()) e.email = 'Email is required';\n\t\telse if (!/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(email)) e.email = 'Enter a valid email address';\n\t\tif (!isFreeOrder && !stripe) {\n\t\t\t// Only validate mock card fields in showcase mode\n\t\t\tif (!cardNumber.trim()) e.cardNumber = 'Card number is required';\n\t\t\tif (!cardExpiry.trim()) e.cardExpiry = 'Expiry date is required';\n\t\t\tif (!cardCvc.trim()) e.cardCvc = 'CVC is required';\n\t\t}\n\t\tif (!agreeTerms) e.agreeTerms = 'You must agree to the terms';\n\n\t\t// Validate attendee fields for registration events\n\t\tif (isRegistration) {\n\t\t\tfor (let i = 0; i < attendees.length; i++) {\n\t\t\t\tconst att = attendees[i];\n\t\t\t\tif (!att.sameAsPurchaser) {\n\t\t\t\t\tif (!att.firstName.trim()) e[`attendee_${i}_firstName`] = 'First name is required';\n\t\t\t\t\tif (!att.lastName.trim()) e[`attendee_${i}_lastName`] = 'Last name is required';\n\t\t\t\t\tif (!att.email.trim()) e[`attendee_${i}_email`] = 'Email is required';\n\t\t\t\t\telse if (!/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(att.email)) e[`attendee_${i}_email`] = 'Enter a valid email';\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn e;\n\t})());\n\n\tlet hasErrors = $derived(Object.keys(errors).length > 0);\n\n\tlet isTimerUrgent = $derived(timerSeconds > 0 && timerSeconds <= 120);\n\n\t// Initialize attendee list based on order lines\n\t$effect(() => {\n\t\tif (isRegistration) {\n\t\t\tconst totalTickets = orderTotals.lines.reduce((sum, l) => sum + l.quantity, 0);\n\t\t\tif (attendees.length !== totalTickets) {\n\t\t\t\tattendees = Array.from({ length: totalTickets }, (_, i) => ({\n\t\t\t\t\tfirstName: '',\n\t\t\t\t\tlastName: '',\n\t\t\t\t\temail: '',\n\t\t\t\t\tsameAsPurchaser: i === 0\n\t\t\t\t}));\n\t\t\t}\n\t\t}\n\t});\n\n\t// Watch for external submit requests (from sidebar/mobile footer buttons)\n\tlet lastSubmitRequest = $state(0);\n\t$effect(() => {\n\t\tif (submitRequested > lastSubmitRequest) {\n\t\t\tlastSubmitRequest = submitRequested;\n\t\t\thandleSubmit();\n\t\t}\n\t});\n\n\tfunction handleSameAsPurchaser(index: number, checked: boolean) {\n\t\tattendees = attendees.map((att, i) => {\n\t\t\tif (i !== index) return att;\n\t\t\treturn {\n\t\t\t\t...att,\n\t\t\t\tsameAsPurchaser: checked,\n\t\t\t\tfirstName: checked ? firstName : att.firstName,\n\t\t\t\tlastName: checked ? lastName : att.lastName,\n\t\t\t\temail: checked ? email : att.email\n\t\t\t};\n\t\t});\n\t}\n\n\tfunction handleSubmit() {\n\t\tsubmitted = true;\n\t\tif (hasErrors) return;\n\t\tonPlaceOrder({\n\t\t\tfirstName,\n\t\t\tlastName,\n\t\t\temail,\n\t\t\tkeepMeUpdated: keepUpdated,\n\t\t\tattendees: isRegistration ? attendees.map(a => ({\n\t\t\t\tfirstName: a.sameAsPurchaser ? firstName : a.firstName,\n\t\t\t\tlastName: a.sameAsPurchaser ? lastName : a.lastName,\n\t\t\t\temail: a.sameAsPurchaser ? email : a.email,\n\t\t\t\tsameAsPurchaser: a.sameAsPurchaser,\n\t\t\t})) : undefined,\n\t\t});\n\t}\n</script>\n\n<div class=\"space-y-6\">\n\t<!-- Timer header bar -->\n\t<div class=\"timer-header\">\n\t\t<Button\n\t\t\tvariant=\"icon\"\n\t\t\tsize=\"icon-sm\"\n\t\t\tonclick={onBack}\n\t\t\taria-label=\"Go back\"\n\t\t>\n\t\t\t<ChevronLeft size={20} />\n\t\t</Button>\n\t\t<CheckoutTimer seconds={timerSeconds} isUrgent={isTimerUrgent} />\n\t</div>\n\n\t<!-- Personal details -->\n\t<section class=\"space-y-4\">\n\t\t<Heading level={2} size=\"lg\" weight=\"semibold\">\n\t\t\tYour details\n\t\t</Heading>\n\n\t\t<div class=\"grid grid-cols-1 sm:grid-cols-2 gap-4\">\n\t\t\t<Input\n\t\t\t\tlabel=\"First name\"\n\t\t\t\tplaceholder=\"First name\"\n\t\t\t\trequired\n\t\t\t\tbind:value={firstName}\n\t\t\t\terrorText={errors.firstName ?? ''}\n\t\t\t\tcolor={errors.firstName ? 'red' : 'base'}\n\t\t\t/>\n\t\t\t<Input\n\t\t\t\tlabel=\"Last name\"\n\t\t\t\tplaceholder=\"Last name\"\n\t\t\t\trequired\n\t\t\t\tbind:value={lastName}\n\t\t\t\terrorText={errors.lastName ?? ''}\n\t\t\t\tcolor={errors.lastName ? 'red' : 'base'}\n\t\t\t/>\n\t\t</div>\n\n\t\t<Input\n\t\t\tlabel=\"Email address\"\n\t\t\ttype=\"email\"\n\t\t\tplaceholder=\"you@example.com\"\n\t\t\trequired\n\t\t\tbind:value={email}\n\t\t\terrorText={errors.email ?? ''}\n\t\t\tcolor={errors.email ? 'red' : 'base'}\n\t\t/>\n\n\t\t<Checkbox bind:checked={keepUpdated}>\n\t\t\tKeep me updated about this event and similar events\n\t\t</Checkbox>\n\t</section>\n\n\t<!-- Per-ticket attendee details (registration events) -->\n\t{#if isRegistration && attendees.length > 0}\n\t\t<section class=\"space-y-5\">\n\t\t\t<Heading level={2} size=\"lg\" weight=\"semibold\">\n\t\t\t\tAttendee details\n\t\t\t</Heading>\n\n\t\t\t{#each attendees as attendee, i}\n\t\t\t\t<div class=\"attendee-card\">\n\t\t\t\t\t<div class=\"flex items-center justify-between mb-3\">\n\t\t\t\t\t\t<Text size=\"sm\" class=\"font-semibold\">\n\t\t\t\t\t\t\tAttendee {i + 1}\n\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t<Checkbox\n\t\t\t\t\t\t\tchecked={attendee.sameAsPurchaser}\n\t\t\t\t\t\t\tonchange={({ checked }) => handleSameAsPurchaser(i, checked)}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\tSame as purchaser\n\t\t\t\t\t\t</Checkbox>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<div class=\"space-y-3\">\n\t\t\t\t\t\t<div class=\"grid grid-cols-1 sm:grid-cols-2 gap-3\">\n\t\t\t\t\t\t\t<Input\n\t\t\t\t\t\t\t\tlabel=\"First name\"\n\t\t\t\t\t\t\t\tplaceholder=\"First name\"\n\t\t\t\t\t\t\t\trequired\n\t\t\t\t\t\t\t\tdisabled={attendee.sameAsPurchaser}\n\t\t\t\t\t\t\t\tbind:value={attendee.firstName}\n\t\t\t\t\t\t\t\terrorText={!attendee.sameAsPurchaser ? (errors[`attendee_${i}_firstName`] ?? '') : ''}\n\t\t\t\t\t\t\t\tcolor={!attendee.sameAsPurchaser && errors[`attendee_${i}_firstName`] ? 'red' : 'base'}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t<Input\n\t\t\t\t\t\t\t\tlabel=\"Last name\"\n\t\t\t\t\t\t\t\tplaceholder=\"Last name\"\n\t\t\t\t\t\t\t\trequired\n\t\t\t\t\t\t\t\tdisabled={attendee.sameAsPurchaser}\n\t\t\t\t\t\t\t\tbind:value={attendee.lastName}\n\t\t\t\t\t\t\t\terrorText={!attendee.sameAsPurchaser ? (errors[`attendee_${i}_lastName`] ?? '') : ''}\n\t\t\t\t\t\t\t\tcolor={!attendee.sameAsPurchaser && errors[`attendee_${i}_lastName`] ? 'red' : 'base'}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<Input\n\t\t\t\t\t\t\tlabel=\"Email\"\n\t\t\t\t\t\t\ttype=\"email\"\n\t\t\t\t\t\t\tplaceholder=\"attendee@example.com\"\n\t\t\t\t\t\t\trequired\n\t\t\t\t\t\t\tdisabled={attendee.sameAsPurchaser}\n\t\t\t\t\t\t\tbind:value={attendee.email}\n\t\t\t\t\t\t\terrorText={!attendee.sameAsPurchaser ? (errors[`attendee_${i}_email`] ?? '') : ''}\n\t\t\t\t\t\t\tcolor={!attendee.sameAsPurchaser && errors[`attendee_${i}_email`] ? 'red' : 'base'}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t{/each}\n\t\t</section>\n\t{/if}\n\n\t<!-- Payment section -->\n\t<section class=\"space-y-4\">\n\t\t{#if isFreeOrder}\n\t\t\t<div class=\"free-order-notice\">\n\t\t\t\t<Text size=\"sm\" color=\"secondary\" class=\"font-medium block\">\n\t\t\t\t\tNo payment required\n\t\t\t\t</Text>\n\t\t\t\t<Text size=\"xs\" color=\"muted\" class=\"block mt-1\">\n\t\t\t\t\tThis is a free event. Complete the form above to reserve your spot.\n\t\t\t\t</Text>\n\t\t\t</div>\n\t\t{:else if stripe && paymentIntent}\n\t\t\t<!-- Production: Real Stripe PaymentElement -->\n\t\t\t<Heading level={2} size=\"lg\" weight=\"semibold\">\n\t\t\t\tPayment\n\t\t\t</Heading>\n\t\t\t{#if browser && StripeElementsComp && PaymentElementComp}\n\t\t\t\t<svelte:component\n\t\t\t\t\tthis={StripeElementsComp}\n\t\t\t\t\ttheme={stripeTheme.current}\n\t\t\t\t\t{stripe}\n\t\t\t\t\tclientSecret={paymentIntent}\n\t\t\t\t\tbind:elements\n\t\t\t\t>\n\t\t\t\t\t<svelte:component this={PaymentElementComp} />\n\t\t\t\t</svelte:component>\n\t\t\t{:else}\n\t\t\t\t<p class=\"text-sm text-color-muted py-2\">Loading secure payment form...</p>\n\t\t\t{/if}\n\t\t\t{#if paymentError}\n\t\t\t\t<p class=\"text-sm text-red-500 mt-2\">{paymentError}</p>\n\t\t\t{/if}\n\t\t{:else}\n\t\t\t<!-- Showcase: Mock card inputs -->\n\t\t\t<Heading level={2} size=\"lg\" weight=\"semibold\">\n\t\t\t\tPayment\n\t\t\t</Heading>\n\n\t\t\t<Input\n\t\t\t\tlabel=\"Card number\"\n\t\t\t\tplaceholder=\"4242 4242 4242 4242\"\n\t\t\t\ttype=\"creditCardNumber\"\n\t\t\t\trequired\n\t\t\t\tbind:value={cardNumber}\n\t\t\t\terrorText={errors.cardNumber ?? ''}\n\t\t\t\tcolor={errors.cardNumber ? 'red' : 'base'}\n\t\t\t/>\n\n\t\t\t<div class=\"grid grid-cols-2 gap-4\">\n\t\t\t\t<Input\n\t\t\t\t\tlabel=\"Expiry date\"\n\t\t\t\t\tplaceholder=\"MM / YY\"\n\t\t\t\t\trequired\n\t\t\t\t\tbind:value={cardExpiry}\n\t\t\t\t\terrorText={errors.cardExpiry ?? ''}\n\t\t\t\t\tcolor={errors.cardExpiry ? 'red' : 'base'}\n\t\t\t\t/>\n\t\t\t\t<Input\n\t\t\t\t\tlabel=\"CVC\"\n\t\t\t\t\tplaceholder=\"123\"\n\t\t\t\t\trequired\n\t\t\t\t\tmaxlength={4}\n\t\t\t\t\tbind:value={cardCvc}\n\t\t\t\t\terrorText={errors.cardCvc ?? ''}\n\t\t\t\t\tcolor={errors.cardCvc ? 'red' : 'base'}\n\t\t\t\t/>\n\t\t\t</div>\n\t\t{/if}\n\t</section>\n\n\t<!-- Terms -->\n\t<section class=\"space-y-2\">\n\t\t<Checkbox bind:checked={agreeTerms}>\n\t\t\tI agree to the terms and conditions\n\t\t</Checkbox>\n\t\t{#if errors.agreeTerms}\n\t\t\t<div class=\"flex items-center gap-1.5\">\n\t\t\t\t<Warning size={16} class=\"text-red-500 shrink-0\" />\n\t\t\t\t<Text size=\"xs\" class=\"text-red-500\">{errors.agreeTerms}</Text>\n\t\t\t</div>\n\t\t{/if}\n\t</section>\n\n\t<!-- Mobile submit is handled by CheckoutMobileFooter -->\n</div>\n\n<style>\n\t@reference \"../../../../app.css\";\n\n\t.timer-header {\n\t\t@apply flex items-center gap-3 py-3 px-4 -mx-4 border-b border-default bg-surface-secondary rounded-t-lg;\n\t}\n\n\t.attendee-card {\n\t\t@apply p-4 rounded-lg border border-default bg-surface-secondary;\n\t}\n\n\t.free-order-notice {\n\t\t@apply p-4 rounded-lg border border-default bg-surface-secondary;\n\t}\n</style>\n","<script lang=\"ts\">\n\timport { Text } from '@getmicdrop/svelte-components';\n\timport type { OrderTotals } from '$lib/premium-ticket-experience/types';\n\timport { DURATION } from '$lib/premium-ticket-experience/defaults';\n\n\tinterface Props {\n\t\torderTotals: OrderTotals;\n\t}\n\n\tlet { orderTotals }: Props = $props();\n</script>\n\n<div\n\tclass=\"space-y-2\"\n\tstyle=\"transition-duration: {DURATION.normal}ms;\"\n>\n\t<!-- Line items -->\n\t{#each orderTotals.lines as line (line.ticketId)}\n\t\t<div class=\"flex justify-between\">\n\t\t\t<Text size=\"xs\" color=\"muted\">{line.quantity}x {line.ticketName}</Text>\n\t\t\t<Text size=\"xs\" color=\"muted\">${line.subtotal.toFixed(2)}</Text>\n\t\t</div>\n\t{/each}\n\n\t<!-- Subtotal -->\n\t{#if orderTotals.lines.length > 1}\n\t\t<div class=\"flex justify-between pt-1 border-t border-default\">\n\t\t\t<Text size=\"xs\" color=\"muted\">Subtotal</Text>\n\t\t\t<Text size=\"xs\" color=\"muted\">${orderTotals.subtotal.toFixed(2)}</Text>\n\t\t</div>\n\t{/if}\n\n\t<!-- Fees -->\n\t{#if orderTotals.fees > 0}\n\t\t<div class=\"flex justify-between\">\n\t\t\t<Text size=\"xs\" color=\"muted\">Service fees</Text>\n\t\t\t<Text size=\"xs\" color=\"muted\">${orderTotals.fees.toFixed(2)}</Text>\n\t\t</div>\n\t{/if}\n\n\t<!-- Taxes -->\n\t{#if orderTotals.taxes > 0}\n\t\t<div class=\"flex justify-between\">\n\t\t\t<Text size=\"xs\" color=\"muted\">Taxes</Text>\n\t\t\t<Text size=\"xs\" color=\"muted\">${orderTotals.taxes.toFixed(2)}</Text>\n\t\t</div>\n\t{/if}\n\n\t<!-- Promo discount -->\n\t{#if orderTotals.promoDiscount > 0}\n\t\t<div class=\"flex justify-between\">\n\t\t\t<Text size=\"xs\" color=\"success\">Promo discount</Text>\n\t\t\t<Text size=\"xs\" color=\"success\">-${orderTotals.promoDiscount.toFixed(2)}</Text>\n\t\t</div>\n\t{/if}\n\n\t<!-- Total -->\n\t<div class=\"flex justify-between pt-2 border-t border-default\">\n\t\t<Text size=\"sm\" class=\"font-semibold\">Total</Text>\n\t\t<Text size=\"sm\" class=\"font-semibold\">${orderTotals.total.toFixed(2)}</Text>\n\t</div>\n</div>\n","<script lang=\"ts\">\n\timport { Calendar } from 'carbon-icons-svelte';\n\timport { Button, Card, Text } from '@getmicdrop/svelte-components';\n\timport type { EventData, OrderTotals } from '$lib/premium-ticket-experience/types';\n\timport { formatBrowseDate, formatEventTime } from '$lib/premium-ticket-experience/defaults';\n\timport OrderSummary from './OrderSummary.svelte';\n\n\tinterface Props {\n\t\tevent: EventData;\n\t\torderTotals: OrderTotals;\n\t\tisFreeOrder: boolean;\n\t\tonPlaceOrder: () => void;\n\t\tprocessing: boolean;\n\t}\n\n\tlet { event, orderTotals, isFreeOrder, onPlaceOrder, processing }: Props = $props();\n</script>\n\n<Card border padding={false} class=\"rounded-xl shadow-lg overflow-hidden bg-surface-secondary\">\n\t<div class=\"p-5 space-y-4\">\n\t\t<!-- Event info -->\n\t\t<div class=\"flex gap-3\">\n\t\t\t<div class=\"shrink-0 w-20 h-14 rounded-lg overflow-hidden bg-surface-tertiary\">\n\t\t\t\t<img\n\t\t\t\t\tsrc={event.imageUrl}\n\t\t\t\t\talt={event.title}\n\t\t\t\t\tclass=\"w-full h-full object-contain\"\n\t\t\t\t/>\n\t\t\t</div>\n\t\t\t<div class=\"flex-1 min-w-0\">\n\t\t\t\t<Text size=\"sm\" class=\"font-semibold block leading-tight line-clamp-2\">\n\t\t\t\t\t{event.title}\n\t\t\t\t</Text>\n\t\t\t\t<div class=\"flex items-center gap-1.5 mt-1\">\n\t\t\t\t\t<Calendar size={16} class=\"shrink-0 icon-muted\" />\n\t\t\t\t\t<Text size=\"xs\" color=\"muted\">\n\t\t\t\t\t\t{formatBrowseDate(event.startDateTime, event.timezone)}\n\t\t\t\t\t\t{#if event.displayStartTime !== false}\n\t\t\t\t\t\t\t· {formatEventTime(event.startDateTime, event.timezone)}\n\t\t\t\t\t\t{/if}\n\t\t\t\t\t</Text>\n\t\t\t\t</div>\n\t\t\t\t<Text size=\"xs\" color=\"muted\" class=\"block mt-0.5\">\n\t\t\t\t\t{event.venue.name}\n\t\t\t\t</Text>\n\t\t\t</div>\n\t\t</div>\n\n\t\t<!-- Divider -->\n\t\t<div class=\"divider\"></div>\n\n\t\t<!-- Order summary -->\n\t\t<OrderSummary {orderTotals} />\n\n\t\t<!-- Place order button -->\n\t\t<Button\n\t\t\tvariant=\"default\"\n\t\t\tsize=\"lg\"\n\t\t\tclass=\"w-full\"\n\t\t\tdisabled={processing}\n\t\t\tloading={processing}\n\t\t\tonclick={onPlaceOrder}\n\t\t>\n\t\t\t{#if processing}\n\t\t\t\tPlacing order...\n\t\t\t{:else if isFreeOrder}\n\t\t\t\tComplete order · Free\n\t\t\t{:else}\n\t\t\t\tPlace order · ${orderTotals.total.toFixed(2)}\n\t\t\t{/if}\n\t\t</Button>\n\t</div>\n</Card>\n","<script lang=\"ts\">\n\timport { Button, Text } from '@getmicdrop/svelte-components';\n\timport type { OrderTotals } from '$lib/premium-ticket-experience/types';\n\n\tinterface Props {\n\t\torderTotals: OrderTotals;\n\t\tisFreeOrder: boolean;\n\t\tonPlaceOrder: () => void;\n\t\tprocessing: boolean;\n\t}\n\n\tlet { orderTotals, isFreeOrder, onPlaceOrder, processing }: Props = $props();\n\n\tlet totalTicketCount = $derived(\n\t\torderTotals.lines.reduce((sum, l) => sum + l.quantity, 0)\n\t);\n</script>\n\n<div\n\tclass=\"fixed bottom-0 left-0 right-0 z-40 md:hidden bg-surface-primary border-t border-default shadow-lg\"\n\tstyle=\"padding-bottom: env(safe-area-inset-bottom, 0px);\"\n>\n\t<div class=\"flex items-center justify-between gap-3 px-4 py-3\">\n\t\t<!-- Left: total info -->\n\t\t<div class=\"flex-1 min-w-0\">\n\t\t\t<Text size=\"sm\" class=\"font-semibold tabular-nums block\">\n\t\t\t\t{#if isFreeOrder}\n\t\t\t\t\t{totalTicketCount} {totalTicketCount === 1 ? 'ticket' : 'tickets'} · Free\n\t\t\t\t{:else}\n\t\t\t\t\t${orderTotals.total.toFixed(2)}\n\t\t\t\t{/if}\n\t\t\t</Text>\n\t\t</div>\n\n\t\t<!-- Right: Place order button -->\n\t\t<Button\n\t\t\tvariant=\"default\"\n\t\t\tsize=\"lg\"\n\t\t\tdisabled={processing}\n\t\t\tloading={processing}\n\t\t\tonclick={onPlaceOrder}\n\t\t\tclass=\"shrink-0 min-w-36\"\n\t\t>\n\t\t\t{#if processing}\n\t\t\t\tPlacing order...\n\t\t\t{:else if isFreeOrder}\n\t\t\t\tComplete order\n\t\t\t{:else}\n\t\t\t\tPlace order\n\t\t\t{/if}\n\t\t</Button>\n\t</div>\n</div>\n\n<style>\n\t@reference \"../../../../app.css\";\n</style>\n","<script lang=\"ts\">\n\timport { Button, Heading, Text } from '@getmicdrop/svelte-components';\n\timport type { EventData, OrderTotals, OrderLine, CheckoutConfig, CheckoutFormData } from '$lib/premium-ticket-experience/types';\n\timport {\n\t\tmockEvent,\n\t\tmockFreeEvent,\n\t\tmockDonationEvent,\n\t\tmockRegistrationEvent\n\t} from '$lib/premium-ticket-experience/mock-data';\n\timport { calculateTax } from '$lib/premium-ticket-experience/defaults';\n\n\timport CheckoutForm from './CheckoutForm.svelte';\n\timport CheckoutSidebar from './CheckoutSidebar.svelte';\n\timport CheckoutMobileFooter from './CheckoutMobileFooter.svelte';\n\timport OrderSummary from './OrderSummary.svelte';\n\n\t// --- DataToggle types ---\n\ttype CheckoutVariant = 'default' | 'free' | 'donation' | 'registration' | 'timer_warning' | 'expired' | 'promo';\n\tlet dataVariant = $state<CheckoutVariant>('default');\n\n\tconst toggleOptions: { value: CheckoutVariant; label: string; color: string }[] = [\n\t\t{ value: 'default', label: 'Standard', color: 'bg-emerald-500' },\n\t\t{ value: 'free', label: 'Free', color: 'bg-sky-500' },\n\t\t{ value: 'donation', label: 'Donation', color: 'bg-pink-500' },\n\t\t{ value: 'registration', label: 'Registration', color: 'bg-indigo-500' },\n\t\t{ value: 'timer_warning', label: 'Timer warning', color: 'bg-orange-500' },\n\t\t{ value: 'expired', label: 'Expired', color: 'bg-red-500' },\n\t\t{ value: 'promo', label: 'Promo discount', color: 'bg-green-500' }\n\t];\n\n\t// --- Props (dual-mode: showcase vs production) ---\n\tinterface Props {\n\t\t/** Pre-built checkout config for production mode. Absence = showcase. */\n\t\tconfig?: CheckoutConfig;\n\t\t/** Production order submission handler. Receives form data for the wrapper to submit. */\n\t\tonPlaceOrder?: (formData: CheckoutFormData) => Promise<void>;\n\t\t/** Production back navigation handler. */\n\t\tonBack?: () => void;\n\t\t/** Production retry handler for expired sessions. */\n\t\tonRetryExpired?: () => void;\n\t\t/** Production session extension handler. */\n\t\tonExtendSession?: () => Promise<void>;\n\t\t/** Stripe instance passed through to CheckoutForm */\n\t\tstripe?: any;\n\t\t/** Stripe client secret passed through to CheckoutForm */\n\t\tpaymentIntent?: string;\n\t\t/** Bindable Stripe elements for wrapper to access */\n\t\telements?: any;\n\t\t/** Payment error message to display */\n\t\tpaymentError?: string;\n\t}\n\n\tlet {\n\t\tconfig: configProp = undefined,\n\t\tonPlaceOrder: onPlaceOrderProp = undefined,\n\t\tonBack: onBackProp = undefined,\n\t\tonRetryExpired: onRetryExpiredProp = undefined,\n\t\tonExtendSession: onExtendSessionProp = undefined,\n\t\tstripe = undefined,\n\t\tpaymentIntent = undefined,\n\t\telements = $bindable(undefined),\n\t\tpaymentError = '',\n\t}: Props = $props();\n\n\tlet isShowcaseMode = $derived(!configProp);\n\n\t// --- Mock order configurations per variant ---\n\tfunction buildConfig(variant: CheckoutVariant): CheckoutConfig {\n\t\tswitch (variant) {\n\t\t\tcase 'free':\n\t\t\t\treturn {\n\t\t\t\t\tevent: mockFreeEvent,\n\t\t\t\t\tlines: [\n\t\t\t\t\t\t{ ticketId: 201, ticketName: 'Free Entry', quantity: 2, unitPrice: 0, fee: 0, subtotal: 0 }\n\t\t\t\t\t],\n\t\t\t\t\ttimerStart: 900,\n\t\t\t\t\tpromoApplied: false,\n\t\t\t\t\tpromoDiscount: 0,\n\t\t\t\t\tforceExpired: false\n\t\t\t\t};\n\n\t\t\tcase 'donation':\n\t\t\t\treturn {\n\t\t\t\t\tevent: mockDonationEvent,\n\t\t\t\t\tlines: [\n\t\t\t\t\t\t{ ticketId: 401, ticketName: 'Donation', quantity: 1, unitPrice: 25, fee: 0, subtotal: 25 },\n\t\t\t\t\t\t{ ticketId: 402, ticketName: 'Standard Admission', quantity: 1, unitPrice: 30, fee: 3, subtotal: 30 }\n\t\t\t\t\t],\n\t\t\t\t\ttimerStart: 900,\n\t\t\t\t\tpromoApplied: false,\n\t\t\t\t\tpromoDiscount: 0,\n\t\t\t\t\tforceExpired: false\n\t\t\t\t};\n\n\t\t\tcase 'registration':\n\t\t\t\treturn {\n\t\t\t\t\tevent: mockRegistrationEvent,\n\t\t\t\t\tlines: [\n\t\t\t\t\t\t{ ticketId: 301, ticketName: 'Workshop Seat', quantity: 1, unitPrice: 75, fee: 7.5, subtotal: 75 }\n\t\t\t\t\t],\n\t\t\t\t\ttimerStart: 900,\n\t\t\t\t\tpromoApplied: false,\n\t\t\t\t\tpromoDiscount: 0,\n\t\t\t\t\tforceExpired: false\n\t\t\t\t};\n\n\t\t\tcase 'timer_warning':\n\t\t\t\treturn {\n\t\t\t\t\tevent: mockEvent,\n\t\t\t\t\tlines: [\n\t\t\t\t\t\t{ ticketId: 101, ticketName: 'General Admission', quantity: 2, unitPrice: 25, fee: 2.5, subtotal: 50 },\n\t\t\t\t\t\t{ ticketId: 102, ticketName: 'VIP Front Row', quantity: 1, unitPrice: 55, fee: 5.5, subtotal: 55 }\n\t\t\t\t\t],\n\t\t\t\t\ttimerStart: 115, // Just under 2min — warning triggers at ≤120s\n\t\t\t\t\tpromoApplied: false,\n\t\t\t\t\tpromoDiscount: 0,\n\t\t\t\t\tforceExpired: false\n\t\t\t\t};\n\n\t\t\tcase 'expired':\n\t\t\t\treturn {\n\t\t\t\t\tevent: mockEvent,\n\t\t\t\t\tlines: [\n\t\t\t\t\t\t{ ticketId: 101, ticketName: 'General Admission', quantity: 2, unitPrice: 25, fee: 2.5, subtotal: 50 },\n\t\t\t\t\t\t{ ticketId: 102, ticketName: 'VIP Front Row', quantity: 1, unitPrice: 55, fee: 5.5, subtotal: 55 }\n\t\t\t\t\t],\n\t\t\t\t\ttimerStart: 0,\n\t\t\t\t\tpromoApplied: false,\n\t\t\t\t\tpromoDiscount: 0,\n\t\t\t\t\tforceExpired: true\n\t\t\t\t};\n\n\t\t\tcase 'promo':\n\t\t\t\treturn {\n\t\t\t\t\tevent: mockEvent,\n\t\t\t\t\tlines: [\n\t\t\t\t\t\t{ ticketId: 101, ticketName: 'General Admission', quantity: 2, unitPrice: 25, fee: 2.5, subtotal: 50 },\n\t\t\t\t\t\t{ ticketId: 102, ticketName: 'VIP Front Row', quantity: 1, unitPrice: 55, fee: 5.5, subtotal: 55 }\n\t\t\t\t\t],\n\t\t\t\t\ttimerStart: 900,\n\t\t\t\t\tpromoApplied: true,\n\t\t\t\t\tpromoDiscount: 10,\n\t\t\t\t\tforceExpired: false\n\t\t\t\t};\n\n\t\t\tdefault:\n\t\t\t\t// Standard checkout\n\t\t\t\treturn {\n\t\t\t\t\tevent: mockEvent,\n\t\t\t\t\tlines: [\n\t\t\t\t\t\t{ ticketId: 101, ticketName: 'General Admission', quantity: 2, unitPrice: 25, fee: 2.5, subtotal: 50 },\n\t\t\t\t\t\t{ ticketId: 102, ticketName: 'VIP Front Row', quantity: 1, unitPrice: 55, fee: 5.5, subtotal: 55 }\n\t\t\t\t\t],\n\t\t\t\t\ttimerStart: 900,\n\t\t\t\t\tpromoApplied: false,\n\t\t\t\t\tpromoDiscount: 0,\n\t\t\t\t\tforceExpired: false\n\t\t\t\t};\n\t\t}\n\t}\n\n\t// --- State ---\n\tlet config: CheckoutConfig = $derived(isShowcaseMode ? buildConfig(dataVariant) : configProp!);\n\tlet timerSeconds = $state(900);\n\tlet isExpired = $state(false);\n\tlet processing = $state(false);\n\tlet submitRequested = $state(0);\n\n\t// Compute order totals from config lines\n\tlet orderTotals: OrderTotals = $derived((() => {\n\t\tconst lines = config.lines;\n\t\tconst subtotal = lines.reduce((sum, l) => sum + l.subtotal, 0);\n\t\tconst fees = lines.reduce((sum, l) => sum + l.fee * l.quantity, 0);\n\t\tconst promoDiscount = config.promoApplied ? config.promoDiscount : 0;\n\t\tconst adjustedSubtotal = Math.max(0, subtotal - promoDiscount);\n\t\tconst taxes = calculateTax(adjustedSubtotal + fees, config.event.venue.taxPercentage);\n\t\treturn {\n\t\t\tlines,\n\t\t\tsubtotal,\n\t\t\tfees,\n\t\t\ttaxes,\n\t\t\ttotal: adjustedSubtotal + fees + taxes,\n\t\t\tpromoDiscount,\n\t\t\tgiftCardAmount: 0\n\t\t};\n\t})());\n\n\tlet isFreeOrder = $derived(orderTotals.total === 0 && orderTotals.subtotal === 0);\n\tlet isRegistration = $derived(config.event.isRegistrationEvent);\n\n\t// Reset timer and state when variant changes\n\t$effect(() => {\n\t\tconst c = config;\n\t\ttimerSeconds = c.timerStart;\n\t\tisExpired = c.forceExpired;\n\t\tprocessing = false;\n\t\tsubmitRequested = 0;\n\t});\n\n\t// Timer countdown\n\t$effect(() => {\n\t\tif (isExpired || timerSeconds <= 0) {\n\t\t\tif (timerSeconds <= 0 && !isExpired) {\n\t\t\t\tisExpired = true;\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\tconst interval = setInterval(() => {\n\t\t\ttimerSeconds -= 1;\n\t\t\tif (timerSeconds <= 0) {\n\t\t\t\ttimerSeconds = 0;\n\t\t\t\tisExpired = true;\n\t\t\t\tclearInterval(interval);\n\t\t\t}\n\t\t}, 1000);\n\n\t\treturn () => clearInterval(interval);\n\t});\n\n\t// --- Handlers ---\n\tfunction handleBack() {\n\t\tif (onBackProp) {\n\t\t\tonBackProp();\n\t\t} else {\n\t\t\talert('Back button pressed — would navigate to ticket selection');\n\t\t}\n\t}\n\n\t/** Called from sidebar/mobile footer — signals the form to validate + submit */\n\tfunction requestPlaceOrder() {\n\t\tsubmitRequested += 1;\n\t}\n\n\t/** Called by CheckoutForm after successful validation */\n\tfunction handlePlaceOrder(formData: CheckoutFormData) {\n\t\tif (processing) return;\n\t\tprocessing = true;\n\n\t\tif (onPlaceOrderProp) {\n\t\t\t// Production mode: delegate to wrapper with form data\n\t\t\tonPlaceOrderProp(formData)\n\t\t\t\t.catch(() => {\n\t\t\t\t\t// Error handling is done by the wrapper; just reset processing\n\t\t\t\t})\n\t\t\t\t.finally(() => {\n\t\t\t\t\tprocessing = false;\n\t\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\t// Showcase mode: existing mock delay\n\t\tsetTimeout(() => {\n\t\t\tprocessing = false;\n\t\t\tconst count = orderTotals.lines.reduce((s, l) => s + l.quantity, 0);\n\t\t\talert(`Order placed! ${count} ticket(s) for $${orderTotals.total.toFixed(2)}`);\n\t\t}, 1500);\n\t}\n\n\tfunction handleRetryExpired() {\n\t\tif (onRetryExpiredProp) {\n\t\t\tonRetryExpiredProp();\n\t\t} else {\n\t\t\talert('Would navigate back to ticket selection to start over');\n\t\t}\n\t}\n\n\tfunction handleVariantChange(v: string) {\n\t\tdataVariant = v as CheckoutVariant;\n\t}\n</script>\n\n<div class=\"w-full min-h-screen bg-surface-primary text-color-primary\">\n\t<!-- Dev: mock data toggle (showcase mode only) -->\n\t{#if isShowcaseMode}\n\t\t<div class=\"toggle-bar\">\n\t\t\t<span class=\"toggle-label\">Checkout</span>\n\t\t\t{#each toggleOptions as option}\n\t\t\t\t{@const isActive = dataVariant === option.value}\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tclass=\"toggle-btn {isActive ? 'active' : ''}\"\n\t\t\t\t\tonclick={() => handleVariantChange(option.value)}\n\t\t\t\t>\n\t\t\t\t\t<span class=\"w-1.5 h-1.5 rounded-full {option.color} shrink-0\"></span>\n\t\t\t\t\t{option.label}\n\t\t\t\t</button>\n\t\t\t{/each}\n\t\t</div>\n\t{/if}\n\n\t<div class=\"max-w-6xl mx-auto px-4 py-6 md:px-6 md:py-8\">\n\n\t\t<!-- ============================================== -->\n\t\t<!-- DESKTOP: Two-column layout (1fr 360px) -->\n\t\t<!-- ============================================== -->\n\t\t<div class=\"hidden md:grid gap-8 items-start\" style=\"grid-template-columns: 1fr 360px;\">\n\n\t\t\t<!-- LEFT COLUMN: Checkout form -->\n\t\t\t<div>\n\t\t\t\t<CheckoutForm\n\t\t\t\t\tevent={config.event}\n\t\t\t\t\t{orderTotals}\n\t\t\t\t\t{timerSeconds}\n\t\t\t\t\t{isExpired}\n\t\t\t\t\t{isRegistration}\n\t\t\t\t\t{isFreeOrder}\n\t\t\t\t\tpromoApplied={config.promoApplied}\n\t\t\t\t\tpromoDiscount={config.promoDiscount}\n\t\t\t\t\tonBack={handleBack}\n\t\t\t\t\tonPlaceOrder={handlePlaceOrder}\n\t\t\t\t\t{processing}\n\t\t\t\t\t{submitRequested}\n\t\t\t\t\t{stripe}\n\t\t\t\t\t{paymentIntent}\n\t\t\t\t\tbind:elements\n\t\t\t\t\t{paymentError}\n\t\t\t\t/>\n\t\t\t</div>\n\n\t\t\t<!-- RIGHT COLUMN: Sticky order summary sidebar -->\n\t\t\t<div class=\"sticky top-6\">\n\t\t\t\t<CheckoutSidebar\n\t\t\t\t\tevent={config.event}\n\t\t\t\t\t{orderTotals}\n\t\t\t\t\t{isFreeOrder}\n\t\t\t\t\tonPlaceOrder={requestPlaceOrder}\n\t\t\t\t\t{processing}\n\t\t\t\t/>\n\t\t\t</div>\n\t\t</div>\n\n\t\t<!-- ============================================== -->\n\t\t<!-- MOBILE: Single column with fixed bottom footer -->\n\t\t<!-- ============================================== -->\n\t\t<div class=\"md:hidden pb-24 space-y-6\">\n\t\t\t<CheckoutForm\n\t\t\t\tevent={config.event}\n\t\t\t\t{orderTotals}\n\t\t\t\t{timerSeconds}\n\t\t\t\t{isExpired}\n\t\t\t\t{isRegistration}\n\t\t\t\t{isFreeOrder}\n\t\t\t\tpromoApplied={config.promoApplied}\n\t\t\t\tpromoDiscount={config.promoDiscount}\n\t\t\t\tonBack={handleBack}\n\t\t\t\tonPlaceOrder={handlePlaceOrder}\n\t\t\t\t{processing}\n\t\t\t\t{submitRequested}\n\t\t\t\t{stripe}\n\t\t\t\t{paymentIntent}\n\t\t\t\tbind:elements\n\t\t\t\t{paymentError}\n\t\t\t/>\n\n\t\t\t<!-- Inline order summary for mobile (always visible) -->\n\t\t\t<section class=\"mobile-order-summary\">\n\t\t\t\t<Heading level={3} size=\"sm\" weight=\"semibold\" class=\"mb-3\">\n\t\t\t\t\tOrder summary\n\t\t\t\t</Heading>\n\t\t\t\t<OrderSummary {orderTotals} />\n\t\t\t</section>\n\t\t</div>\n\n\t\t<!-- Mobile: Fixed bottom bar -->\n\t\t<div class=\"md:hidden\">\n\t\t\t<CheckoutMobileFooter\n\t\t\t\t{orderTotals}\n\t\t\t\t{isFreeOrder}\n\t\t\t\tonPlaceOrder={requestPlaceOrder}\n\t\t\t\t{processing}\n\t\t\t/>\n\t\t</div>\n\t</div>\n\n\t<!-- Expired session overlay -->\n\t{#if isExpired}\n\t\t<div class=\"expired-overlay\">\n\t\t\t<div class=\"expired-modal\">\n\t\t\t\t<div class=\"text-center space-y-4\">\n\t\t\t\t\t<div class=\"expired-icon-wrapper\">\n\t\t\t\t\t\t<svg class=\"w-10 h-10 text-red-500\" viewBox=\"0 0 32 32\" fill=\"currentColor\">\n\t\t\t\t\t\t\t<path d=\"M16 2C8.268 2 2 8.268 2 16s6.268 14 14 14 14-6.268 14-14S23.732 2 16 2zm0 26C9.383 28 4 22.617 4 16S9.383 4 16 4s12 5.383 12 12-5.383 12-12 12z\"/>\n\t\t\t\t\t\t\t<path d=\"M15 8h2v10h-2zM15 20h2v2h-2z\"/>\n\t\t\t\t\t\t</svg>\n\t\t\t\t\t</div>\n\t\t\t\t\t<Heading level={2} size=\"xl\" weight=\"bold\">\n\t\t\t\t\t\tSession expired\n\t\t\t\t\t</Heading>\n\t\t\t\t\t<Text size=\"sm\" color=\"secondary\" class=\"block\">\n\t\t\t\t\t\tYour reservation has timed out. Please select your tickets again to continue.\n\t\t\t\t\t</Text>\n\t\t\t\t\t<Button\n\t\t\t\t\t\tvariant=\"default\"\n\t\t\t\t\t\tsize=\"lg\"\n\t\t\t\t\t\tclass=\"w-full mt-2\"\n\t\t\t\t\t\tonclick={handleRetryExpired}\n\t\t\t\t\t>\n\t\t\t\t\t\tSelect tickets again\n\t\t\t\t\t</Button>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t{/if}\n</div>\n\n<style>\n\t@reference \"../../../../app.css\";\n\n\t/* DataToggle inline (matches DataToggle.svelte pattern) */\n\t.toggle-bar {\n\t\t@apply sticky top-0 z-30 flex items-center gap-1 px-3 py-2 overflow-x-auto;\n\t\t@apply bg-surface-primary border-b border-default;\n\t}\n\n\t.toggle-label {\n\t\t@apply px-1.5 shrink-0 text-color-muted uppercase tracking-wider;\n\t\tfont-size: 0.625rem;\n\t}\n\n\t.toggle-btn {\n\t\t@apply flex items-center gap-1.5 px-2 py-1 rounded-md text-xs whitespace-nowrap transition-all;\n\t\t@apply text-color-tertiary;\n\t}\n\n\t.toggle-btn:hover {\n\t\t@apply bg-surface-secondary text-color-secondary;\n\t}\n\n\t.toggle-btn.active {\n\t\t@apply bg-surface-secondary text-color-primary font-medium;\n\t}\n\n\t/* Mobile order summary */\n\t.mobile-order-summary {\n\t\t@apply p-4 rounded-lg border border-default bg-surface-secondary;\n\t}\n\n\t/* Expired overlay */\n\t.expired-overlay {\n\t\t@apply fixed inset-0 z-50 flex items-center justify-center bg-black/60 p-4;\n\t}\n\n\t.expired-modal {\n\t\t@apply bg-surface-primary rounded-xl p-8 max-w-sm w-full shadow-2xl;\n\t}\n\n\t.expired-icon-wrapper {\n\t\t@apply inline-flex items-center justify-center w-16 h-16 rounded-full bg-red-50 mx-auto;\n\t}\n\n\t:global(.dark) .expired-icon-wrapper {\n\t\t@apply bg-red-900/30;\n\t}\n</style>\n","<script>\n import { slide } from 'svelte/transition';\n import { Gift, Close, Checkmark, Warning } from 'carbon-icons-svelte';\n import { applyGiftCard, removeGiftCard } from '$lib/utils/api.js';\n\n let {\n cartId,\n onApplied = () => {},\n onRemoved = () => {},\n disabled = false,\n } = $props();\n\n let code = $state('');\n let loading = $state(false);\n let error = $state('');\n let appliedCard = $state(null);\n let showInput = $state(false);\n\n // Format currency from cents\n function formatCurrency(cents) {\n return `$${(cents / 100).toFixed(2)}`;\n }\n\n async function handleApply() {\n if (!code.trim() || loading || !cartId) return;\n\n loading = true;\n error = '';\n\n try {\n const result = await applyGiftCard(cartId, code.trim().toUpperCase());\n\n if (result.valid) {\n appliedCard = {\n code: result.giftCardCode || code.trim().toUpperCase(),\n giftCardAmount: result.giftCardAmount,\n giftCardBalance: result.giftCardBalance,\n paymentType: result.paymentType,\n stripeAmount: result.stripeAmount,\n orderTotal: result.orderTotal,\n requiresStripe: result.requiresStripe,\n };\n code = '';\n showInput = false;\n onApplied(appliedCard);\n } else {\n error = result.error || 'Invalid gift card code';\n }\n } catch (err) {\n console.error('Error applying gift card:', err);\n error = 'Failed to apply gift card. Please try again.';\n }\n\n loading = false;\n }\n\n async function handleRemove() {\n if (loading || !cartId) return;\n\n loading = true;\n error = '';\n\n try {\n const result = await removeGiftCard(cartId);\n\n if (!result.error) {\n const previousCard = appliedCard;\n appliedCard = null;\n showInput = false;\n onRemoved(previousCard);\n } else {\n error = result.error;\n }\n } catch (err) {\n console.error('Error removing gift card:', err);\n error = 'Failed to remove gift card. Please try again.';\n }\n\n loading = false;\n }\n\n function handleKeydown(e) {\n if (e.key === 'Enter' && !loading) {\n handleApply();\n }\n }\n\n function toggleInput() {\n if (!appliedCard) {\n showInput = !showInput;\n if (!showInput) {\n code = '';\n error = '';\n }\n }\n }\n</script>\n\n<div class=\"gift-card-section\">\n {#if appliedCard}\n <!-- Applied gift card display -->\n <div class=\"applied-card\" transition:slide={{ duration: 200 }}>\n <div class=\"applied-card-header\">\n <div class=\"applied-icon\">\n <Checkmark size={16} />\n </div>\n <div class=\"applied-info\">\n <span class=\"applied-label\">Gift card applied</span>\n <span class=\"applied-code\">{appliedCard.code}</span>\n </div>\n <button\n class=\"remove-btn\"\n onclick={handleRemove}\n disabled={loading || disabled}\n aria-label=\"Remove gift card\"\n >\n {#if loading}\n <span class=\"loading-spinner small\"></span>\n {:else}\n <Close size={16} />\n {/if}\n </button>\n </div>\n <div class=\"applied-details\">\n <div class=\"detail-row\">\n <span class=\"detail-label\">Applied to order</span>\n <span class=\"detail-value discount\">-{formatCurrency(appliedCard.giftCardAmount)}</span>\n </div>\n {#if appliedCard.paymentType === 'gift_card_only'}\n <div class=\"full-coverage-badge\">\n <Checkmark size={14} />\n <span>Fully covered by gift card</span>\n </div>\n {:else if appliedCard.paymentType === 'split'}\n <div class=\"detail-row muted\">\n <span class=\"detail-label\">Remaining to pay</span>\n <span class=\"detail-value\">{formatCurrency(appliedCard.stripeAmount)}</span>\n </div>\n {/if}\n </div>\n </div>\n {:else}\n <!-- Gift card input toggle -->\n <button\n class=\"gift-card-toggle\"\n onclick={toggleInput}\n disabled={disabled}\n aria-expanded={showInput}\n >\n <Gift size={18} class=\"gift-icon\" />\n <span>Have a gift card?</span>\n <span class=\"toggle-indicator\">{showInput ? '-' : '+'}</span>\n </button>\n\n {#if showInput}\n <div class=\"input-section\" transition:slide={{ duration: 200 }}>\n <div class=\"input-row\">\n <input\n type=\"text\"\n bind:value={code}\n onkeydown={handleKeydown}\n placeholder=\"Enter gift card code\"\n disabled={loading || disabled}\n class=\"gift-input\"\n class:has-error={!!error}\n autocomplete=\"off\"\n autocapitalize=\"characters\"\n />\n <button\n class=\"apply-btn\"\n onclick={handleApply}\n disabled={!code.trim() || loading || disabled}\n >\n {#if loading}\n <span class=\"loading-spinner\"></span>\n {:else}\n Apply\n {/if}\n </button>\n </div>\n {#if error}\n <div class=\"error-message\" transition:slide={{ duration: 150 }}>\n <Warning size={14} />\n <span>{error}</span>\n </div>\n {/if}\n </div>\n {/if}\n {/if}\n</div>\n\n<style>\n @reference \"../../../app.css\";\n\n .gift-card-section {\n @apply mb-4;\n }\n\n .gift-card-toggle {\n @apply flex items-center gap-2 w-full py-3 px-4 text-sm font-medium;\n @apply bg-gray-50 dark:bg-gray-800 rounded-lg border border-gray-200 dark:border-gray-700;\n @apply text-gray-700 dark:text-gray-300 cursor-pointer transition-colors;\n }\n\n .gift-card-toggle:hover:not(:disabled) {\n @apply bg-gray-100 dark:bg-gray-700;\n }\n\n .gift-card-toggle:disabled {\n @apply opacity-50 cursor-not-allowed;\n }\n\n .gift-card-toggle :global(.gift-icon) {\n @apply text-gray-500 dark:text-gray-400;\n }\n\n .toggle-indicator {\n @apply ml-auto text-gray-400 dark:text-gray-500 text-lg font-light;\n }\n\n .input-section {\n @apply mt-3 p-4 bg-gray-50 dark:bg-gray-800 rounded-lg border border-gray-200 dark:border-gray-700;\n }\n\n .input-row {\n @apply flex gap-2;\n }\n\n .gift-input {\n @apply w-full px-3 py-2 text-sm rounded-lg border transition-colors;\n @apply bg-white dark:bg-gray-900 border-gray-300 dark:border-gray-600;\n @apply text-gray-900 dark:text-white placeholder:text-gray-400 dark:placeholder:text-gray-500;\n @apply flex-1 uppercase;\n }\n\n .gift-input:focus {\n @apply outline-none ring-2 ring-blue-500 dark:ring-blue-400 border-transparent;\n }\n\n .gift-input.has-error {\n @apply border-red-500 dark:border-red-400;\n }\n\n .gift-input:disabled {\n @apply opacity-50 cursor-not-allowed;\n }\n\n .apply-btn {\n @apply px-4 py-2 text-sm font-medium rounded-lg;\n @apply text-white transition-colors;\n @apply disabled:opacity-50 disabled:cursor-not-allowed;\n @apply flex items-center justify-center min-w-16;\n background-color: hsl(var(--Brand-Primary, 224 76% 48%));\n }\n\n .apply-btn:hover:not(:disabled) {\n filter: brightness(0.9);\n }\n\n .error-message {\n @apply flex items-center gap-1.5 mt-2 text-sm text-red-600 dark:text-red-400;\n }\n\n /* Applied card styles */\n .applied-card {\n @apply p-4 bg-green-50 dark:bg-green-900/20 rounded-lg border border-green-200 dark:border-green-800;\n }\n\n .applied-card-header {\n @apply flex items-center gap-3;\n }\n\n .applied-icon {\n @apply w-8 h-8 rounded-full flex items-center justify-center;\n @apply bg-green-100 dark:bg-green-900/50 text-green-600 dark:text-green-400;\n }\n\n .applied-info {\n @apply flex flex-col flex-1;\n }\n\n .applied-label {\n @apply text-xs text-green-700 dark:text-green-400 font-medium;\n }\n\n .applied-code {\n @apply text-sm font-mono text-gray-900 dark:text-white;\n }\n\n .remove-btn {\n @apply p-2 rounded-full transition-colors;\n @apply text-gray-500 dark:text-gray-400 hover:bg-red-100 dark:hover:bg-red-900/30 hover:text-red-600 dark:hover:text-red-400;\n }\n\n .remove-btn:disabled {\n @apply opacity-50 cursor-not-allowed;\n }\n\n .applied-details {\n @apply mt-3 pt-3 border-t border-green-200 dark:border-green-800;\n }\n\n .detail-row {\n @apply flex justify-between items-center text-sm;\n }\n\n .detail-row.muted {\n @apply mt-1.5;\n }\n\n .detail-label {\n @apply text-gray-600 dark:text-gray-400;\n }\n\n .detail-value {\n @apply font-medium text-gray-900 dark:text-white;\n }\n\n .detail-value.discount {\n @apply text-green-600 dark:text-green-400;\n }\n\n .full-coverage-badge {\n @apply flex items-center gap-1.5 mt-2 py-1.5 px-2.5 rounded-md;\n @apply bg-green-100 dark:bg-green-900/40 text-green-700 dark:text-green-300 text-xs font-medium;\n }\n\n /* Loading spinner */\n .loading-spinner {\n @apply w-6 h-6 border-2 border-gray-200 dark:border-gray-700 rounded-full;\n border-top-color: rgb(37 99 235); /* blue-600 */\n animation: spin 0.8s linear infinite;\n }\n\n :global(.dark) .loading-spinner {\n border-top-color: rgb(96 165 250); /* blue-400 */\n }\n\n .loading-spinner.small {\n @apply w-4 h-4;\n }\n\n @keyframes spin {\n from { transform: rotate(0deg); }\n to { transform: rotate(360deg); }\n }\n</style>\n","<script>\n import Cookies from 'js-cookie';\n import { onMount } from 'svelte';\n import { loadStripe } from '@stripe/stripe-js';\n import { transformEvent, loadCheckoutStateFromCookies, getVenueDetails } from '$lib/utils/utils.js';\n import { createPaymentIntent, completeGiftCardPayment } from '$lib/utils/api.js';\n import { validatePaymentIntent } from '$lib/utils/utils.js';\n import { getPaymentErrorDetails } from '$lib/utils/stripe-errors';\n import CheckoutMain from '$lib/premium-ticket-experience/variants/v3-airbnb-split/CheckoutMain.svelte';\n import GiftCardInput from '../Events/Checkout/GiftCardInput.svelte';\n\n // --- Legacy fallback ---\n let useLegacy = $state(false);\n let LegacyComponent = $state(null);\n\n if (typeof window !== 'undefined') {\n const params = new URLSearchParams(window.location.search);\n if (params.get('legacy') === '1') {\n useLegacy = true;\n }\n }\n\n $effect(() => {\n if (useLegacy && !LegacyComponent) {\n import('./Checkout.legacy.svelte').then((m) => {\n LegacyComponent = m.default;\n }).catch(() => {\n useLegacy = false;\n });\n }\n });\n\n let {\n data,\n availableTickets = [],\n value = '',\n venueId = '',\n organizationId = '',\n onNavigateToSuccess,\n initialError = undefined,\n } = $props();\n\n // --- Derive event from data prop ---\n const { id, orgSlug, slug, event: rawEvent } = data || {};\n let event = $derived(\n rawEvent\n ? transformEvent(rawEvent)\n : data && (data.id || id)\n ? {\n id: data.id || id,\n eventID: data.id || id,\n venueID: data.venueID ?? data.venueId ?? null,\n venueId: data.venueId ?? data.venueID ?? null,\n eventTicketingType: 0,\n ticketType: 0,\n availableTickets: [],\n }\n : null\n );\n\n // --- Core state ---\n let cartId = $state('');\n let quantities = $state({});\n let tickets = $state([]);\n let promocode = $state('');\n let promoDiscountAmount = $state(0);\n let processing = $state(false);\n\n // Stripe state\n let stripe = $state(null);\n let paymentIntent = $state('');\n let elements = $state(undefined);\n\n // Error state\n let paymentErrorMessage = $state('');\n let showError = $state(false);\n let errorMessage = $state('');\n\n // Gift card state\n let giftCardApplied = $state(null);\n\n // CheckoutConfig for CheckoutMain\n let checkoutConfig = $state(null);\n\n // --- Initialize on mount ---\n onMount(async () => {\n cartId = Cookies.get('checkout-cartid');\n\n if (!cartId) {\n showError = true;\n errorMessage = 'No checkout session found. Please select tickets first.';\n return;\n }\n\n // Load checkout state from cookies/localStorage\n try {\n const checkoutState = loadCheckoutStateFromCookies(event?.eventID || event?.id || id);\n quantities = checkoutState.quantities || {};\n promocode = checkoutState.promocode || '';\n promoDiscountAmount = checkoutState.promoDiscountAmount || 0;\n tickets = checkoutState.tickets || [];\n } catch (err) {\n console.error('Error loading checkout state:', err);\n quantities = {};\n tickets = [];\n }\n\n if (tickets.length > 0 && event) {\n event.availableTickets = tickets;\n availableTickets = tickets;\n }\n\n // Fetch venue details for fee calculations\n let venueServiceCharge = {\n serviceFeeCents: 0,\n serviceFeePercentage: 0,\n serviceFeeChargeType: 'both',\n maxServiceFeeCents: 0,\n taxPercentage: 0,\n };\n\n try {\n const venueData = await getVenueDetails(event?.venueID || event?.venueId || venueId);\n venueServiceCharge = {\n serviceFeeCents: venueData?.serviceFeeCents ?? 0,\n serviceFeePercentage: venueData?.serviceFeePercentage ?? 0,\n serviceFeeChargeType: venueData?.serviceFeeChargeType ?? 'both',\n maxServiceFeeCents: venueData?.maxServiceFeeCents ?? 0,\n taxPercentage: venueData?.taxPercentage ?? 0,\n };\n } catch (err) {\n console.error('Error fetching venue data:', err);\n }\n\n // Initialize Stripe payment\n if (Object.keys(quantities).length > 0) {\n await initializeStripePayment();\n }\n\n // Build OrderLine[] from quantities + tickets + venue fees\n const lines = buildOrderLines(quantities, tickets, venueServiceCharge);\n\n // Build CheckoutConfig for CheckoutMain\n checkoutConfig = {\n event: buildEventData(event, venueServiceCharge),\n lines,\n timerStart: 15 * 60,\n promoApplied: !!promocode,\n promoDiscount: promoDiscountAmount,\n forceExpired: false,\n };\n\n // Apply initial error if provided (for showcase/preview)\n if (initialError) {\n const details = getPaymentErrorDetails(\n typeof initialError === 'object'\n ? initialError\n : { code: 'card_declined', message: 'Your card was declined. Please try a different payment method.' }\n );\n paymentErrorMessage = details.message;\n }\n });\n\n // --- Stripe initialization (uses API-provided key, NO hardcoded key) ---\n async function initializeStripePayment() {\n if (!cartId) {\n console.error('Missing cartId!');\n return;\n }\n\n const filteredQuantities = Object.fromEntries(\n Object.entries(quantities).filter(([_, val]) => val > 0)\n );\n\n try {\n const paymentData = await createPaymentIntent(cartId, filteredQuantities);\n\n if (!paymentData) {\n paymentErrorMessage = 'Failed to create payment intent. Please try again.';\n return;\n }\n\n // Use the Stripe publishable key from the API response -- NEVER hardcoded\n const stripeKey = paymentData.stripe_publishable_key;\n if (!stripeKey) {\n console.error('No Stripe publishable key in payment intent response');\n paymentErrorMessage = 'Payment configuration error. Please try again.';\n return;\n }\n\n stripe = await loadStripe(stripeKey);\n\n if (paymentData.client_secret) {\n paymentIntent = paymentData.client_secret;\n } else {\n paymentErrorMessage = 'Failed to initialize payment. Please try again.';\n }\n } catch (err) {\n console.error('Failed to initialize Stripe payment:', err);\n paymentErrorMessage = err.message || 'Failed to initialize payment. Please check your connection and try again.';\n }\n }\n\n // --- Build EventData shape for CheckoutMain ---\n function buildEventData(evt, venueCharge) {\n if (!evt) return null;\n return {\n id: evt.id || evt.eventID,\n title: evt.name || evt.title || '',\n slug: evt.slug || slug || '',\n description: evt.description || '',\n date: evt.date || '',\n startDateTime: evt.startDateTime || '',\n endDateTime: evt.endDateTime || '',\n doorsOpenTime: evt.doorsOpenTime || '',\n timezone: evt.timeZone || evt.timezone || 'America/Los_Angeles',\n imageUrl: evt.imageUrl || evt.image || '',\n venue: {\n id: evt.venueID || evt.venueId || 0,\n name: evt.venueName || '',\n address: evt.venueAddress || '',\n timezone: evt.timeZone || evt.timezone || 'America/Los_Angeles',\n serviceFeePercentage: venueCharge.serviceFeePercentage,\n serviceFeeCents: venueCharge.serviceFeeCents,\n taxPercentage: venueCharge.taxPercentage,\n serviceFeeChargeType: venueCharge.serviceFeeChargeType,\n maxServiceFeeCents: venueCharge.maxServiceFeeCents,\n },\n performers: evt.performers || [],\n tickets: (evt.availableTickets || []).map(t => ({\n id: t.ID || t.id,\n name: t.name || '',\n description: t.description || '',\n price: (t.price || 0) / 100,\n fee: 0,\n quantityAvailable: t.quantityAvailable || 0,\n quantityTotal: t.quantityTotal || 0,\n minPerOrder: t.minPerOrder || 1,\n maxPerOrder: t.maxPerOrder || 10,\n status: 'on_sale',\n isDonation: t.type === 2,\n isHidden: false,\n })),\n faqs: evt.faqs || [],\n status: 'on_sale',\n isPasswordProtected: false,\n isRegistrationEvent: evt.eventTicketingType === 1 || evt.ticketType === 1,\n totalTicketsRemaining: 100,\n totalTicketsCapacity: 100,\n };\n }\n\n // --- Build OrderLine[] from cookie data + venue fees ---\n function buildOrderLines(qtys, ticketList, venueCharge) {\n const lines = [];\n for (const [ticketId, quantity] of Object.entries(qtys)) {\n if (quantity <= 0) continue;\n const ticket = ticketList.find(t => String(t.ID) === ticketId || String(t.id) === ticketId);\n if (!ticket) continue;\n\n const unitPrice = (ticket.price || 0) / 100;\n const fee = calculateTicketFee(unitPrice, venueCharge);\n\n lines.push({\n ticketId: parseInt(ticketId),\n ticketName: ticket.name || '',\n quantity,\n unitPrice,\n fee,\n subtotal: unitPrice * quantity,\n });\n }\n return lines;\n }\n\n // --- Calculate fee per ticket based on venue charge settings ---\n function calculateTicketFee(unitPrice, venueCharge) {\n if (unitPrice === 0) return 0;\n\n const { serviceFeePercentage = 0, serviceFeeCents = 0, serviceFeeChargeType = 'both', maxServiceFeeCents = 0 } = venueCharge;\n\n let fee = 0;\n if (serviceFeeChargeType === 'percentage' || serviceFeeChargeType === 'both') {\n fee += unitPrice * (serviceFeePercentage / 100);\n }\n if (serviceFeeChargeType === 'flat' || serviceFeeChargeType === 'both') {\n fee += serviceFeeCents / 100;\n }\n\n if (maxServiceFeeCents > 0) {\n fee = Math.min(fee, maxServiceFeeCents / 100);\n }\n\n return Math.round(fee * 100) / 100;\n }\n\n // --- Compute whether order is free (for hiding gift card section) ---\n let isFreeOrder = $derived(\n checkoutConfig\n ? checkoutConfig.lines.every(l => l.unitPrice === 0)\n : true\n );\n\n // --- Place order handler: 3-step Stripe flow ---\n async function handlePlaceOrder(formData) {\n if (processing) return;\n processing = true;\n paymentErrorMessage = '';\n\n try {\n // Gift-card-only purchase: skip Stripe entirely\n if (giftCardApplied && !giftCardApplied.requiresStripe) {\n await executeGiftCardOnlyPurchase(formData);\n return;\n }\n\n // Step 1: Validate card via Stripe elements\n if (!elements) {\n paymentErrorMessage = 'Payment form is not ready. Please wait a moment and try again.';\n processing = false;\n return;\n }\n\n if (!stripe) {\n paymentErrorMessage = 'Payment system is not initialized. Please refresh the page.';\n processing = false;\n return;\n }\n\n const { error: submitError } = await elements.submit();\n if (submitError) {\n const details = getPaymentErrorDetails(submitError);\n paymentErrorMessage = details.message;\n processing = false;\n return;\n }\n\n // Step 2: Confirm payment with Stripe\n const result = await stripe.confirmPayment({\n elements,\n redirect: 'if_required',\n });\n\n if (result.error) {\n const details = getPaymentErrorDetails(result.error);\n paymentErrorMessage = details.message;\n processing = false;\n return;\n }\n\n // Step 3: Validate payment on backend\n const paymentPayload = {\n id: cartId,\n paymentIntentId: result.paymentIntent.id,\n tickets: quantities,\n firstName: formData.firstName,\n lastName: formData.lastName,\n email: formData.email,\n paymentMethod: 'credit-card',\n mailingList: formData.keepMeUpdated,\n saleType: 'online',\n };\n\n const response = await validatePaymentIntent(cartId, paymentPayload);\n\n if (response?.status === 'Payment succeeded') {\n const successData = {\n orderId: cartId,\n eventId: event?.id || event?.eventID || null,\n event: event || null,\n venueId: venueId || event?.venueId || null,\n organizationId: organizationId || event?.organizationId || null,\n };\n\n if (onNavigateToSuccess) {\n onNavigateToSuccess(successData);\n }\n } else if (response?.status === 'Payment amount does not match the total price') {\n paymentErrorMessage = 'Payment amount mismatch. Please refresh and try again.';\n } else {\n paymentErrorMessage = 'Payment validation failed. Please try again.';\n }\n } catch (err) {\n console.error('Payment execution error:', err);\n const details = getPaymentErrorDetails(err);\n paymentErrorMessage = details.message;\n } finally {\n processing = false;\n }\n }\n\n // --- Gift card only purchase ---\n async function executeGiftCardOnlyPurchase(formData) {\n try {\n const result = await completeGiftCardPayment(cartId, {\n firstName: formData.firstName,\n lastName: formData.lastName,\n email: formData.email,\n phoneNumber: null,\n mailingList: formData.keepMeUpdated,\n });\n\n if (result?.success) {\n const successData = {\n orderId: result.orderId || cartId,\n eventId: event?.id || event?.eventID || null,\n event: event || null,\n venueId: venueId || event?.venueId || null,\n organizationId: organizationId || event?.organizationId || null,\n paymentType: 'gift_card_only',\n };\n\n if (onNavigateToSuccess) {\n onNavigateToSuccess(successData);\n }\n } else {\n paymentErrorMessage = result?.error || 'Failed to complete order. Please try again.';\n }\n } catch (err) {\n console.error('Gift card payment error:', err);\n const details = getPaymentErrorDetails(err);\n paymentErrorMessage = details.message;\n } finally {\n processing = false;\n }\n }\n\n // --- Gift card handlers ---\n function handleGiftCardApplied(appliedCard) {\n giftCardApplied = appliedCard;\n if (!appliedCard.requiresStripe) {\n // Gift card covers full amount -- clear Stripe\n elements = undefined;\n stripe = null;\n paymentIntent = '';\n }\n }\n\n function handleGiftCardRemoved() {\n giftCardApplied = null;\n // Re-initialize Stripe payment\n if (cartId && Object.keys(quantities).length > 0) {\n initializeStripePayment();\n }\n }\n\n // --- Navigation handlers ---\n function handleBack() {\n window.history.back();\n }\n\n function handleRetryExpired() {\n window.history.back();\n }\n\n async function handleExtendSession() {\n // Client-side only for npm export (no backend session sync)\n // CheckoutMain manages its own timer; this callback is a no-op\n // as the timer extension is handled internally by CheckoutMain\n }\n</script>\n\n{#if useLegacy && LegacyComponent}\n <svelte:component this={LegacyComponent}\n {data}\n {availableTickets}\n {value}\n {venueId}\n {organizationId}\n {onNavigateToSuccess}\n {initialError}\n />\n{:else if checkoutConfig}\n <CheckoutMain\n config={checkoutConfig}\n onPlaceOrder={handlePlaceOrder}\n onBack={handleBack}\n onRetryExpired={handleRetryExpired}\n onExtendSession={handleExtendSession}\n {stripe}\n {paymentIntent}\n bind:elements\n paymentError={paymentErrorMessage}\n />\n\n {#if !isFreeOrder}\n <div class=\"max-w-6xl mx-auto px-4 md:px-6 -mt-4 mb-8\">\n <GiftCardInput\n {cartId}\n onApplied={handleGiftCardApplied}\n onRemoved={handleGiftCardRemoved}\n disabled={processing}\n />\n </div>\n {/if}\n{:else if showError}\n <div class=\"p-8 text-center\">\n <p class=\"text-red-500\">{errorMessage}</p>\n </div>\n{:else}\n <div class=\"p-8 text-center\">\n <p class=\"text-gray-500\">Loading checkout...</p>\n </div>\n{/if}\n","// Premium Ticket Experience — API → EventData Transformer\n// Maps raw API event responses to our clean EventData interface.\n// Used when plugging in real API data. The showcase continues using mock-data.ts directly.\n\nimport { getImageUrl } from '$lib/utils/utils.js';\nimport { getIANATimezone } from '$lib/utils/datetime.js';\nimport type {\n\tEventData,\n\tEventStatus,\n\tTicketTypeData,\n\tTicketStatus,\n\tVenueData,\n\tPerformerData,\n\tFAQItem,\n\tSeriesOccurrence,\n\tCollectionEvent\n} from './types';\nimport type { SeriesPageData, PublicCollectionData } from '$lib/api/types';\n\n/**\n * Parse a single-line address string into display lines.\n * E.g. \"123 Main St, Los Angeles, CA 90012\" → [\"123 Main St\", \"Los Angeles, CA 90012\"]\n */\nfunction parseAddress(addressStr: string): string[] {\n\tif (!addressStr) return [];\n\tconst parts = addressStr.split(',').map((p) => p.trim());\n\tif (parts.length < 2) return [addressStr];\n\tconst lastPart = parts[parts.length - 1];\n\tconst stateZipMatch = lastPart.match(/^([A-Z]{2})\\s+(\\d{5}(-\\d{4})?)$/);\n\tif (stateZipMatch && parts.length >= 3) {\n\t\tconst state = stateZipMatch[1];\n\t\tconst zip = stateZipMatch[2];\n\t\tconst city = parts[parts.length - 2];\n\t\tconst lines = parts.slice(0, -2);\n\t\tlines.push(`${city}, ${state} ${zip}`);\n\t\treturn lines;\n\t}\n\treturn [parts[0], parts.slice(1).join(', ')];\n}\n\n/**\n * Build a Google Maps search URL from an address string.\n */\nfunction buildGoogleMapsUrl(address: string): string {\n\tif (!address) return '';\n\treturn `https://www.google.com/maps/search/?api=1&query=${encodeURIComponent(address)}`;\n}\n\n/**\n * Map a raw API ticket status/state to our TicketStatus union.\n */\nfunction mapTicketStatus(ticket: any): TicketStatus {\n\tconst now = new Date();\n\tconst remaining = ticket.remainingCapacity ?? ticket.quantityRemaining ?? ticket.quantity ?? 0;\n\tconst salesBegin = ticket.salesBegin || ticket.salesStart || ticket.saleBegin || ticket.onSaleStart;\n\tconst salesEnd = ticket.salesEnd || ticket.saleEnd || ticket.onSaleEnd;\n\n\tif (remaining <= 0) return 'sold_out';\n\tif (salesEnd && new Date(salesEnd) < now) return 'sales_ended';\n\tif (salesBegin && new Date(salesBegin) > now) return 'coming_soon';\n\treturn 'on_sale';\n}\n\n/**\n * Map a raw API event status string to our EventStatus union.\n */\nfunction mapEventStatus(rawStatus: string, tickets: TicketTypeData[]): EventStatus {\n\tconst s = (rawStatus || '').toLowerCase().replace(/\\s+/g, '_');\n\n\tif (s === 'cancelled' || s === 'canceled') return 'cancelled';\n\n\t// Check if event is past based on end time (handled by caller if needed)\n\tif (s === 'past' || s === 'ended') return 'past';\n\n\t// Derive from ticket states\n\tconst publicTickets = tickets.filter((t) => !t.isHidden);\n\tif (publicTickets.length > 0) {\n\t\tif (publicTickets.every((t) => t.status === 'sold_out')) return 'sold_out';\n\t\tif (publicTickets.every((t) => t.status === 'coming_soon')) return 'coming_soon';\n\t\tif (publicTickets.every((t) => t.status === 'sales_ended' || t.status === 'sold_out')) return 'sales_ended';\n\t}\n\n\tif (s === 'sold_out' || s === 'soldout') return 'sold_out';\n\tif (s === 'coming_soon' || s === 'comingsoon') return 'coming_soon';\n\tif (s === 'sales_ended' || s === 'salesended') return 'sales_ended';\n\n\treturn 'on_sale';\n}\n\n/**\n * Transform a raw API event response into our clean EventData interface.\n * This is the bridge between the API and our premium ticket experience components.\n */\nexport function transformApiEvent(rawEvent: any): EventData {\n\tconst timezone = getIANATimezone(rawEvent.timeZone || rawEvent.timezone || 'UTC');\n\n\t// Transform tickets\n\tconst rawTickets = rawEvent.availableTickets || [];\n\tconst tickets: TicketTypeData[] = rawTickets.map((t: any) => ({\n\t\tid: t.id || t.ID,\n\t\tname: t.name || t.title || '',\n\t\tdescription: t.description || undefined,\n\t\tprice: t.price ?? 0,\n\t\tfee: t.fee ?? 0,\n\t\tquantityAvailable: t.remainingCapacity ?? t.quantityRemaining ?? t.quantity ?? 0,\n\t\tquantityTotal: t.totalCapacity ?? t.quantity ?? 0,\n\t\tminPerOrder: t.minPerOrder ?? t.minQuantity ?? 1,\n\t\tmaxPerOrder: t.maxPerOrder ?? t.maxQuantity ?? 10,\n\t\tstatus: mapTicketStatus(t),\n\t\tsalesStartDate: t.salesBegin || t.salesStart || t.saleBegin || t.onSaleStart || undefined,\n\t\tsalesEndDate: t.salesEnd || t.saleEnd || t.onSaleEnd || undefined,\n\t\tisDonation: t.type === 2 || t.ticketType === 2 || t.isDonation === true,\n\t\tisHidden: t.visibility === 2 || t.isHidden === true,\n\t\tticketType: t.type || t.ticketType || undefined,\n\t\tsectionName: t.sectionName || t.section || undefined\n\t}));\n\n\t// Calculate totals from public tickets\n\tconst publicTickets = tickets.filter((t) => !t.isHidden && !t.isDonation);\n\tconst totalRemaining = publicTickets.reduce((sum, t) => sum + t.quantityAvailable, 0);\n\tconst totalCapacity = publicTickets.reduce((sum, t) => sum + t.quantityTotal, 0);\n\n\t// Determine event status\n\tconst status = mapEventStatus(rawEvent.status, tickets);\n\n\t// Build image URL\n\tconst rawImage = rawEvent.image || rawEvent.imageUrl || rawEvent.image_url || '';\n\tconst imageUrl = rawImage.startsWith('http') ? rawImage : getImageUrl(rawImage);\n\n\t// Venue\n\tconst rawVenue = rawEvent.venue || {};\n\tconst venue: VenueData = {\n\t\tid: rawVenue.id || rawVenue.ID || 0,\n\t\tname: rawVenue.name || rawVenue.googleLocationNameCache || '',\n\t\taddress: rawVenue.address || rawVenue.googleLocationNameCache || '',\n\t\ttimezone,\n\t\tserviceFeePercentage: rawVenue.serviceFeePercentage ?? rawVenue.fee ?? 0,\n\t\tserviceFeeCents: rawVenue.serviceFeeCents ?? 0,\n\t\ttaxPercentage: rawVenue.taxPercentage ?? rawVenue.tax ?? 0,\n\t\tcontactEmail: rawVenue.contactEmail || rawVenue.email || undefined\n\t};\n\n\t// Performers\n\tconst rawPerformers = rawEvent.performers || [];\n\tconst performers: PerformerData[] = rawPerformers.map((p: any) => ({\n\t\tid: p.id || p.ID,\n\t\tdisplayName: p.displayName || p.name || '',\n\t\tprofileImage: p.avatar || p.profileImage || undefined,\n\t\trole: p.role || undefined\n\t}));\n\n\t// FAQs (may not be in API response)\n\tconst faqs: FAQItem[] = (rawEvent.faqs || []).map((f: any) => ({\n\t\tquestion: f.question || '',\n\t\tanswer: f.answer || ''\n\t}));\n\n\t// Date in venue timezone\n\tlet date = '';\n\tif (rawEvent.startDateTime) {\n\t\tconst dt = new Date(rawEvent.startDateTime);\n\t\tdate = dt.toLocaleDateString('en-CA', { timeZone: timezone, year: 'numeric', month: '2-digit', day: '2-digit' });\n\t}\n\n\treturn {\n\t\tid: rawEvent.id || rawEvent.ID,\n\t\ttitle: rawEvent.title || rawEvent.name || '',\n\t\tslug: rawEvent.slug || '',\n\t\tdescription: rawEvent.description || rawEvent.eventSummary || '',\n\t\tdate,\n\t\tstartDateTime: rawEvent.startDateTime || '',\n\t\tendDateTime: rawEvent.endDateTime || '',\n\t\tdoorsOpenTime: rawEvent.doorsOpenTime || '',\n\t\ttimezone,\n\t\timageUrl,\n\t\tvenue,\n\t\tperformers,\n\t\ttickets,\n\t\tfaqs,\n\t\tdisclaimer: rawEvent.disclaimer || undefined,\n\t\tstatus,\n\t\teventSeriesId: rawEvent.eventSeriesId || undefined,\n\t\tisPasswordProtected: !!rawEvent.password,\n\t\tisRegistrationEvent: rawEvent.ticketType === 1 || rawEvent.eventTicketingType === 1,\n\t\ttotalTicketsRemaining: totalRemaining,\n\t\ttotalTicketsCapacity: totalCapacity,\n\t\tstageName: rawEvent.stage?.name || rawEvent.stageName || undefined,\n\t\tageRestriction: rawEvent.ageRestriction || undefined,\n\t\tdisplayAgeRestriction: rawEvent.displayAgeRestriction ?? false,\n\t\tdisplayStartTime: rawEvent.displayStartTime ?? true,\n\t\tdisplayEndTime: rawEvent.displayEndTime ?? true,\n\t\tdisplayDoorsTime: rawEvent.displayDoorsTime ?? true,\n\t\tcollectionId: rawEvent.collectionId || rawEvent.collection_id || undefined,\n\t\tvenueAddressLines: parseAddress(rawVenue.address || rawVenue.googleLocationNameCache || ''),\n\t\tgoogleMapsUrl: buildGoogleMapsUrl(rawVenue.address || rawVenue.googleLocationNameCache || '')\n\t};\n}\n\n/**\n * Transform SeriesPageData (from the series API) into our clean EventData interface.\n * Sets eventSeriesId so AirbnbSplitMain renders in full-width series mode.\n */\nexport function transformSeriesPageData(series: SeriesPageData): EventData {\n\tconst timezone = getIANATimezone(series.timeZone || 'UTC');\n\n\t// Build image URL\n\tconst rawImage = series.image || '';\n\tconst imageUrl = rawImage.startsWith('http') ? rawImage : rawImage ? getImageUrl(rawImage) : '';\n\n\t// Map occurrences to SeriesOccurrence[]\n\tconst seriesOccurrences: SeriesOccurrence[] = (series.occurrences || []).map((occ) => ({\n\t\tid: occ.id,\n\t\tslug: occ.slug || '',\n\t\tstartDateTime: occ.startDateTime,\n\t\tendDateTime: occ.endDateTime || '',\n\t\tstatus: (occ.ctaState?.reason === 'sold_out' ? 'sold_out' : 'on_sale') as EventStatus,\n\t\tctaText: occ.ctaState?.text || 'Get Tickets',\n\t\tctaDisabled: occ.ctaState?.disabled || false\n\t}));\n\n\t// Use first occurrence for date fields\n\tconst firstOcc = series.occurrences?.[0];\n\tlet date = '';\n\tif (firstOcc?.startDateTime) {\n\t\tconst dt = new Date(firstOcc.startDateTime);\n\t\tdate = dt.toLocaleDateString('en-CA', { timeZone: timezone, year: 'numeric', month: '2-digit', day: '2-digit' });\n\t}\n\n\t// Map FAQs\n\tconst rawFaq = series.venue?.faq;\n\tlet faqs: FAQItem[] = [];\n\tif (Array.isArray(rawFaq)) {\n\t\tfaqs = rawFaq.map((f) => ({ question: f.question || '', answer: f.answer || '' }));\n\t} else if (typeof rawFaq === 'string' && rawFaq) {\n\t\tfaqs = [{ question: 'FAQ', answer: rawFaq }];\n\t}\n\n\t// Map performers\n\tconst performers: PerformerData[] = (series.performers || []).map((p, index) => ({\n\t\tid: index + 1,\n\t\tdisplayName: p.displayName || [p.firstName, p.lastName].filter(Boolean).join(' '),\n\t\tprofileImage: p.profileImage || undefined\n\t}));\n\n\t// Venue address\n\tconst venueAddress = series.venue?.location || series.venue?.googleLocationNameCache || '';\n\n\treturn {\n\t\tid: series.id,\n\t\ttitle: series.title || '',\n\t\tslug: '',\n\t\tdescription: series.description || series.eventSummary || '',\n\t\tdate,\n\t\tstartDateTime: firstOcc?.startDateTime || '',\n\t\tendDateTime: firstOcc?.endDateTime || '',\n\t\tdoorsOpenTime: '',\n\t\ttimezone,\n\t\timageUrl,\n\t\tvenue: {\n\t\t\tid: series.venue?.id || 0,\n\t\t\tname: series.venue?.name || '',\n\t\t\taddress: venueAddress,\n\t\t\ttimezone,\n\t\t\tserviceFeePercentage: 0,\n\t\t\tserviceFeeCents: 0,\n\t\t\ttaxPercentage: 0\n\t\t},\n\t\tperformers,\n\t\ttickets: [],\n\t\tfaqs,\n\t\tdisclaimer: series.venue?.disclaimer || undefined,\n\t\tstatus: 'on_sale',\n\t\teventSeriesId: series.id,\n\t\tseriesOccurrences,\n\t\tisPasswordProtected: false,\n\t\tisRegistrationEvent: false,\n\t\ttotalTicketsRemaining: 0,\n\t\ttotalTicketsCapacity: 0,\n\t\tvenueAddressLines: parseAddress(venueAddress),\n\t\tgoogleMapsUrl: buildGoogleMapsUrl(venueAddress)\n\t};\n}\n\n/**\n * Transform PublicCollectionData (from the collection API) into our clean EventData interface.\n * Sets collectionId so AirbnbSplitMain renders in full-width collection mode.\n */\nexport function transformCollectionData(collection: PublicCollectionData): EventData {\n\t// Map collection events to CollectionEvent[]\n\tconst collectionEvents: CollectionEvent[] = (collection.events || []).map((ev) => {\n\t\tconst rawImg = ev.image || '';\n\t\treturn {\n\t\t\tid: ev.id,\n\t\t\tname: ev.title || '',\n\t\t\tslug: ev.slug || '',\n\t\t\timage: rawImg.startsWith('http') ? rawImg : rawImg ? getImageUrl(rawImg) : '',\n\t\t\tstartDateTime: ev.startDateTime || '',\n\t\t\tstatus: ((ev.status || 'on_sale') as EventStatus)\n\t\t};\n\t});\n\n\t// Cover image\n\tconst rawCover = collection.coverImage || '';\n\tconst imageUrl = rawCover.startsWith('http') ? rawCover : rawCover ? getImageUrl(rawCover) : '';\n\n\treturn {\n\t\tid: collection.id,\n\t\ttitle: collection.collectionTitle || '',\n\t\tslug: '',\n\t\tdescription: collection.description || collection.summary || '',\n\t\tdate: '',\n\t\tstartDateTime: '',\n\t\tendDateTime: '',\n\t\tdoorsOpenTime: '',\n\t\ttimezone: 'UTC',\n\t\timageUrl,\n\t\tvenue: {\n\t\t\tid: 0,\n\t\t\tname: '',\n\t\t\taddress: '',\n\t\t\ttimezone: 'UTC',\n\t\t\tserviceFeePercentage: 0,\n\t\t\tserviceFeeCents: 0,\n\t\t\ttaxPercentage: 0\n\t\t},\n\t\tperformers: [],\n\t\ttickets: [],\n\t\tfaqs: [],\n\t\tstatus: 'on_sale',\n\t\tcollectionId: collection.id,\n\t\tcollectionEvents,\n\t\tisPasswordProtected: false,\n\t\tisRegistrationEvent: false,\n\t\ttotalTicketsRemaining: 0,\n\t\ttotalTicketsCapacity: 0\n\t};\n}\n","<script lang=\"ts\">\n\timport { Email, Ticket } from 'carbon-icons-svelte';\n\timport { Button, Card, Heading, Text } from '@getmicdrop/svelte-components';\n\timport type { EventData, OrderTotals } from '$lib/premium-ticket-experience/types';\n\timport OrderSummary from './OrderSummary.svelte';\n\n\tinterface Props {\n\t\tevent: EventData;\n\t\torderId: string;\n\t\torderTotals: OrderTotals;\n\t\tcustomerEmail: string;\n\t\tshowCheckmark: boolean;\n\t\tshowContent: boolean;\n\t\tticketPdfUrl?: string;\n\t}\n\n\tlet { event, orderId, orderTotals, customerEmail, showCheckmark, showContent, ticketPdfUrl = undefined }: Props = $props();\n\n\tlet ticketCount = $derived(orderTotals.lines.reduce((sum, l) => sum + l.quantity, 0));\n\n\tlet headingText = $derived(\n\t\tevent.isRegistrationEvent ? \"You're registered!\" : \"You're in!\"\n\t);\n\n\tlet resolvedPdfUrl = $derived(\n\t\tticketPdfUrl || `/api/orders/${orderId}/tickets.pdf`\n\t);\n\n\tfunction handleViewTickets() {\n\t\twindow.open(resolvedPdfUrl, '_blank');\n\t}\n</script>\n\n<Card border padding={false} class=\"rounded-xl shadow-lg overflow-hidden bg-surface-primary\">\n\t<div class=\"p-6 md:p-8\">\n\t\t<!-- Spinner → Checkmark animation -->\n\t\t<div class=\"flex justify-center mb-6\">\n\t\t\t<div class=\"indicator-container\">\n\t\t\t\t<!-- Spinner (visible while loading) -->\n\t\t\t\t<div class=\"processing-spinner\" class:fade-out={showCheckmark}></div>\n\n\t\t\t\t<!-- Animated checkmark (appears after spinner) -->\n\t\t\t\t<svg class=\"checkmark-svg\" class:active={showCheckmark} viewBox=\"0 0 52 52\" aria-hidden=\"true\">\n\t\t\t\t\t<circle cx=\"26\" cy=\"26\" r=\"24\" class=\"checkmark-circle\" />\n\t\t\t\t\t<circle cx=\"26\" cy=\"26\" r=\"24\" class=\"checkmark-fill\" />\n\t\t\t\t\t<path d=\"M14 27l7 7 17-17\" class=\"checkmark-check\" />\n\t\t\t\t</svg>\n\t\t\t</div>\n\t\t</div>\n\n\t\t<!-- Content (fades in after checkmark completes) -->\n\t\t<div class=\"content-section\" class:visible={showContent}>\n\t\t\t<!-- Heading -->\n\t\t\t<div class=\"text-center mb-6\">\n\t\t\t\t<Heading level={1} size=\"xl\" weight=\"bold\" class=\"mb-3\">\n\t\t\t\t\t{headingText}\n\t\t\t\t</Heading>\n\t\t\t\t<Text size=\"lg\" class=\"font-semibold block mb-1\">\n\t\t\t\t\t{event.title}\n\t\t\t\t</Text>\n\t\t\t\t<Text size=\"sm\" color=\"secondary\" class=\"block\">\n\t\t\t\t\t{ticketCount} {ticketCount === 1 ? 'ticket' : 'tickets'} confirmed\n\t\t\t\t</Text>\n\t\t\t</div>\n\n\t\t\t<!-- View Tickets CTA — primary action, prominent placement -->\n\t\t\t<div class=\"mb-6\">\n\t\t\t\t<Button variant=\"default\" size=\"lg\" class=\"w-full\" onclick={handleViewTickets}>\n\t\t\t\t\t<Ticket size={20} />\n\t\t\t\t\tView tickets\n\t\t\t\t</Button>\n\t\t\t</div>\n\n\t\t\t<div class=\"border-t border-default my-6\"></div>\n\n\t\t\t<!-- Order summary (same format as checkout) -->\n\t\t\t<div class=\"mb-6\">\n\t\t\t\t<OrderSummary {orderTotals} />\n\t\t\t</div>\n\n\t\t\t<!-- Order info -->\n\t\t\t<div class=\"flex justify-between items-center py-3 border-t border-default\">\n\t\t\t\t<Text size=\"xs\" color=\"muted\">Order</Text>\n\t\t\t\t<Text size=\"sm\" class=\"font-semibold font-mono\">#{orderId}</Text>\n\t\t\t</div>\n\n\t\t\t<!-- Email confirmation -->\n\t\t\t<div class=\"flex items-center justify-center gap-2 p-3 rounded-lg bg-surface-secondary mt-4\">\n\t\t\t\t<Email size={16} class=\"shrink-0 text-color-muted\" />\n\t\t\t\t<Text size=\"xs\" color=\"secondary\">\n\t\t\t\t\tConfirmation sent to {customerEmail}\n\t\t\t\t</Text>\n\t\t\t</div>\n\n\t\t</div>\n\t</div>\n</Card>\n\n<style>\n\t@reference \"../../../../app.css\";\n\n\t/* Indicator container — holds spinner and checkmark in same space */\n\t.indicator-container {\n\t\tposition: relative;\n\t\twidth: 64px;\n\t\theight: 64px;\n\t}\n\n\t/* Spinner — rotating partial circle */\n\t.processing-spinner {\n\t\tposition: absolute;\n\t\tinset: 0;\n\t\tborder: 3px solid hsl(var(--stroke-primary) / 0.15);\n\t\tborder-top-color: #22c55e;\n\t\tborder-radius: 50%;\n\t\tanimation: spin 0.7s linear infinite;\n\t\ttransition: opacity 0.2s ease;\n\t}\n\n\t.processing-spinner.fade-out {\n\t\topacity: 0;\n\t}\n\n\t@keyframes spin {\n\t\tto { transform: rotate(360deg); }\n\t}\n\n\t/* Checkmark SVG — scales in when active */\n\t.checkmark-svg {\n\t\tposition: absolute;\n\t\tinset: 0;\n\t\twidth: 100%;\n\t\theight: 100%;\n\t\topacity: 0;\n\t\ttransform: scale(0.6);\n\t\ttransition: opacity 0.3s ease, transform 0.4s cubic-bezier(0.34, 1.2, 0.64, 1);\n\t}\n\n\t.checkmark-svg.active {\n\t\topacity: 1;\n\t\ttransform: scale(1);\n\t}\n\n\t/* Circle outline — draws itself */\n\t.checkmark-circle {\n\t\tstroke-dasharray: 151;\n\t\tstroke-dashoffset: 151;\n\t\tstroke-width: 2;\n\t\tstroke: #22c55e;\n\t\tfill: none;\n\t\ttransform-origin: center;\n\t}\n\n\t.checkmark-svg.active .checkmark-circle {\n\t\tanimation: circle-draw 0.5s ease-out 0.1s forwards;\n\t}\n\n\t@keyframes circle-draw {\n\t\tto { stroke-dashoffset: 0; }\n\t}\n\n\t/* Circle fill — fades in after outline completes */\n\t.checkmark-fill {\n\t\tfill: #22c55e;\n\t\topacity: 0;\n\t}\n\n\t.checkmark-svg.active .checkmark-fill {\n\t\tanimation: fill-in 0.25s ease-out 0.5s forwards;\n\t}\n\n\t@keyframes fill-in {\n\t\tto { opacity: 1; }\n\t}\n\n\t/* Checkmark stroke — draws after fill */\n\t.checkmark-check {\n\t\tstroke-dasharray: 36;\n\t\tstroke-dashoffset: 36;\n\t\tstroke-width: 3;\n\t\tstroke: white;\n\t\tfill: none;\n\t\tstroke-linecap: round;\n\t\tstroke-linejoin: round;\n\t}\n\n\t.checkmark-svg.active .checkmark-check {\n\t\tanimation: check-draw 0.3s ease-out 0.6s forwards;\n\t}\n\n\t@keyframes check-draw {\n\t\tto { stroke-dashoffset: 0; }\n\t}\n\n\t/* Content section — fades in after checkmark */\n\t.content-section {\n\t\topacity: 0;\n\t\ttransform: translateY(8px);\n\t\ttransition: opacity 0.5s ease, transform 0.5s ease;\n\t}\n\n\t.content-section.visible {\n\t\topacity: 1;\n\t\ttransform: translateY(0);\n\t}\n\n\t/* Reduced motion */\n\t@media (prefers-reduced-motion: reduce) {\n\t\t.processing-spinner {\n\t\t\tanimation-duration: 0s;\n\t\t}\n\n\t\t.checkmark-svg {\n\t\t\ttransition-duration: 0s;\n\t\t}\n\n\t\t.checkmark-svg .checkmark-circle,\n\t\t.checkmark-svg .checkmark-fill,\n\t\t.checkmark-svg .checkmark-check {\n\t\t\tanimation-duration: 0s;\n\t\t\tanimation-delay: 0s;\n\t\t}\n\n\t\t.content-section {\n\t\t\ttransition-duration: 0s;\n\t\t}\n\t}\n</style>\n","<script lang=\"ts\">\n\timport { onMount } from 'svelte';\n\timport {\n\t\tShare,\n\t\tHelp,\n\t\tArrowLeft,\n\t\tApple,\n\t\tCalendar,\n\t\tChevronDown,\n\t\tLocationFilled\n\t} from 'carbon-icons-svelte';\n\timport { Button, Card, Text } from '@getmicdrop/svelte-components';\n\timport type { EventData } from '$lib/premium-ticket-experience/types';\n\timport { formatBrowseDate, formatEventTime } from '$lib/premium-ticket-experience/defaults';\n\n\tinterface Props {\n\t\tevent: EventData;\n\t\torderId: string;\n\t\teventUrl: string;\n\t\tshowContent: boolean;\n\t}\n\n\tlet { event, orderId, eventUrl, showContent }: Props = $props();\n\n\t// --- Calendar dropdown ---\n\tlet calendarOpen = $state(false);\n\n\tfunction toggleCalendar() {\n\t\tcalendarOpen = !calendarOpen;\n\t}\n\n\t// Close calendar dropdown when clicking outside\n\tonMount(() => {\n\t\tfunction handleClickOutside(e: MouseEvent) {\n\t\t\tconst target = e.target as HTMLElement;\n\t\t\tif (!target.closest('.calendar-dropdown')) {\n\t\t\t\tcalendarOpen = false;\n\t\t\t}\n\t\t}\n\t\tdocument.addEventListener('click', handleClickOutside);\n\t\treturn () => document.removeEventListener('click', handleClickOutside);\n\t});\n\n\t// --- Google Calendar URL ---\n\tlet googleCalendarUrl = $derived((() => {\n\t\tconst startDate = new Date(event.startDateTime);\n\t\tconst endDate = event.endDateTime\n\t\t\t? new Date(event.endDateTime)\n\t\t\t: new Date(startDate.getTime() + 2 * 60 * 60 * 1000);\n\n\t\tconst formatForGoogle = (date: Date): string => {\n\t\t\treturn date.toISOString().replace(/[-:]/g, '').replace(/\\.\\d{3}/, '');\n\t\t};\n\n\t\tconst locationParts = [event.venue.name, event.venue.address].filter(Boolean);\n\t\tconst fullLocation = locationParts.join(', ');\n\n\t\tconst params = new URLSearchParams({\n\t\t\taction: 'TEMPLATE',\n\t\t\ttext: event.title,\n\t\t\tdates: `${formatForGoogle(startDate)}/${formatForGoogle(endDate)}`,\n\t\t\tlocation: fullLocation,\n\t\t\tdetails: `Event: ${eventUrl}\\n\\nTicket confirmation #${orderId}`\n\t\t});\n\n\t\treturn `https://calendar.google.com/calendar/render?${params.toString()}`;\n\t})());\n\n\t// --- ICS file download (Apple Calendar) ---\n\tfunction downloadICS() {\n\t\tconst startDate = new Date(event.startDateTime);\n\t\tconst endDate = event.endDateTime\n\t\t\t? new Date(event.endDateTime)\n\t\t\t: new Date(startDate.getTime() + 2 * 60 * 60 * 1000);\n\n\t\tconst formatForICS = (date: Date): string => {\n\t\t\treturn date.toISOString().replace(/[-:]/g, '').replace(/\\.\\d{3}/, '');\n\t\t};\n\n\t\tconst uid = `order-${orderId}-event-${event.id}@micdrop.com`;\n\t\tconst now = formatForICS(new Date());\n\t\tconst locationParts = [event.venue.name, event.venue.address].filter(Boolean);\n\t\tconst fullLocation = locationParts.join(', ');\n\n\t\tconst escapeICS = (str: string): string => {\n\t\t\tif (!str) return '';\n\t\t\treturn str.replace(/\\\\/g, '\\\\\\\\').replace(/;/g, '\\\\;').replace(/,/g, '\\\\,').replace(/\\n/g, '\\\\n');\n\t\t};\n\n\t\tconst icsContent = `BEGIN:VCALENDAR\nVERSION:2.0\nPRODID:-//MicDrop//Ticket Confirmation//EN\nCALSCALE:GREGORIAN\nMETHOD:PUBLISH\nBEGIN:VEVENT\nUID:${uid}\nDTSTAMP:${now}\nDTSTART:${formatForICS(startDate)}\nDTEND:${formatForICS(endDate)}\nSUMMARY:${escapeICS(event.title)}\nLOCATION:${escapeICS(fullLocation)}\nDESCRIPTION:${escapeICS(`Order #${orderId}\\n\\nView event: ${eventUrl}`)}\nURL:${eventUrl}\nSTATUS:CONFIRMED\nEND:VEVENT\nEND:VCALENDAR`;\n\n\t\tconst blob = new Blob([icsContent], { type: 'text/calendar;charset=utf-8' });\n\t\tconst url = URL.createObjectURL(blob);\n\t\tconst link = document.createElement('a');\n\t\tlink.href = url;\n\t\tconst safeFilename = (event.title || 'event').replace(/[^a-zA-Z0-9\\s-]/g, '').replace(/\\s+/g, '-');\n\t\tlink.download = `${safeFilename}.ics`;\n\t\tdocument.body.appendChild(link);\n\t\tlink.click();\n\t\tdocument.body.removeChild(link);\n\t\tURL.revokeObjectURL(url);\n\n\t\tcalendarOpen = false;\n\t}\n\n\tfunction handleGoogleCalendar() {\n\t\tcalendarOpen = false;\n\t}\n\n\t// --- Share event ---\n\tasync function shareEvent() {\n\t\tconst shareData = { url: eventUrl };\n\n\t\tif (navigator.share) {\n\t\t\ttry {\n\t\t\t\tawait navigator.share(shareData);\n\t\t\t} catch (err: unknown) {\n\t\t\t\tif (err instanceof Error && err.name !== 'AbortError') {\n\t\t\t\t\tfallbackShare();\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tfallbackShare();\n\t\t}\n\t}\n\n\tfunction fallbackShare() {\n\t\tnavigator.clipboard.writeText(eventUrl).then(() => {\n\t\t\talert('Link copied to clipboard!');\n\t\t}).catch(() => {\n\t\t\tprompt('Copy this link:', eventUrl);\n\t\t});\n\t}\n\n\t// --- Wallet handlers (mock — requires backend in production) ---\n\tfunction handleAppleWallet() {\n\t\talert('Apple Wallet integration requires backend signing infrastructure.\\nIn production, this would generate a .pkpass file and add it to your Apple Wallet.');\n\t}\n\n\tfunction handleGoogleWallet() {\n\t\talert('Google Wallet integration requires backend signing infrastructure.\\nIn production, this would create a Google Wallet pass via the Google Pay API.');\n\t}\n\n\t// --- Directions ---\n\tlet directionsUrl = $derived((() => {\n\t\tconst locationParts = [event.venue.name, event.venue.address].filter(Boolean);\n\t\tconst query = encodeURIComponent(locationParts.join(', '));\n\t\treturn `https://www.google.com/maps/search/?api=1&query=${query}`;\n\t})());\n\n\t// --- Navigation ---\n\tfunction handleBackToEvent() {\n\t\twindow.location.href = eventUrl;\n\t}\n</script>\n\n<!--\n\tSuccessActions: Sidebar card matching BookingWidget / CheckoutSidebar pattern.\n\tSingle Card with event thumbnail, date summary, wallet badges, action buttons, and links.\n-->\n<div class=\"actions-wrapper\" class:visible={showContent}>\n\t<Card border padding={false} class=\"rounded-xl shadow-lg overflow-hidden bg-surface-secondary\">\n\t\t<!-- Event poster (same treatment as HeroImage — object-contain, no crop) -->\n\t\t<div class=\"rounded-t-xl overflow-hidden bg-surface-tertiary\">\n\t\t\t<img\n\t\t\t\tsrc={event.imageUrl}\n\t\t\t\talt={event.title}\n\t\t\t\tclass=\"sidebar-poster w-full object-contain\"\n\t\t\t/>\n\t\t</div>\n\n\t\t<div class=\"p-5 space-y-4\">\n\t\t\t<!-- Event info -->\n\t\t\t<div>\n\t\t\t\t<Text size=\"sm\" class=\"font-semibold block leading-tight\">\n\t\t\t\t\t{event.title}\n\t\t\t\t</Text>\n\t\t\t\t<div class=\"flex items-center gap-1.5 mt-1.5\">\n\t\t\t\t\t<Calendar size={16} class=\"shrink-0 icon-muted\" />\n\t\t\t\t\t<Text size=\"xs\" color=\"muted\">\n\t\t\t\t\t\t{formatBrowseDate(event.startDateTime, event.timezone)}\n\t\t\t\t\t\t{#if event.displayStartTime !== false}\n\t\t\t\t\t\t\t· {formatEventTime(event.startDateTime, event.timezone)}\n\t\t\t\t\t\t{/if}\n\t\t\t\t\t</Text>\n\t\t\t\t</div>\n\t\t\t\t<Text size=\"xs\" color=\"muted\" class=\"block mt-0.5\">\n\t\t\t\t\t{event.venue.name}\n\t\t\t\t</Text>\n\t\t\t</div>\n\n\t\t\t<!-- Divider -->\n\t\t\t<div class=\"divider\"></div>\n\n\t\t\t<!-- Wallet badges (official brand assets) -->\n\t\t\t<div class=\"flex flex-col items-center gap-3\">\n\t\t\t\t<button type=\"button\" class=\"wallet-badge-btn\" onclick={handleAppleWallet}>\n\t\t\t\t\t<img\n\t\t\t\t\t\tsrc=\"/wallet-badges/apple-wallet.svg\"\n\t\t\t\t\t\talt=\"Add to Apple Wallet\"\n\t\t\t\t\t\tclass=\"wallet-badge-img\"\n\t\t\t\t\t/>\n\t\t\t\t</button>\n\t\t\t\t<button type=\"button\" class=\"wallet-badge-btn\" onclick={handleGoogleWallet}>\n\t\t\t\t\t<img\n\t\t\t\t\t\tsrc=\"/wallet-badges/google-wallet-dark.svg\"\n\t\t\t\t\t\talt=\"Save to Google Wallet\"\n\t\t\t\t\t\tclass=\"wallet-badge-img google-dark\"\n\t\t\t\t\t/>\n\t\t\t\t\t<img\n\t\t\t\t\t\tsrc=\"/wallet-badges/google-wallet-light.svg\"\n\t\t\t\t\t\talt=\"Save to Google Wallet\"\n\t\t\t\t\t\tclass=\"wallet-badge-img google-light\"\n\t\t\t\t\t/>\n\t\t\t\t</button>\n\t\t\t</div>\n\n\t\t\t<!-- Divider -->\n\t\t\t<div class=\"divider\"></div>\n\n\t\t\t<!-- Calendar dropdown (full width) -->\n\t\t\t<div class=\"calendar-dropdown relative\">\n\t\t\t\t<Button\n\t\t\t\t\tvariant=\"default\"\n\t\t\t\t\tsize=\"md\"\n\t\t\t\t\tclass=\"w-full\"\n\t\t\t\t\tonclick={toggleCalendar}\n\t\t\t\t>\n\t\t\t\t\t<Calendar size={16} />\n\t\t\t\t\tAdd to Calendar\n\t\t\t\t\t<ChevronDown size={16} class=\"ml-auto transition-transform {calendarOpen ? 'rotate-180' : ''}\" />\n\t\t\t\t</Button>\n\n\t\t\t\t{#if calendarOpen}\n\t\t\t\t\t<div class=\"dropdown-menu\">\n\t\t\t\t\t\t<a\n\t\t\t\t\t\t\thref={googleCalendarUrl}\n\t\t\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\t\t\trel=\"noopener noreferrer\"\n\t\t\t\t\t\t\tclass=\"dropdown-item\"\n\t\t\t\t\t\t\tonclick={handleGoogleCalendar}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<svg class=\"shrink-0\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\">\n\t\t\t\t\t\t\t\t<path d=\"M22.56 12.25c0-.78-.07-1.53-.2-2.25H12v4.26h5.92a5.06 5.06 0 0 1-2.2 3.32v2.77h3.57c2.08-1.92 3.28-4.74 3.28-8.1z\" fill=\"#4285F4\"/>\n\t\t\t\t\t\t\t\t<path d=\"M12 23c2.97 0 5.46-.98 7.28-2.66l-3.57-2.77c-.98.66-2.23 1.06-3.71 1.06-2.86 0-5.29-1.93-6.16-4.53H2.18v2.84C3.99 20.53 7.7 23 12 23z\" fill=\"#34A853\"/>\n\t\t\t\t\t\t\t\t<path d=\"M5.84 14.09c-.22-.66-.35-1.36-.35-2.09s.13-1.43.35-2.09V7.07H2.18A10.96 10.96 0 0 0 1 12c0 1.77.42 3.45 1.18 4.93l3.66-2.84z\" fill=\"#FBBC05\"/>\n\t\t\t\t\t\t\t\t<path d=\"M12 5.38c1.62 0 3.06.56 4.21 1.64l3.15-3.15C17.45 2.09 14.97 1 12 1 7.7 1 3.99 3.47 2.18 7.07l3.66 2.84c.87-2.6 3.3-4.53 6.16-4.53z\" fill=\"#EA4335\"/>\n\t\t\t\t\t\t\t</svg>\n\t\t\t\t\t\t\tGoogle Calendar\n\t\t\t\t\t\t</a>\n\t\t\t\t\t\t<button type=\"button\" class=\"dropdown-item\" onclick={downloadICS}>\n\t\t\t\t\t\t\t<Apple size={16} class=\"shrink-0\" />\n\t\t\t\t\t\t\tApple Calendar (.ics)\n\t\t\t\t\t\t</button>\n\t\t\t\t\t</div>\n\t\t\t\t{/if}\n\t\t\t</div>\n\n\t\t\t<!-- Share + Directions row -->\n\t\t\t<div class=\"flex gap-2\">\n\t\t\t\t<Button variant=\"default\" size=\"md\" class=\"flex-1\" onclick={shareEvent}>\n\t\t\t\t\t<Share size={16} />\n\t\t\t\t\tShare\n\t\t\t\t</Button>\n\n\t\t\t\t{#if event.venue.address}\n\t\t\t\t\t<Button\n\t\t\t\t\t\tvariant=\"default\"\n\t\t\t\t\t\tsize=\"md\"\n\t\t\t\t\t\tclass=\"flex-1\"\n\t\t\t\t\t\thref={directionsUrl}\n\t\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<LocationFilled size={16} />\n\t\t\t\t\t\tMap\n\t\t\t\t\t</Button>\n\t\t\t\t{/if}\n\t\t\t</div>\n\n\t\t\t<!-- Text links -->\n\t\t\t<div class=\"flex items-center justify-center gap-4 pt-1\">\n\t\t\t\t<button type=\"button\" class=\"text-link\" onclick={handleBackToEvent}>\n\t\t\t\t\t<ArrowLeft size={16} class=\"shrink-0\" />\n\t\t\t\t\tBack to event\n\t\t\t\t</button>\n\n\t\t\t\t{#if event.venue.contactEmail}\n\t\t\t\t\t<span class=\"text-color-muted\">·</span>\n\t\t\t\t\t<a\n\t\t\t\t\t\thref=\"mailto:{event.venue.contactEmail}?subject=Help with Order {orderId}\"\n\t\t\t\t\t\tclass=\"text-link\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<Help size={16} class=\"shrink-0\" />\n\t\t\t\t\t\tNeed help?\n\t\t\t\t\t</a>\n\t\t\t\t{/if}\n\t\t\t</div>\n\t\t</div>\n\t</Card>\n</div>\n\n<style>\n\t@reference \"../../../../app.css\";\n\n\t/* Wrapper — fades in with content */\n\t.actions-wrapper {\n\t\topacity: 0;\n\t\ttransform: translateY(8px);\n\t\ttransition: opacity 0.5s ease, transform 0.5s ease;\n\t}\n\n\t.actions-wrapper.visible {\n\t\topacity: 1;\n\t\ttransform: translateY(0);\n\t}\n\n\t/* Sidebar poster — same object-contain treatment as HeroImage */\n\t.sidebar-poster {\n\t\tmax-height: 15rem;\n\t\tmin-height: 6rem;\n\t}\n\n\t/* Wallet badges — official brand assets, no modifications per guidelines */\n\t.wallet-badge-btn {\n\t\t@apply block transition-opacity;\n\t}\n\n\t.wallet-badge-btn:hover {\n\t\topacity: 0.85;\n\t}\n\n\t.wallet-badge-btn:active {\n\t\topacity: 0.7;\n\t}\n\n\t.wallet-badge-img {\n\t\theight: 44px;\n\t\twidth: auto;\n\t}\n\n\t/* Google badge: show dark variant in light mode, light variant in dark mode */\n\t.google-light {\n\t\t@apply hidden;\n\t}\n\n\t:global(.dark) .google-dark {\n\t\t@apply hidden;\n\t}\n\n\t:global(.dark) .google-light {\n\t\t@apply block;\n\t}\n\n\t/* Calendar dropdown menu */\n\t.dropdown-menu {\n\t\t@apply absolute top-full left-0 right-0 mt-1 py-1 rounded-lg shadow-lg z-20;\n\t\t@apply bg-surface-primary border border-default;\n\t}\n\n\t.dropdown-item {\n\t\t@apply flex items-center gap-2.5 w-full px-3 py-2 text-sm text-left;\n\t\t@apply text-color-primary transition-colors;\n\t}\n\n\t.dropdown-item:hover {\n\t\t@apply bg-surface-secondary;\n\t}\n\n\t/* Text links */\n\t.text-link {\n\t\t@apply inline-flex items-center gap-1 text-xs text-color-muted transition-colors;\n\t}\n\n\t.text-link:hover {\n\t\t@apply text-color-secondary;\n\t}\n\n\t/* Reduced motion */\n\t@media (prefers-reduced-motion: reduce) {\n\t\t.actions-wrapper {\n\t\t\ttransition-duration: 0s;\n\t\t}\n\t}\n</style>\n","<script lang=\"ts\">\n\timport { onMount } from 'svelte';\n\timport type { EventData, OrderTotals, OrderLine, SuccessData } from '$lib/premium-ticket-experience/types';\n\timport {\n\t\tmockEvent,\n\t\tmockFreeEvent,\n\t\tmockRegistrationEvent,\n\t\tmockDonationEvent\n\t} from '$lib/premium-ticket-experience/mock-data';\n\timport { calculateTax } from '$lib/premium-ticket-experience/defaults';\n\n\timport SuccessTicket from './SuccessTicket.svelte';\n\timport SuccessActions from './SuccessActions.svelte';\n\n\t// --- DataToggle ---\n\ttype SuccessVariant = 'default' | 'free' | 'registration' | 'donation';\n\tlet dataVariant = $state<SuccessVariant>('default');\n\n\tconst toggleOptions: { value: SuccessVariant; label: string; color: string }[] = [\n\t\t{ value: 'default', label: 'Standard', color: 'bg-emerald-500' },\n\t\t{ value: 'free', label: 'Free', color: 'bg-sky-500' },\n\t\t{ value: 'registration', label: 'Registration', color: 'bg-indigo-500' },\n\t\t{ value: 'donation', label: 'Donation', color: 'bg-pink-500' }\n\t];\n\n\t// --- Props (dual-mode: showcase vs production) ---\n\tinterface Props {\n\t\t/** Pre-built success data for production mode. Absence = showcase. */\n\t\tdata?: SuccessData;\n\t\t/** Event page URL for production navigation and sharing. */\n\t\teventUrl?: string;\n\t\t/** Production PDF URL for \"View Tickets\" button. */\n\t\tticketPdfUrl?: string;\n\t}\n\n\tlet {\n\t\tdata: dataProp = undefined,\n\t\teventUrl: eventUrlProp = undefined,\n\t\tticketPdfUrl = undefined,\n\t}: Props = $props();\n\n\tlet isShowcaseMode = $derived(!dataProp);\n\n\t// --- Mock data per variant ---\n\tconst variantData: Record<SuccessVariant, SuccessData> = {\n\t\tdefault: {\n\t\t\tevent: mockEvent,\n\t\t\torderId: '12847',\n\t\t\tlines: [\n\t\t\t\t{ ticketId: 101, ticketName: 'General Admission', quantity: 2, unitPrice: 25, fee: 2.5, subtotal: 50 },\n\t\t\t\t{ ticketId: 102, ticketName: 'VIP Front Row', quantity: 1, unitPrice: 55, fee: 5.5, subtotal: 55 }\n\t\t\t],\n\t\t\tcustomerEmail: 'customer@example.com'\n\t\t},\n\t\tfree: {\n\t\t\tevent: mockFreeEvent,\n\t\t\torderId: '12848',\n\t\t\tlines: [\n\t\t\t\t{ ticketId: 201, ticketName: 'Free Entry', quantity: 2, unitPrice: 0, fee: 0, subtotal: 0 }\n\t\t\t],\n\t\t\tcustomerEmail: 'comedy.fan@gmail.com'\n\t\t},\n\t\tregistration: {\n\t\t\tevent: mockRegistrationEvent,\n\t\t\torderId: '12849',\n\t\t\tlines: [\n\t\t\t\t{ ticketId: 301, ticketName: 'Workshop Seat', quantity: 1, unitPrice: 75, fee: 7.5, subtotal: 75 }\n\t\t\t],\n\t\t\tcustomerEmail: 'learner@example.com'\n\t\t},\n\t\tdonation: {\n\t\t\tevent: mockDonationEvent,\n\t\t\torderId: '12850',\n\t\t\tlines: [\n\t\t\t\t{ ticketId: 401, ticketName: 'Donation', quantity: 1, unitPrice: 25, fee: 0, subtotal: 25 },\n\t\t\t\t{ ticketId: 402, ticketName: 'Standard Admission', quantity: 1, unitPrice: 30, fee: 3, subtotal: 30 }\n\t\t\t],\n\t\t\tcustomerEmail: 'generous@example.com'\n\t\t}\n\t};\n\n\tlet current: SuccessData = $derived(isShowcaseMode ? variantData[dataVariant] : dataProp!);\n\n\t// Build OrderTotals from the mock order lines\n\tlet orderTotals: OrderTotals = $derived((() => {\n\t\tconst lines = current.lines;\n\t\tconst subtotal = lines.reduce((sum, l) => sum + l.subtotal, 0);\n\t\tconst fees = lines.reduce((sum, l) => sum + l.fee * l.quantity, 0);\n\t\tconst taxes = calculateTax(subtotal + fees, current.event.venue.taxPercentage);\n\t\treturn {\n\t\t\tlines,\n\t\t\tsubtotal,\n\t\t\tfees,\n\t\t\ttaxes,\n\t\t\ttotal: subtotal + fees + taxes,\n\t\t\tpromoDiscount: 0,\n\t\t\tgiftCardAmount: 0\n\t\t};\n\t})());\n\n\tlet eventUrl = $derived(\n\t\tisShowcaseMode\n\t\t\t? (() => {\n\t\t\t\tif (typeof window === 'undefined') return '#';\n\t\t\t\treturn `${window.location.origin}/${current.event.id}/${current.event.slug}`;\n\t\t\t})()\n\t\t\t: (eventUrlProp || '#')\n\t);\n\n\t// --- Animation ---\n\tlet showCheckmark = $state(false);\n\tlet showContent = $state(false);\n\tlet reducedMotion = $state(false);\n\n\tfunction runAnimations() {\n\t\tif (reducedMotion) {\n\t\t\tshowCheckmark = true;\n\t\t\tshowContent = true;\n\t\t\treturn;\n\t\t}\n\t\tshowCheckmark = false;\n\t\tshowContent = false;\n\t\tsetTimeout(() => { showCheckmark = true; }, 800);\n\t\tsetTimeout(() => { showContent = true; }, 1600);\n\t}\n\n\t$effect(() => {\n\t\tif (!isShowcaseMode) return;\n\t\tconst _v = dataVariant;\n\t\trunAnimations();\n\t});\n\n\tonMount(() => {\n\t\treducedMotion = window.matchMedia('(prefers-reduced-motion: reduce)').matches;\n\t\trunAnimations();\n\t});\n</script>\n\n<div class=\"w-full min-h-screen bg-surface-primary text-color-primary\">\n\t<!-- DataToggle (showcase mode only) -->\n\t{#if isShowcaseMode}\n\t\t<div class=\"toggle-bar\">\n\t\t\t<span class=\"toggle-label\">Success</span>\n\t\t\t{#each toggleOptions as option}\n\t\t\t\t{@const isActive = dataVariant === option.value}\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tclass=\"toggle-btn {isActive ? 'active' : ''}\"\n\t\t\t\t\tonclick={() => { dataVariant = option.value; }}\n\t\t\t\t>\n\t\t\t\t\t<span class=\"w-1.5 h-1.5 rounded-full {option.color} shrink-0\"></span>\n\t\t\t\t\t{option.label}\n\t\t\t\t</button>\n\t\t\t{/each}\n\t\t</div>\n\t{/if}\n\n\t<div class=\"max-w-6xl mx-auto px-4 py-6 md:px-6 md:py-8\">\n\n\t\t<!-- ============================================== -->\n\t\t<!-- DESKTOP: Two-column layout (1fr 360px) -->\n\t\t<!-- ============================================== -->\n\t\t<div class=\"hidden md:grid gap-8 items-start\" style=\"grid-template-columns: 1fr 360px;\">\n\n\t\t\t<!-- LEFT COLUMN: Confirmation card -->\n\t\t\t<SuccessTicket\n\t\t\t\tevent={current.event}\n\t\t\t\torderId={current.orderId}\n\t\t\t\t{orderTotals}\n\t\t\t\tcustomerEmail={current.customerEmail}\n\t\t\t\t{showCheckmark}\n\t\t\t\t{showContent}\n\t\t\t\t{ticketPdfUrl}\n\t\t\t/>\n\n\t\t\t<!-- RIGHT COLUMN: Sticky sidebar with event info + actions -->\n\t\t\t<div class=\"sticky top-6\">\n\t\t\t\t<SuccessActions\n\t\t\t\t\tevent={current.event}\n\t\t\t\t\torderId={current.orderId}\n\t\t\t\t\t{eventUrl}\n\t\n\t\t\t\t\t{showContent}\n\t\t\t\t/>\n\t\t\t</div>\n\t\t</div>\n\n\t\t<!-- ============================================== -->\n\t\t<!-- MOBILE: Single column -->\n\t\t<!-- ============================================== -->\n\t\t<div class=\"md:hidden space-y-6\">\n\t\t\t<SuccessTicket\n\t\t\t\tevent={current.event}\n\t\t\t\torderId={current.orderId}\n\t\t\t\t{orderTotals}\n\t\t\t\tcustomerEmail={current.customerEmail}\n\t\t\t\t{showCheckmark}\n\t\t\t\t{showContent}\n\t\t\t\t{ticketPdfUrl}\n\t\t\t/>\n\n\t\t\t<SuccessActions\n\t\t\t\tevent={current.event}\n\t\t\t\torderId={current.orderId}\n\t\t\t\t{eventUrl}\n\n\t\t\t\t{showContent}\n\t\t\t/>\n\t\t</div>\n\t</div>\n</div>\n\n<style>\n\t@reference \"../../../../app.css\";\n\n\t/* DataToggle bar */\n\t.toggle-bar {\n\t\t@apply sticky top-0 z-30 flex items-center gap-1 px-3 py-2 overflow-x-auto;\n\t\t@apply bg-surface-primary border-b border-default;\n\t}\n\n\t.toggle-label {\n\t\t@apply px-1.5 shrink-0 text-color-muted uppercase tracking-wider;\n\t\tfont-size: 0.625rem;\n\t}\n\n\t.toggle-btn {\n\t\t@apply flex items-center gap-1.5 px-2 py-1 rounded-md text-xs whitespace-nowrap transition-all;\n\t\t@apply text-color-tertiary;\n\t}\n\n\t.toggle-btn:hover {\n\t\t@apply bg-surface-secondary text-color-secondary;\n\t}\n\n\t.toggle-btn.active {\n\t\t@apply bg-surface-secondary text-color-primary font-medium;\n\t}\n\n</style>\n","<script lang=\"ts\">\n\timport { onMount } from 'svelte';\n\timport { getOrder, clearCheckoutCookies, removeCookie } from '$lib/utils/utils.js';\n\timport { transformApiEvent } from '$lib/premium-ticket-experience/transform';\n\timport SuccessMain from '$lib/premium-ticket-experience/variants/v3-airbnb-split/SuccessMain.svelte';\n\timport type { SuccessData, OrderLine } from '$lib/premium-ticket-experience/types';\n\n\t// --- Legacy fallback ---\n\tlet useLegacy = $state(false);\n\tlet LegacyComponent: any = $state(null);\n\n\tif (typeof window !== 'undefined') {\n\t\tconst params = new URLSearchParams(window.location.search);\n\t\tif (params.get('legacy') === '1') {\n\t\t\tuseLegacy = true;\n\t\t}\n\t}\n\n\t$effect(() => {\n\t\tif (useLegacy && !LegacyComponent) {\n\t\t\timport('./Success.legacy.svelte').then((m) => {\n\t\t\t\tLegacyComponent = m.default;\n\t\t\t}).catch(() => {\n\t\t\t\tuseLegacy = false;\n\t\t\t});\n\t\t}\n\t});\n\n\t// --- Props ---\n\tinterface Props {\n\t\tdata?: any;\n\t\tbrowseUrl?: string;\n\t}\n\n\tlet {\n\t\tdata = {},\n\t\tbrowseUrl = '/',\n\t}: Props = $props();\n\n\t// --- State ---\n\tlet successData = $state<SuccessData | null>(null);\n\tlet eventUrl = $state('');\n\tlet ticketPdfUrl = $state('');\n\tlet loadError = $state<string | null>(null);\n\tlet loading = $state(true);\n\n\tonMount(async () => {\n\t\tconst {\n\t\t\tid,\n\t\t\tslug,\n\t\t\tevent: rawEvent,\n\t\t\torderId: paramOrderId,\n\t\t\torderUuid: paramOrderUuid,\n\t\t\tcustomerEmail: paramEmail,\n\t\t\tticketCount: paramTicketCount,\n\t\t} = data || {};\n\n\t\t// Build event URL\n\t\teventUrl = `${window.location.origin}/${id}/${slug}`;\n\n\t\t// Transform event data\n\t\tlet eventData;\n\t\ttry {\n\t\t\teventData = transformApiEvent(rawEvent);\n\t\t} catch (e) {\n\t\t\tconsole.warn('Success: transformApiEvent failed:', e);\n\t\t\tloadError = 'Failed to load event data.';\n\t\t\tloading = false;\n\t\t\treturn;\n\t\t}\n\n\t\t// Fetch order data\n\t\tlet resolvedOrderId = paramOrderId || '';\n\t\tlet resolvedEmail = paramEmail || '';\n\t\tlet resolvedUuid = paramOrderUuid || '';\n\t\tlet orderLines: OrderLine[] = [];\n\n\t\tif (resolvedOrderId) {\n\t\t\ttry {\n\t\t\t\tconst order = await getOrder(resolvedOrderId);\n\t\t\t\tif (order) {\n\t\t\t\t\t// Extract email\n\t\t\t\t\tresolvedEmail = order.customerEmail || resolvedEmail;\n\t\t\t\t\t// Extract UUID for PDF link\n\t\t\t\t\tresolvedUuid = order.uuid || resolvedUuid;\n\n\t\t\t\t\t// Map purchased tickets to OrderLine[] by grouping by ticketTypeId + ticketName\n\t\t\t\t\tconst tickets = order.purchasedTickets || order.tickets || [];\n\t\t\t\t\tconst grouped = new Map<string, OrderLine>();\n\n\t\t\t\t\tfor (const ticket of tickets) {\n\t\t\t\t\t\tconst key = `${ticket.ticketTypeId || ticket.ticketId || 0}-${ticket.ticketName || ticket.name || ''}`;\n\t\t\t\t\t\tconst existing = grouped.get(key);\n\t\t\t\t\t\tif (existing) {\n\t\t\t\t\t\t\texisting.quantity += 1;\n\t\t\t\t\t\t\texisting.subtotal += (ticket.purchasePrice || ticket.price || 0);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tgrouped.set(key, {\n\t\t\t\t\t\t\t\tticketId: ticket.ticketTypeId || ticket.ticketId || 0,\n\t\t\t\t\t\t\t\tticketName: ticket.ticketName || ticket.name || 'Ticket',\n\t\t\t\t\t\t\t\tquantity: 1,\n\t\t\t\t\t\t\t\tunitPrice: ticket.purchasePrice || ticket.price || 0,\n\t\t\t\t\t\t\t\tfee: 0,\n\t\t\t\t\t\t\t\tsubtotal: ticket.purchasePrice || ticket.price || 0,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\torderLines = Array.from(grouped.values());\n\t\t\t\t}\n\t\t\t} catch (e) {\n\t\t\t\tconsole.warn('Success: getOrder failed, using route params:', e);\n\t\t\t\t// Graceful degradation -- continue with whatever data we have\n\t\t\t}\n\t\t}\n\n\t\t// If no order lines from API, build a placeholder from route params\n\t\tif (orderLines.length === 0 && paramTicketCount > 0) {\n\t\t\torderLines = [{\n\t\t\t\tticketId: 0,\n\t\t\t\tticketName: 'Ticket',\n\t\t\t\tquantity: paramTicketCount,\n\t\t\t\tunitPrice: 0,\n\t\t\t\tfee: 0,\n\t\t\t\tsubtotal: 0,\n\t\t\t}];\n\t\t}\n\n\t\t// Build SuccessData\n\t\tsuccessData = {\n\t\t\tevent: eventData,\n\t\t\torderId: String(resolvedOrderId),\n\t\t\tlines: orderLines,\n\t\t\tcustomerEmail: resolvedEmail,\n\t\t};\n\n\t\t// Build production PDF URL\n\t\tif (resolvedUuid) {\n\t\t\tticketPdfUrl = `https://get-micdrop.com/api/v2/public/orders/${resolvedUuid}/pdf`;\n\t\t}\n\n\t\t// Clear checkout cookies AFTER data is loaded (Pitfall 4)\n\t\tclearCheckoutCookies(String(id));\n\t\tremoveCookie('checkout-cartid');\n\n\t\tloading = false;\n\t});\n</script>\n\n{#if useLegacy && LegacyComponent}\n\t<svelte:component this={LegacyComponent}\n\t\t{data}\n\t\t{browseUrl}\n\t/>\n{:else if loadError}\n\t<div class=\"error-container\">\n\t\t<p>{loadError}</p>\n\t</div>\n{:else if loading || !successData}\n\t<div class=\"loading-container\">\n\t\t<p>Loading your order...</p>\n\t</div>\n{:else}\n\t<SuccessMain data={successData} {eventUrl} {ticketPdfUrl} />\n{/if}\n\n<style>\n\t@reference \"../../app.css\";\n\n\t.loading-container {\n\t\t@apply flex items-center justify-center py-24 text-center;\n\t\tcolor: hsl(var(--Text-Secondary, 215 16% 47%));\n\t}\n\n\t.error-container {\n\t\t@apply flex flex-col items-center justify-center py-24 text-center gap-4;\n\t}\n\n\t.error-container p {\n\t\tcolor: hsl(var(--Status-SoldOut, 0 72% 51%));\n\t}\n</style>\n","// Web Component wrapper for VenueCalendar\n// Only define and register in browser environments to avoid SSR errors\n\nlet MicDropCalendar = null;\n\n// Only create the web component class in browser environments\nif (typeof window !== 'undefined' && typeof HTMLElement !== 'undefined') {\n // Dynamic import to avoid SSR issues with the import itself\n import('./VenueCalendar.js').then(({ initVenueCalendar }) => {\n MicDropCalendar = class extends HTMLElement {\n constructor() {\n super();\n this.component = null;\n this._initVenueCalendar = initVenueCalendar;\n }\n\n connectedCallback() {\n // Get attributes\n const venueId = this.getAttribute('venue-id') || '';\n const view = this.getAttribute('view') || 'calendar';\n const showViewOptions = this.getAttribute('show-view-options') !== 'false';\n const showMonthSwitcher = this.getAttribute('show-month-switcher') !== 'false';\n\n // Initialize the calendar\n this.component = this._initVenueCalendar({\n target: this,\n venueId,\n view,\n events: [],\n showViewOptions,\n showMonthSwitcher,\n });\n }\n\n disconnectedCallback() {\n // Clean up when element is removed\n if (this.component && this.component.$destroy) {\n this.component.$destroy();\n }\n }\n\n // Observed attributes for dynamic updates\n static get observedAttributes() {\n return ['venue-id', 'view', 'show-view-options', 'show-month-switcher'];\n }\n\n attributeChangedCallback(name, oldValue, newValue) {\n if (oldValue === newValue) return;\n\n // Recreate component with new attributes\n if (this.component) {\n this.disconnectedCallback();\n this.connectedCallback();\n }\n }\n };\n\n // Register the custom element\n if (!customElements.get('micdrop-calendar')) {\n customElements.define('micdrop-calendar', MicDropCalendar);\n }\n });\n}\n\nexport { MicDropCalendar };\n\n","// Main library entry point for @get-micdrop/venue-calendar\nimport CalendarContainer from '../components/CalendarContainer/CalendarContainer.svelte';\nimport { mount } from 'svelte';\nimport { writable } from 'svelte/store';\n// carbon-icons-svelte icons no longer used (replaced by custom SVG icons)\nimport calendarIcon from '../assets/icons/calendar-month.svg';\nimport listIcon from '../assets/icons/list-outline.svg';\nimport gridIcon from '../assets/icons/grid-outline.svg';\nimport '../app.css';\nimport {\n themes,\n lightTheme,\n darkTheme,\n highContrastTheme,\n applyTheme,\n generateThemeCSS,\n} from './theme.js';\nimport { setStripeKey } from './config.js';\n\n/**\n * Initialize the Venue Calendar component\n * @param {Object} options - Configuration options\n * @param {string} options.target - CSS selector or HTMLElement to mount the calendar\n * @param {string} options.venueId - The venue ID to fetch events for (default: '')\n * @param {string} options.organizationId - The organization ID to fetch venues for (default: '')\n * @param {string} options.view - Initial view: 'list', 'gallery', or 'calendar' (default: 'calendar')\n * @param {Array} options.events - Array of event objects to display\n * @param {boolean} options.showViewOptions - Whether to show view switcher (default: true)\n * @param {boolean} options.showMonthSwitcher - Whether to show month navigation (default: true)\n * @param {Function} options.onEventClick - Callback function when an event is clicked (receives event data)\n * @returns {Object} - Returns the Svelte component instance\n */\nexport function initVenueCalendar(options = {}) {\n const {\n target,\n venueId = '',\n organizationId = '',\n view = 'calendar',\n events = [],\n showViewOptions = true,\n showMonthSwitcher = true,\n currentMonth,\n currentYear,\n handleNext,\n handlePrev,\n onEventClick,\n featuredItem,\n } = options;\n\n // Find target element\n let targetElement;\n if (typeof target === 'string') {\n targetElement = document.querySelector(target);\n } else if (target instanceof HTMLElement) {\n targetElement = target;\n }\n\n if (!targetElement) {\n console.error('VenueCalendar: Target element not found');\n return null;\n }\n\n // Add micdrop class to scope styles\n if (!targetElement.classList.contains('micdrop')) {\n targetElement.classList.add('micdrop');\n }\n\n // Map view string to VIEW enum\n const VIEW_MAP = {\n 'list': 0,\n 'gallery': 1,\n 'calendar': 2,\n 'carousel': 3,\n 'featured': 4,\n };\n\n const _viewId = VIEW_MAP[view.toLowerCase()] ?? 2;\n\n // Prepare view options\n const viewOptions = showViewOptions ? [\n {\n id: 0,\n text: 'List',\n icon: listIcon,\n },\n {\n id: 1,\n text: 'Gallery',\n icon: gridIcon,\n },\n {\n id: 2,\n text: 'Calendar',\n icon: calendarIcon,\n },\n ] : null;\n\n const defaultMonth = writable(new Date().getUTCMonth());\n const defaultYear = writable(new Date().getUTCFullYear());\n\n const defaultHandleNext = () => {\n defaultMonth.update(m => {\n if (m === 11) {\n defaultYear.update(y => y + 1);\n return 0;\n }\n return m + 1;\n });\n };\n\n const defaultHandlePrev = () => {\n defaultMonth.update(m => {\n if (m === 0) {\n defaultYear.update(y => y - 1);\n return 11;\n }\n return m - 1;\n });\n };\n\n const props = {\n showMonthSwitcher,\n showViewOptions: viewOptions ?? false,\n events: events || [],\n venueId: venueId || '',\n organizationId: organizationId || '',\n currentMonth: currentMonth ?? defaultMonth,\n currentYear: currentYear ?? defaultYear,\n handleNext: handleNext ?? defaultHandleNext,\n handlePrev: handlePrev ?? defaultHandlePrev,\n onEventClick: onEventClick,\n featuredItem: featuredItem || null,\n };\n\n const component = mount(CalendarContainer, {\n target: targetElement,\n props,\n });\n\n return component;\n}\n\n/**\n * Auto-mount: Automatically finds and mounts calendar to elements with class 'micdrop-calendar-container'\n */\n/**\n * Parse ?e=ID-slug deep link param from the host page URL\n * @returns {{ id: string, slug: string } | null}\n */\nfunction parseDeepLink() {\n if (typeof window === 'undefined') return null;\n try {\n const params = new URLSearchParams(window.location.search);\n const eParam = params.get('e');\n if (!eParam) return null;\n const dashIndex = eParam.indexOf('-');\n if (dashIndex === -1) return { id: eParam, slug: '' };\n return { id: eParam.substring(0, dashIndex), slug: eParam.substring(dashIndex + 1) };\n } catch {\n return null;\n }\n}\n\nexport function autoMount() {\n if (typeof window === 'undefined') return;\n\n // Wait for DOM to be ready\n const mountCalendars = () => {\n const containers = document.querySelectorAll('.micdrop-calendar-container');\n\n // Parse deep link from host page URL (shared across all widget instances)\n const deepLink = parseDeepLink();\n\n containers.forEach(container => {\n // Skip if already initialized\n if (container.dataset.micdropInitialized) return;\n\n // Get configuration from data attributes\n const venueId = container.dataset.venueId || container.getAttribute('data-venue-id') || '';\n const organizationId = container.dataset.organizationId || container.getAttribute('data-organization-id') || '';\n const view = container.dataset.view || container.getAttribute('data-view') || 'calendar';\n const showViewOptions = container.dataset.showViewOptions !== 'false';\n const showMonthSwitcher = container.dataset.showMonthSwitcher !== 'false';\n\n // Build onEventClick handler that includes deep link update\n const onEventClick = deepLink ? (event) => {\n // Default click behavior will be handled by the component,\n // but we still update the host URL for deep linking\n try {\n const url = new URL(window.location.href);\n const slug = event.slug || '';\n url.searchParams.set('e', slug ? `${event.id}-${slug}` : String(event.id));\n window.history.replaceState({}, '', url.toString());\n } catch {\n // Ignore\n }\n } : undefined;\n\n // Initialize the calendar\n const instance = initVenueCalendar({\n target: container,\n venueId,\n organizationId,\n view,\n events: [],\n showViewOptions,\n showMonthSwitcher,\n onEventClick,\n });\n\n // If deep link is present, navigate to that event after mount\n if (instance && deepLink) {\n // Dispatch a navigate event that the widget can handle\n container.dispatchEvent(new CustomEvent('micdrop-deep-link', {\n detail: { eventId: deepLink.id, slug: deepLink.slug },\n bubbles: true,\n }));\n }\n\n // Mark as initialized\n if (instance) {\n container.dataset.micdropInitialized = 'true';\n }\n });\n };\n\n // Mount on DOMContentLoaded or immediately if already loaded\n if (document.readyState === 'loading') {\n document.addEventListener('DOMContentLoaded', mountCalendars);\n } else {\n mountCalendars();\n }\n}\n\n// Export the Svelte component directly for advanced users\nexport { CalendarContainer as VenueCalendar };\n\n// Export theme utilities\nexport {\n themes,\n lightTheme,\n darkTheme,\n highContrastTheme,\n applyTheme,\n generateThemeCSS,\n} from './theme.js';\n\n// Export EventDetailsView for event details pages\nimport EventDetailsView from '../components/Views/EventDetailsView.svelte';\nexport { EventDetailsView };\n\n// Export Checkout for checkout pages\nimport Checkout from '../components/Views/Checkout.svelte';\nexport { Checkout };\n\n// Export Success for success pages\nimport Success from '../components/Views/Success.svelte';\nexport { Success };\n\n// Note: EventPage, SeriesPage, and CollectionView have been removed from this PR.\n// These exports are commented out until those components are added in a future PR.\n// export { EventPage };\n// export { SeriesPage };\n// export { SeriesPage as SeriesHomeView };\n// export { CollectionView };\n\n/**\n * Initialize Event Details View\n * @param {Object} options - Configuration options\n * @param {string} options.target - CSS selector or HTMLElement to mount the component\n * @param {string} options.eventId - The event ID to display\n * @param {string} options.venueId - The venue ID (optional)\n * @param {string} options.organizationId - The organization ID (optional)\n * @param {Function} options.onNavigateBack - Callback when back button is clicked\n * @param {Function} options.onNavigateToCart - Callback when navigating to cart\n * @returns {Object} - Returns the Svelte component instance\n */\nexport function initEventDetailsView(options = {}) {\n const {\n target,\n eventId,\n venueId = '',\n organizationId = '',\n onNavigateBack,\n onNavigateToCart,\n } = options;\n\n // Find target element\n let targetElement;\n if (typeof target === 'string') {\n targetElement = document.querySelector(target);\n } else if (target instanceof HTMLElement) {\n targetElement = target;\n }\n\n if (!targetElement) {\n console.error('EventDetailsView: Target element not found');\n return null;\n }\n\n if (!eventId) {\n console.error('EventDetailsView: Event ID is required');\n return null;\n }\n\n const component = mount(EventDetailsView, {\n target: targetElement,\n props: {\n eventId,\n venueId,\n organizationId,\n onNavigateBack,\n onNavigateToCart,\n },\n });\n\n return component;\n}\n\n/**\n * Initialize Checkout View\n * @param {Object} options - Configuration options\n * @param {string} options.target - CSS selector or HTMLElement to mount the component\n * @param {string} options.eventId - The event ID to display\n * @param {string} options.slug - The event slug (optional)\n * @param {string} options.venueId - The venue ID (optional, default: '1')\n * @param {string} options.organizationId - The organization ID (optional, default: '1')\n * @param {Array} options.availableTickets - Array of available tickets (optional)\n * @param {Function} options.onSuccess - Callback when checkout is successful (receives {orderId, eventId, event})\n * @param {Function} options.onNavigateToSuccess - Callback when navigating to success page (receives {orderId, eventId, event})\n * @param {string} options.stripePublishableKey - Stripe publishable key (optional, can also be set via environment variable)\n * @returns {Object} - Returns the Svelte component instance\n */\nexport function initCheckoutView(options = {}) {\n const {\n target,\n eventId,\n slug = '',\n venueId = '',\n organizationId = '',\n availableTickets = [],\n onSuccess,\n onNavigateToSuccess,\n stripePublishableKey,\n } = options;\n\n // Set Stripe key if provided\n if (stripePublishableKey) {\n setStripeKey(stripePublishableKey);\n }\n\n // Find target element\n let targetElement;\n if (typeof target === 'string') {\n targetElement = document.querySelector(target);\n } else if (target instanceof HTMLElement) {\n targetElement = target;\n }\n\n if (!targetElement) {\n console.error('Checkout: Target element not found');\n return null;\n }\n\n if (!eventId) {\n console.error('Checkout: Event ID is required');\n return null;\n }\n\n const component = mount(Checkout, {\n target: targetElement,\n props: {\n data: { id: eventId, slug, event: null },\n availableTickets,\n venueId,\n organizationId,\n onNavigateToSuccess,\n onSuccess,\n },\n });\n\n if (onSuccess && typeof onSuccess === 'function') {\n const handleSuccess = (event) => {\n if (event && event.detail) {\n onSuccess(event.detail);\n }\n };\n\n targetElement.addEventListener('success', handleSuccess, true);\n\n if (component && typeof component.$destroy === 'function') {\n const originalDestroy = component.$destroy;\n component.$destroy = function() {\n targetElement.removeEventListener('success', handleSuccess, true);\n originalDestroy.call(this);\n };\n } else {\n component._successCleanup = () => {\n targetElement.removeEventListener('success', handleSuccess, true);\n };\n }\n }\n\n return component;\n}\n\nexport const initCheckout = initCheckoutView;\n\n/**\n * Initialize Success View\n * @param {Object} options - Configuration options\n * @param {string} options.target - CSS selector or HTMLElement to mount the component\n * @param {string} options.eventId - The event ID (optional)\n * @param {string} options.slug - The event slug (optional)\n * @param {string} options.venueId - The venue ID (optional, default: '1')\n * @param {string} options.organizationId - The organization ID (optional, default: '1')\n * @param {string} options.orderId - The order ID (optional)\n * @returns {Object} - Returns the Svelte component instance\n */\nexport function initSuccessView(options = {}) {\n const {\n target,\n eventId = '',\n slug = '',\n venueId = '',\n organizationId = '',\n orderId = '',\n } = options;\n\n let targetElement;\n if (typeof target === 'string') {\n targetElement = document.querySelector(target);\n } else if (target instanceof HTMLElement) {\n targetElement = target;\n }\n\n if (!targetElement) {\n console.error('Success: Target element not found');\n return null;\n }\n\n const component = mount(Success, {\n target: targetElement,\n props: {\n data: {\n id: eventId,\n slug,\n event: null,\n orderId,\n venueId,\n organizationId,\n venueID: venueId,\n organizationID: organizationId,\n },\n },\n });\n\n return component;\n}\n\nexport const initSuccess = initSuccessView;\n\n// Import and export web component\nimport './web-component.js';\n\n// Auto-mount by default when loaded via script tag\nif (typeof window !== 'undefined' && !window.__MICDROP_CALENDAR_NO_AUTO_MOUNT__) {\n autoMount();\n}\n\n// Default export for convenience\nexport default {\n initVenueCalendar,\n initEventDetailsView,\n initCheckoutView,\n initCheckout,\n initSuccessView,\n initSuccess,\n autoMount,\n VenueCalendar: CalendarContainer,\n themes,\n lightTheme,\n darkTheme,\n highContrastTheme,\n applyTheme,\n generateThemeCSS,\n EventDetailsView,\n Checkout,\n CheckoutView: Checkout,\n Success,\n Sucess: Success, // Keep typo for backward compatibility\n // EventPage, SeriesPage, and CollectionView removed (not in this PR)\n};\n\n"],"names":["assign","target","i","source","key","defaultConverter","value","init","converter","defaultAttributes","set","name","attributes","stringifiedAttributes","attributeName","get","cookies","jar","parts","found","api","DEFAULT_TIMEZONE","LEGACY_TIMEZONE_MAP","isValidTimezone","tz","getIANATimezone","trimmed","upper","parseISO","utcIso","date","formatInTz","timezone","options","formatEventTime","formatTimeRange","startUtc","endUtc","start","end","getDateParts","formatBrowseDate","formatFullDate","formatConfirmationDateTime","CDN_BASE_URL","PLACEHOLDER_IMAGE","getCDNImageUrl","imagePath","getEventImageUrl","event","rawImage","calculateTicketStatus","ticket","now","remaining","total","filterPublicTickets","tickets","filtered","t","calculateScarcity","totalRemaining","totalCapacity","capacity","findLowestPrice","prices","p","formatInTimezone","isoString","timeZone","formatEventTimeRange","formatOptions","startTime","endTime","getDatePartsNew","TransformMode","transformEvent","apiEvent","mode","getEmptyBrowseEvent","getEmptyDetailEvent","imageUrl","base","transformBrowseEvent","transformDetailEvent","startDate","publicTickets","scarcity","allTickets","dateParts","formatDateCustom","getDaysInMonth","generateSlug","text","getImageUrl","baseUrl","getVenueDetails","venueID","response","error","getCookie","Cookies","removeCookie","loadCheckoutStateFromCookies","eventID","quantities","donationAmounts","promocode","promoDiscountAmount","stored","parsed","e","persistCheckoutState","clearCheckoutCookies","minimalTickets","state","getOrder","orderId","errorData","errorMessage","err","createPaymentIntent","cartId","ip","ipRes","ipErr","token","controller","timeoutId","res","validatePaymentIntent","payload","safeSlide","node","params","height","width","svelteSlide","size","color","className","svg","root","$","typography","spinnerColorVariants","concatArrays","array1","array2","combinedArray","createClassValidatorObject","classGroupId","validator","createClassPartObject","nextPart","validators","CLASS_PART_SEPARATOR","EMPTY_CONFLICTS","ARBITRARY_PROPERTY_PREFIX","createClassGroupUtils","config","classMap","createClassMap","conflictingClassGroups","conflictingClassGroupModifiers","getGroupIdForArbitraryProperty","classParts","startIndex","getGroupRecursive","hasPostfixModifier","modifierConflicts","baseConflicts","classPartObject","currentClassPart","nextClassPartObject","result","classRest","validatorsLength","validatorObj","content","colonIndex","property","theme","classGroups","processClassGroups","group","processClassesRecursively","classGroup","len","classDefinition","processClassDefinition","processStringDefinition","processFunctionDefinition","processObjectDefinition","classPartObjectToEdit","getPart","isThemeGetter","entries","path","current","part","next","func","createLruCache","maxCacheSize","cacheSize","cache","previousCache","update","IMPORTANT_MODIFIER","MODIFIER_SEPARATOR","EMPTY_MODIFIERS","createResultObject","modifiers","hasImportantModifier","baseClassName","maybePostfixModifierPosition","isExternal","createParseClassName","prefix","experimentalParseClassName","parseClassName","bracketDepth","parenDepth","modifierStart","postfixModifierPosition","index","currentCharacter","baseClassNameWithImportantModifier","fullPrefix","parseClassNameOriginal","createSortModifiers","modifierWeights","mod","currentSegment","modifier","isArbitrary","isOrderSensitive","createConfigUtils","SPLIT_CLASSES_REGEX","mergeClassList","classList","configUtils","getClassGroupId","getConflictingClassGroupIds","sortModifiers","classGroupsInConflict","classNames","originalClassName","variantModifier","modifierId","classId","conflictGroups","twJoin","classLists","argument","resolvedValue","string","toValue","mix","k","createTailwindMerge","createConfigFirst","createConfigRest","cacheGet","cacheSet","functionToCall","initTailwindMerge","previousConfig","createConfigCurrent","tailwindMerge","cachedResult","args","fallbackThemeArr","fromTheme","themeGetter","arbitraryValueRegex","arbitraryVariableRegex","fractionRegex","tshirtUnitRegex","lengthUnitRegex","colorFunctionRegex","shadowRegex","imageRegex","isFraction","isNumber","isInteger","isPercent","isTshirtSize","isAny","isLengthOnly","isNever","isShadow","isImage","isAnyNonArbitrary","isArbitraryValue","isArbitraryVariable","isArbitrarySize","getIsArbitraryValue","isLabelSize","isArbitraryLength","isLabelLength","isArbitraryNumber","isLabelNumber","isArbitraryWeight","isLabelWeight","isArbitraryFamilyName","isLabelFamilyName","isArbitraryPosition","isLabelPosition","isArbitraryImage","isLabelImage","isArbitraryShadow","isLabelShadow","isArbitraryVariableLength","getIsArbitraryVariable","isArbitraryVariableFamilyName","isArbitraryVariablePosition","isArbitraryVariableSize","isArbitraryVariableImage","isArbitraryVariableShadow","isArbitraryVariableWeight","testLabel","testValue","shouldMatchNoLabel","label","getDefaultConfig","themeColor","themeFont","themeText","themeFontWeight","themeTracking","themeLeading","themeBreakpoint","themeContainer","themeSpacing","themeRadius","themeShadow","themeInsetShadow","themeTextShadow","themeDropShadow","themeBlur","themePerspective","themeAspect","themeEase","themeAnimate","scaleBreak","scalePosition","scalePositionWithArbitrary","scaleOverflow","scaleOverscroll","scaleUnambiguousSpacing","scaleInset","scaleGridTemplateColsRows","scaleGridColRowStartAndEnd","scaleGridColRowStartOrEnd","scaleGridAutoColsRows","scaleAlignPrimaryAxis","scaleAlignSecondaryAxis","scaleMargin","scaleSizing","scaleSizingInline","scaleSizingBlock","scaleColor","scaleBgPosition","scaleBgRepeat","scaleBgSize","scaleGradientStopPosition","scaleRadius","scaleBorderWidth","scaleLineStyle","scaleBlendMode","scaleMaskImagePosition","scaleBlur","scaleRotate","scaleScale","scaleSkew","scaleTranslate","twMerge","formInputSizes","iconSizes","buttonSizes","buttonIconSizes","VIBRATION_PATTERNS","triggerHaptic","style","tapticStyle","pattern","getHapticForButtonVariant","variant","isSuccess","disabled","loading","success","successText","active","href","type","haptic","restProps","$$props","prevSuccess","variantMap","resolvedVariant","effectiveDisabled","variantClasses","activeClasses","disabledClasses","disabledTransparentClasses","sizeClass","transparentVariants","variantClass","isLeftAligned","hasTrailing","roundedClass","handleClick","hapticStyle","buttonClasses","a","root_1","node_1","span","root_2","$$render","consequent","span_1","consequent_1","consequent_2","consequent_3","consequent_4","classes","$$anchor","button","root_7","span_2","root_8","consequent_6","span_3","node_6","consequent_7","consequent_8","consequent_9","consequent_10","span_4","root_13","CheckOutline","node_12","span_5","root_14","consequent_11","consequent_12","classes_1","consequent_5","alternate","padding","border","horizontal","div","checked","handleChange","colorClasses","colorClass","inputClasses","input","$$args","formatCreditCardNumber","formatPhoneNumber","cleanedValue","formattedValue","required","optional","icon","buttonIcon","buttonText","maxlength","minlength","placeholder","id","textareaSize","errorText","helperText","helperIcon","hintText","hintIcon","contentFloat","readonly","controlled","onButtonClick","autocomplete","autofocus","showPasswordToggle","animateFocus","statusText","statusType","buttonDisabled","inputmode","instantSearch","debounceMs","minSearchChars","showClearButton","inputValue","inputElement","debounceTimer","computedInputmode","getInputmodeFromType","inputType","checkForAutofill","isPasswordVisible","hasError","shouldAnimate","togglePasswordVisibility","handleInput","rawInput","sanitized","urlPattern","urlMatch","inputValueStr","clearInput","handleSearchKeyDown","onDestroy","handleBlur","handleFocus","getContentFloatClass","getTextareaSizeClass","handleButtonClick","div_1","label_1","root_3","root_4","div_2","textarea","root_5","$0","$1","div_3","root_6","$$value","EyeSlashOutline","EyeOutline","div_4","root_9","div_5","root_10","input_1","button_1","root_11","CloseCircleOutline","node_9","button_2","root_12","img","img_1","root_15","alternate_1","div_6","root_16","ExclamationCircleOutline","node_14","cubicOut","div_7","root_17","img_2","root_18","consequent_14","node_15","node_16","consequent_13","consequent_15","portal","newTarget","open","persistent","scrollY","prevOpen","handleKeydown","resetModal","sizeClasses","modalSizeClass","scrollbarWidth","event_handler","event_handler_1","node_3","$$node","fly","fade","fragment","level","weightClasses","baseClasses","weightClass","h1","h2","h3","h4","h5","h6","leadingClasses","leadingClass","isNode","createStore","initialState","queries","actions","actionQueue","dispatchQueue","getState","processActionQueue","queue","processDispatchQueue","data","dispatch","isBlocking","actionHandlers","query","str","queryHandles","action","defineProperty","obj","definition","forin","cb","createObject","attr","ns","svgElements","isSVGElement","tag","createElement","element","appendChild","parent","child","appendChildView","childViews","view","removeChildView","IS_BROWSER","isBrowser","testElement","getChildCount","el","getViewRect","elementRect","offset","scale","left","top","right","bottom","rect","childView","childViewRect","expandRect","calculateRectSize","thereYet","position","destination","velocity","errorMargin","spring","stiffness","damping","mass","resting","ts","skipToEndState","f","easeInOutQuad","tween","duration","easing","delay","reverse","animator","createAnimator","category","def","props","addGetSet","keys","overwrite","o","getter","setter","animations","mixinConfig","viewProps","viewInternalAPI","viewExternalAPI","initialProps","animation","addEvent","fn","removeEvent","listeners","viewState","events","add","remove","apis","isDefined","defaults","styles","currentProps","getOffset","getScale","getRect","propsHaveChanged","applyStyles","newProps","prop","opacity","perspective","translateX","translateY","scaleX","scaleY","rotateX","rotateY","rotateZ","originX","originY","transforms","elementCurrentStyle","Mixins","updateRect","createView","read","write","create","destroy","filterFrameActionsForChild","didCreateView","didWriteView","ignoreRect","ignoreRectUpdate","mixins","store","frameRect","isResting","activeMixins","ref","writers","readers","destroyers","getElement","getChildViews","getReference","createChildView","getStyle","_read","internalAPI","reader","_write","frameActions","shouldOptimize","writer","mixin","_destroy","destroyer","sharedAPIDefinition","internalAPIDefinition","needle","externalAPIDefinition","mixinAPIDefinition","b","mixinAPI","childCount","createPainter","fps","painter","interval","last","requestTick","cancelTick","setTimerType","tick","delta","createRoute","routes","timestamp","insertBefore","newNode","referenceNode","insertAfter","isArray","isEmpty","trim","toString","toArray","splitter","isBoolean","toBoolean","isString","toNumber","toInt","toFloat","isInt","toBytes","naturalFileSize","isFunction","toFunctionReference","levels","methods","createServerAPI","outline","createAction","method","timeout","headers","toServerAPI","isNull","isObject","isAPI","getType","replaceSingleQuotes","conversionTable","convertTo","getValueByType","newValue","defaultValue","valueType","newValueType","convertedValue","createOption","currentValue","createOptions","optionDefinition","createInitialState","fromCamels","separator","createOptionAPI","createOptionActions","createOptionQueries","InteractionMethod","getUniqueId","arrayRemove","arr","run","sync","on","off","listener","fire","copyObjectPropertiesToObject","src","excluded","PRIVATE","createItemAPI","item","removeReleasedItems","items","ItemStatus","FileOrigin","getNonNumeric","getDecimalSeparator","getThousandsSeparator","decimalSeparator","thousandsStringWithSeparator","Type","filters","applyFilterChain","utils","resolve","reject","matchingFilters","initialFilter","applyFilters","addFilter","extendDefaultOptions","additionalOptions","defaultOptions","getOptions","setOptions","opts","getItemByQuery","getNumericAspectRatioFromString","aspectRatio","getActiveItems","Status","canUpdateFileInput","dataTransfer","ITEM_ERROR","ITEM_BUSY","ITEM_READY","isItemInErrorState","isItemInBusyState","isItemInReadyState","isAsync","EMPTY","ERROR","BUSY","IDLE","READY","option","status","hasRoomForItem","count","maxFileCount","limit","min","max","arrayInsert","insertItem","isBase64DataURI","getFilenameFromURL","url","getExtensionFromFilename","guesstimateExtension","subtype","leftPad","getDateString","getFileFromBlob","blob","filename","extension","file","getBlobBuilder","createBlob","arrayBuffer","mimeType","BB","bb","getBlobFromByteStringWithMimeType","byteString","ab","ia","getMimeTypeFromBase64DataURI","dataURI","getBase64DataFromBase64DataURI","getByteStringFromBase64DataURI","getBlobFromBase64DataURI","getFileFromBase64DataURI","getFileNameFromHeader","header","matches","getFileSizeFromHeader","getTranfserIdFromHeader","getFileInfoFromHeaders","info","rows","createFileLoader","fetchFn","getProgress","abort","load","loadURL","computable","fileinfo","isGet","sendRequest","aborted","xhr","headersReceived","process","createResponse","code","body","createTimeoutResponse","hasQS","buildURL","createFetchFunction","apiUrl","onload","onerror","progress","request","ChunkStatus","processFileChunked","metadata","transfer","chunks","chunkTransferId","chunkServer","chunkSize","chunkRetryDelays","ondata","fd","requestTransferId","formData","requestParams","requestTransferOffset","requestUrl","lastChunkIndex","completeProcessingChunks","canProcessChunk","chunk","processChunk","processChunks","lengthComputable","loaded","updateTotalProgress","retryProcessChunk","totalBytesTransfered","totalSize","abortChunks","serverId","createFileProcessorFunction","canChunkUpload","shouldChunkUpload","willChunkUpload","createProcessorFunction","createRevertFunction","uniqueFileId","getRandomNumber","createPerceivedPerformanceUpdater","tickMin","tickMax","runtime","createFileProcessor","processFn","allowMinimumUploadDuration","progressFn","completeFn","transferId","reset","getDuration","getFilenameWithoutExtension","createFileStub","isFile","deepCloneObject","v","createItem","origin","serverFileReference","abortProcessingRequestComplete","setStatus","getFileExtension","getFileType","getFileSize","getFile","loader","meta","retryLoad","abortLoad","processor","onprocess","requestProcessing","abortProcessing","revert","revertFileUpload","forceRevert","serverTransferId","setMetadata","silent","handler","itemAPI","getItemIndexByQuery","getItemById","itemId","fetchBlob","getDomainFromURL","isExternalURL","dynamicLabel","isMockItem","listUpdated","optionalPromise","sortItems","compare","getItemByQueryFromState","itemHandler","failure","files","activeItems","change","shouldPrepareOutput","beforePrepareFile","upload","doUpload","currentIndex","interactionMethod","insertLocation","totalItems","ignoredFiles","isValidFile","promises","itemInsertLocation","mainStatus","handleAdd","shouldAdd","loadComplete","restore","fetch","processNow","maxParallelUploads","processNext","queueEntry","itemReference","server","noop","shouldRemove","removeFromView","handleRevert","shouldRevert","requestRemoveResult","optionKeys","prioritizedOptionKeys","PrioritizedOptions","formatFilename","createElement$1","tagName","textNode","polarToCartesian","centerX","centerY","radius","angleInDegrees","angleInRadians","describeArc","x","y","startAngle","endAngle","arcSweep","percentageArc","from","to","ringStrokeWidth","ringFrom","ringTo","coordinates","progressIndicator","create$1","write$1","isDisabled","shouldDisable","fileActionButton","toNaturalFileSize","bytes","labelBytes","labelKilobytes","labelMegabytes","labelGigabytes","KB","MB","GB","removeDecimalsWhenZero","decimalCount","create$2","fileName","fileSize","updateFile","updateFileSizeOnError","fileInfo","toPercentage","create$3","main","sub","didSetItemLoadProgress","title","didSetItemProcessProgress","didRequestItemProcessing","didAbortItemProcessing","didCompleteItemProcessing","clear","fileStatus","Buttons","ButtonKeys","calculateFileInfoOffset","getRemoveIndicatorAligment","buttonRect","calculateButtonWidth","calculateFileVerticalCenterOffset","calculateFileHorizontalCenterOffset","getLoadIndicatorAlignment","getProcessIndicatorAlignment","DefaultStyle","IdleStyle","ProcessingStyle","StyleMap","processingCompleteIndicatorView","create$4","LocalButtons","prev","curr","allowRevert","allowRemove","allowProcess","instantUpload","alignRemoveItemButton","buttonFilter","enabledButtons","map","buttonView","loadIndicatorView","progressIndicatorView","write$2","route","stylesToApply","defaultStyles","control","create$5","didLoadItem","fileWrapper","PANEL_SPRING_PROPS","create$6","section","createSection","viewConstructor","write$3","topRect","bottomRect","panel","createDragHelper","itemIds","prevIndex","ITEM_TRANSLATE_SPRING","ITEM_SCALE_SPRING","StateMap","create$7","grab","removedActivateListener","dragState","drag","drop","cancel","route$1","write$4","getItemsPerRow","horizontalSpace","itemWidth","getItemIndexByPosition","children","positionInView","itemRect","itemHorizontalMargin","itemsPerRow","childMid","itemVerticalMargin","itemHeight","indexX","indexY","offsetX","offsetY","itemTop","itemRight","itemBottom","dropAreaDimensions","val","create$8","addItemView","spawnDate","cooldown","dist","moveItem","vx","vy","introItemView","removeItemView","getItemHeight","getItemWidth","dragItem","numItems","oldIndex","dragPosition","dragHeight","dragWidth","cols","location","visibleChildren","l","idx","childHeight","childBottom","childTop","route$2","write$5","dragCoordinates","dragIndex","addIndex","dragIndexOffset","removeIndexOffset","addIndexOffset","childRect","dragOffset","visualHeight","prevX","prevY","visualIndex","vectorX","vectorY","filterSetItemActions","list","create$9","storeDragCoordinates","clearDragCoordinates","route$3","write$6","newHeight","listScroller","attrToggle","enabledValue","resetFileInput","form","parentNode","create$a","setAcceptedFileTypes","toggleAllowMultiple","toggleDirectoryFilter","toggleDisabled","toggleRequired","setCaptureMethod","doesAllowBrowse","disableField","updateRequiredStatus","hasInvalidField","updateFieldValidityStatus","browser","Key","create$b","updateLabelValue","clickable","dropLabel","addBlob","moveBlob","hideBlob","explodeBlob","write$7","route$4","drip","setInputFiles","create$c","legend","getField","syncFieldPositionsWithItems","didReorderItems","didAddItem","shouldUseFileInput","dataContainer","didLoadItem$1","field","fileItem","didPrepareOutput","didSetDisabled","didRemoveItem","didDefineValue","write$8","getRootNode","images","text$1","guesstimateMimeType","requestDataTransferItems","links","getLinks","hasFiles","getFiles","promisedFiles","isFileSystemItem","getFilesFromItem","returnedFileGroups","isEntry","entry","getAsEntry","isDirectoryEntry","getFilesInDirectory","dirCounter","fileCounter","resolveIfDone","readEntries","dirEntry","directoryReader","readBatch","correctedFile","correctMissingFileType","getLinksFromTransferMetaData","getLinksFromTransferURLData","dragNDropObservers","eventPosition","createDragNDropClient","scopeToObserve","filterElement","observer","getDragNDropObserver","client","newObserver","createDragNDropObserver","clients","dragenter","dragover","dragleave","handlers","createHandler","elementFromPoint","point","isEventTarget","elementAtPosition","initialTarget","setDropEffect","effect","onenter","overDropTarget","onexit","ondrag","allowdrop","allowsTransfer","ondrop","createHopper","scope","validateItems","catchesDropsOnPage","requiresDropOnElement","filterItems","lastState","currentState","filteredItems","listening","listeners$1","handlePaste","activeEl","inScope","listen","unlisten","createPaster","create$d","addFilesNotificationTimeout","notificationClearTimeout","filenames","assist","message","clear$1","listModified","isUsingFilePond","itemAdded","itemRemoved","itemProcessed","itemProcessedUndo","itemError","assistant","toCamels","debounce","immidiateOnly","MAX_FILES_LIMIT","prevent","create$e","canHover","hasPointerEvents","credits","frag","write$9","route$5","bounds","calculateRootBoundingBoxHeight","hopper","isMultiItem","maxItems","atMaxCapacity","addAction","listItemMargin","calculateListItemMargin","listHeight","calculateListHeight","labelHeight","currentLabelHeight","listMarginTop","listMarginBottom","boundsHeight","history","MAX_BOUNCES","bounces","listAvailableHeight","isCappedHeight","panelHeight","itemMargin","visual","scrollList","itemList","newItem","removedItem","verticalItemCount","exceedsMaxFiles","allowReplace","allowMultiple","totalBrowseItems","getDragIndex","toggleDrop","isAllowed","enabled","beforeDropFile","toggleBrowse","togglePaste","createApp","initialOptions","originalElement","visibilityHandler","resizeDoneTimer","isResizing","isResizingHorizontally","initialWindowWidth","currentWindowWidth","resizeHandler","isHidden","readWriteApi","routeActionsToEvents","createEvent","eventRoutes","exposeEvent","detail","exports","prepareFile","addFile","addFiles","isFilePondFile","removeFile","sources","lastArgument","processFile","prepareFiles","processFiles","removeFiles","q","createAppObject","customOptions","lowerCaseFirstLetter","attributeNameToPropertyName","mapObject","object","propertyMap","selector","mapping","selectorRegExp","getAttributesAsObject","attributeMapping","output","attribute","createAppAtElement","mergedOptions","attributeOptions","app","createApp$1","PRIVATE_METHODS","createAppAPI","replaceInString","replacements","match","createWorker","workerBlob","workerURL","worker","transferList","loadImage","renameFile","renamedFile","copyFile","registeredPlugins","createAppPlugin","plugin","pluginOutline","isOperaMini","hasPromises","hasBlobSlice","hasCreateObjectURL","hasVisibility","hasTiming","hasCSSSupports","isIE11","supported","isSupported","OptionTypes","create$f","parse","find","registerPlugin","getOptions$1","setOptions$1","updateOptionTypes","hook","indexToRemove","context","newHook","plugins","isPreviewableImage","vectorMultiply","amount","createVector","vectorAdd","vectorNormalize","vectorRotate","radians","cos","sin","getMarkupValue","scalar","axis","getMarkupStyles","markup","lineStyle","fill","stroke","strokeWidth","lineCap","lineJoin","dashes","getMarkupRect","pointsToPathShape","points","setAttributes","updateEllipse","cx","cy","rx","ry","IMAGE_FIT_STYLE","updateImage","TEXT_ANCHOR","updateText","fontSize","fontFamily","fontWeight","textAlign","updateLine","line","begin","arrowBeginRotationPoint","arrowBeginCenter","arrowBeginA","arrowBeginB","arrowEndRotationPoint","arrowEndCenter","arrowEndA","arrowEndB","updatePath","createShape","createImage","shape","createLine","CREATE_TYPE_ROUTES","UPDATE_TYPE_ROUTES","createMarkupByType","updateMarkupByType","MARKUP_RECT","toOptionalFraction","prepareMarkup","sortMarkupByZIndex","createMarkupView","_","crop","resize","viewWidth","viewHeight","cropWidth","cropHeight","outputWidth","outputHeight","outputFit","outputUpscale","shouldUpscale","scalarWidth","scalarHeight","markupFilter","settings","createVector$1","vectorDot","vectorSubtract","vectorDistanceSquared","vectorDistance","getOffsetPointOnEdge","length","rotation","A","B","C","sinA","sinB","sinC","cosC","ratio","c","getRotatedRectSize","w","h","hor","ver","tl","tr","bl","calculateCanvasSize","image","canvasAspectRatio","zoom","imageAspectRatio","canvasWidth","canvasHeight","imgWidth","imgHeight","getImageRectZoomFactor","imageRect","cropRect","center","imageWidth","imageHeight","rotatedCropSize","getCenteredCropRect","container","getCurrentCropSize","imageSize","canvasSize","stage","shouldLimit","stageZoomFactor","IMAGE_SCALE_SPRING_PROPS","createBitmapView","createImageCanvasWrapper","flip","bitmap","createClipView","transparencyIndicator","dirty","translation","cropAspectRatio","imageView","createImageView","clip","containerWidth","containerHeight","fixedPreviewHeight","minPreviewHeight","maxPreviewHeight","panelAspectRatio","clipHeight","clipWidth","SVG_MASK","SVGMaskUniqueId","createImageOverlayView","fpAPI","mask","BitmapWorker","ColorMatrixWorker","imageData","matrix","m11","m12","m13","m14","m15","m21","m22","m23","m24","m25","m31","m32","m33","m34","m35","m41","m42","m43","m44","m45","r","g","getImageSize","fixImageOrientation","ctx","orientation","createPreviewImage","canvas","isBitmap","MAX_WIDTH","MAX_HEIGHT","calculateAverageColor","averageColor","cloneCanvas","cloneImageData","createImageWrapperView","OverlayView","ImageView","applyFilter","filter","removeImageView","shiftImage","pushImage","background","didUpdateItemMetadata","canCreateImageBitmap","isFirefox","firefoxVersion","didCreatePreviewContainer","fileURL","drawPreview","loadPreviewFallback","previewImageLoaded","pixelDensityFactor","scaleFactor","previewImageRatio","previewContainerWidth","previewContainerHeight","previewImage","done","imageBitmap","didDrawPreview","restoreOverlay","didThrowError","didCompleteProcessing","viewsToRemove","imagePreviewView","viewAPI","is","supportsCreateImageBitmap","maxPreviewFileSize","rescaleItem","itemPanelAspectRatio","fixedHeight","previewAspectRatio","previewHeightMax","previewHeight","didResizeView","didCalculatePreviewSize","isJPEG","Marker","getUint16","little","getUint32","getImageOrientation","marker","tags","testSrc","shouldCorrect","testImage","shouldCorrectImageExifOrientation","isBrowser$1","mimeTypeMatchesWildCard","wildcard","mimeTypeGroup","wildcardGroup","isValidMimeType","acceptedTypes","userInputType","acceptedType","getItemType","validateFile","acceptedFileTypes","typeDetector","detectedType","applyMimeTypeMap","acceptedFileType","validationResult","handleRejection","acceptedFileTypesMapped","acceptedFileTypesMappedUnique","sizeMax","sizeMin","fileFilter","totalSizeMax","_defineProperty","_toPropertyKey","_extends","n","ownKeys","_objectSpread2","_objectWithoutProperties","_objectWithoutPropertiesLoose","_toPrimitive","_typeof","version","userAgent","IE11OrLess","Edge","FireFox","Safari","IOS","ChromeForAndroid","captureMode","getParentOrHost","closest","includeCTX","R_SPACE","toggleClass","css","selfOnly","appliedTransforms","transform","matrixFn","iterator","getWindowScrollingElement","scrollingElement","relativeToContainingBlock","relativeToNonStaticParent","undoScale","elRect","containerRect","elMatrix","isScrolledPast","elSide","parentSide","getParentAutoScrollElement","elSideVal","parentSideVal","visible","getChild","childNum","includeDragEl","currentChild","Sortable","lastChild","getRelativeScrollOffset","offsetLeft","offsetTop","winScroller","indexOfObject","includeSelf","elem","gotSelf","elemCSS","extend","dst","isRectEqual","rect1","rect2","_throttleTimeout","throttle","callback","ms","_this","cancelThrottle","scrollBy","clone","Polymer","getChildContainingRectFromElement","ghostEl","_rect$left","_rect$top","_rect$right","_rect$bottom","expando","AnimationStateManager","animationStates","animationCallbackId","fromRect","childMatrix","animating","animationTime","time","toRect","prevFromRect","prevToRect","animatingRect","targetMatrix","calculateRealTime","currentRect","repaint","PluginManager","eventName","sortable","evt","eventNameGlobal","pluginName","initialized","modified","eventProperties","modifiedValue","dispatchEvent","_ref","rootEl","targetEl","cloneEl","toEl","fromEl","newIndex","oldDraggableIndex","newDraggableIndex","originalEvent","putSortable","extraEventProperties","onName","allEventProperties","_excluded","pluginEvent","dragEl","parentEl","nextEl","lastDownEl","cloneHidden","moved","_hideGhostForTarget","_unhideGhostForTarget","_dispatchEvent","activeGroup","awaitingDragStarted","ignoreNextClick","sortables","tapEvt","touchEvt","lastDx","lastDy","tapDistanceLeft","tapDistanceTop","lastTarget","lastDirection","pastFirstInvertThresh","isCircumstantialInvert","targetMoveDistance","ghostRelativeParent","ghostRelativeParentInitialScroll","_silent","savedInputChecked","documentExists","PositionGhostAbsolutely","CSSFloatProperty","supportDraggable","supportCssPointerEvents","_detectDirection","elCSS","elWidth","child1","child2","firstChildCSS","secondChildCSS","firstChildWidth","secondChildWidth","touchingSideChild2","_dragElInRowColumn","dragRect","targetRect","vertical","dragElS1Opp","dragElS2Opp","dragElOppLength","targetS1Opp","targetS2Opp","targetOppLength","_detectNearestEmptySortable","ret","threshold","insideHorizontally","insideVertically","_prepareGroup","toFn","pull","sameGroup","otherGroup","originalGroup","nearestEmptyInsertDetectEvent","nearest","_checkOutsideTargetEl","preventOnFilter","touch","originalTarget","_saveInputCheckedState","criteria","ownerDocument","dragStartFn","_disableDraggable","_nextTick","fallback","inserted","fallbackTolerance","fallbackOffset","ghostMatrix","relativeScrollOffset","dx","dy","cssMatrix","activeSortable","isOwner","canSort","fromSortable","completedFired","dragOverEvent","extra","completed","after","_onMove","changed","capture","insertion","elLastChild","_ghostIsLast","_ghostIsFirst","firstChild","direction","targetBeforeFirstSwap","differentLevel","differentRowCol","side1","scrolledPastTop","scrollBefore","_getSwapDirection","sibling","nextSibling","moveVector","_unsilent","_cancelNextTick","checkEl","_globalDragOver","order","_generateId","useAnimation","willInsertAfter","onMoveFn","retVal","firstElRect","childContainingRect","spacer","lastElRect","swapThreshold","invertedSwapThreshold","invertSwap","isLastTarget","mouseOnAxis","targetLength","targetS1","targetS2","invert","_getInsertDirection","sum","inputs","_len","_key","autoScrolls","scrollEl","scrollRootEl","scrolling","lastAutoScrollX","lastAutoScrollY","touchEvt$1","pointerElemChangedInterval","AutoScrollPlugin","AutoScroll","_ref2","clearPointerElemChangedInterval","clearAutoScrolls","autoScroll","ogElemScroller","newElem","isFallback","sens","speed","scrollThisInstance","scrollCustomFn","layersOut","currentParent","canScrollX","canScrollY","scrollWidth","scrollHeight","scrollPosX","scrollPosY","scrollOffsetY","scrollOffsetX","dispatchSortableEvent","hideGhostForTarget","unhideGhostForTarget","toSortable","Revert","_ref3","Remove","_ref4","parentSortable","description","subtext","imageSrc","iconType","iconSize","displayTitle","displaySubtext","IconComponent","IconComponent_1","Cancel","closeBtn","inputLabel","inputPlaceholder","inputRequired","inputRows","inputIcon","helpText","showError","validateEmail","primaryButtonText","secondaryButtonText","primaryButtonVariant","isValidEmail","email","emailError","handlePrimaryAction","handleSecondaryAction","closeModal","handleClose","Modal","Button","InputIconComponent","InputIconComponent_1","p_1","ExclamationTriangleOutline","p_2","node_11","labelled","$$sanitized_props","$$restProps","title_1","createPageStore","getPageState","subscribe","writable","originalPushState","originalReplaceState","today","todayLocalMonth","todayLocalYear","currentYear","currentMonth","handleNext","handlePrev","handleToday","disablePastNavigation","isAtCurrentMonth","canGoPrev","prevPressed","nextPressed","todayPressed","handlePrevClick","handleNextClick","handleTodayClick","ChevronLeftOutline","ChevronRightOutline","classes_2","defaultLabels","eventTickets","checkoutTicket","isAgreed","btnText","promoApplied","promoDiscount","currentPromoRule","executePurchase","elements","venueServiceCharge","giftCardApplied","userLabels","labels","getEffectivePrice","isDonationTicket","donationAmount","ticketType","showOrderSummaryOnMobile","feeFor","price","chargeType","fee","maxFee","makeOrderSummaryVisible","getDiscountedPrice","discountTicketIds","basePrice","discountAmount","totalQuantity","showFooter","subtotalWithoutDiscount","acc","effectivePrice","subtotal","discountedPrice","priceToUse","promoSavings","fees","taxRate","taxes","giftCardAmountDisplay","giftCardRemainingBalance","text_1","isDonation","text_3","text_4","text_6","text_2","div_8","text_8","div_9","text_10","div_10","text_12","div_11","node_8","span_6","span_7","div_12","span_8","span_9","div_13","span_10","span_11","div_14","fragment_10","span_12","span_13","div_15","span_14","span_15","text_22","d","text_20","div_16","fragment_11","span_16","p_3","text_24","text_25","div_17","span_17","span_18","text_26","alternate_2","text_14","text_16","text_18","alternate_3","p_4","root_19","text_28","text_29","Spinner","span_19","root_21","alternate_4","fragment_13","div_18","div_19","CloseOutline","div_20","node_18","div_21","root_26","div_22","p_5","p_6","text_33","text_34","alternate_5","div_23","text_36","consequent_16","alternate_6","text_32","consequent_17","consequent_18","div_24","div_25","root_32","span_20","span_21","text_38","consequent_19","div_26","root_33","span_22","span_23","text_40","div_27","root_34","span_24","span_25","text_42","consequent_20","consequent_21","div_28","node_23","span_26","span_27","div_29","span_28","span_29","div_30","span_30","span_31","div_31","fragment_22","span_32","span_33","div_32","root_36","span_34","span_35","text_52","d_1","text_50","consequent_23","div_33","fragment_23","span_36","p_7","text_54","text_55","div_34","root_38","span_37","span_38","text_56","consequent_24","alternate_7","text_31","text_44","text_46","text_48","consequent_25","div_35","root_39","div_36","button_3","span_39","ChevronDownOutline","node_28","span_40","button_4","span_41","root_41","text_60","consequent_26","alternate_8","consequent_27","day","isSelected","handleCardClick","formatHour","timeStr","formatDate","dateStr","showtimes","showTitle","formatDateTime","formatTimeline","selectedDate","shareSuccess","handleSelect","handleShare","shareData","ShareOutline","showtime","ShowTimeCard","node_5","node_7","text_5","performers","ShowImage","showReadMore","activePerformer","characterLimit","showFullDescription","validPerformers","performer","isConfirmed","isNotHidden","profile","hasName","togglePerformer","closePerformer","toggleDescription","fragment_1","fragment_2","displayName","firstName","LogoInstagram","a_1","faqs","accordion","emptyMessage","openIndex","toggleAccordion","$$item","question","answer","ChevronUpOutline","node_4","SCARCITY_LOW_PCT","SCARCITY_ABSOLUTE_FLOOR","SCARCITY_ABSOLUTE_CAP","STATUS_PRIORITY","normalizeStatus","effectiveThreshold","basePct","capPct","floorPct","isScarcityEvent","pct","getBrowseStatus","normalized","eventEnd","isEventUnavailable","browseStatus","filterTodayAndFuture","todayStr","isFree","MAX_EXACT_COUNT","URGENT_PCT","LOW_PCT","ABSOLUTE_CAP","ABSOLUTE_FLOOR","percent","urgentThreshold","lowThreshold","badgeInfo","Fire","groupEventsBySeries","seriesDateMap","seriesId","instances","initialCount","loadMoreCount","showDateColumn","filterFutureOnly","normalizedEvents","displayedCount","loadMoreTrigger","filteredEvents","seriesGrouped","groupedByDate","groupByDate","displayedGroups","sliceGroups","hasMore","groups","dateKey","formatGroupDate","visibleItems","loadMore","onMount","handleEventClick","handlePillClick","instance","handlePillKeydown","ul","grouped","itemIndex","eventStatus","isUnavailable","li","text_7","ScarcityBadge","currentDate","touchStartX","touchStartY","touchStartTime","lastTouchX","lastTouchTime","velocityX","isSwiping","isAnimating","swipeOffset","calendarElement","calendarGridElement","swipeDirection","prefersReducedMotion","momentumAnimationId","mediaQuery","SWIPE_THRESHOLD","VELOCITY_THRESHOLD","DRAG_RESISTANCE","MOMENTUM_FRICTION","MOMENTUM_MIN_VELOCITY","isScheduledBtn","eventCalendar","embedCalendar","currentevents","showPartialPreview","selectedEvent","selectedDayNum","selectedDayMonth","selectedDayYear","showDayHighlight","dayNum","dayElements","MONTH_NAMES","todayLocal","isToday","getStartTime","timeline","noMinutesMatch","parseTimeToMinutes","hours","minutes","period","dateA","dateB","timeA","timeB","daysInMonth","days","startDay","isPast","dayIsToday","dayEvents","year","month","eventDateLocal","groupedEvents","prevMonthPreviewDays","prevMonth","prevYear","daysInPrevMonth","nextMonthPreviewDays","lastDayOfWeek","daysToShow","nextMonth","nextYear","hoveredDay","handleHover","handleMouseLeave","isMobile","handleDayClick","isKeyboard","handleDayKeydown","dayIndex","totalDays","focusNextDay","focusDay","getDayAriaLabel","isoStr","eventCount","eventText","todayText","animateMomentum","initialVelocity","currentVelocity","shadowIntensity","blurRadius","spreadRadius","completeMomentumSwipe","slideContainer","enterFrom","handleTouchStart","handleTouchMove","touchCurrentX","touchCurrentY","diffX","diffY","dt","handleTouchEnd","shouldChange","mouseStartX","mouseStartY","isMouseDragging","handleMouseDown","handleMouseMove","handleMouseUp","animateMonthTransition","onComplete","dayName","abbr","abbr_1","previewDay","node_2","eventGroup","$2","TimePillsListView","node_10","viewOptions","selectedView","onViewChange","onsearch","dropdownOpen","dropdownRef","toggleDropdown","selectView","handleClickOutside","selectedLabel","opt","Input","Search","ChevronDown","mapCalendarStatusToBrowseStatus","isSoldOut","mapped","adaptToBrowseEvents","calendarEvents","getEventAriaLabel","futureEvents","TimePillsGalleryCard","scrollContainer","canScrollLeft","canScrollRight","showArrows","updateScrollState","scrollLeft","clientWidth","scrollByCard","firstCard","cardWidth","heroGrouped","boxes","hoursInDay","quarter","root_20","root_22","root_23","root_24","logger","API_BASE_URL","PUBLIC_BASE_URL","ORDERS_V2_BASE_URL","tzString","tzMap","getMonthEvents","venueId","getOrgMonthEvents","orgId","transformEventData","venueTimezone","formatTime","dateTimeStr","fetchEventDetails","eventId","customFetch","checkEventPassword","password","encodedPassword","joinWaitlist","phone","smsOptIn","applyGiftCard","removeGiftCard","completeGiftCardPayment","customerDetails","onRetry","onClose","retryText","cancelText","WifiOff","getInitialUrl","pageStore","gotoUrl","page","useLegacy","LegacyGalleryView","LegacyGroupedListView","LegacyCarouselView","LegacyFeaturedView","prefetchedMonths","monthEventsCache","loadingMonths","paginationInfo","navigateTo","showViewOptions","showMonthSwitcher","organizationId","featuredItem","isLoading","hasLoaded","isMounted","showNetworkError","networkErrorRetrying","failedMonthKey","SKELETON_DELAY_MS","showDelayedSkeleton","skeletonTimeout","m","shouldShowSkeleton","showContent","calendarRef","VIEW","VIEW_NAMES","viewFromUrl","viewParam","$page","viewIndex","publicView","internalMonth","internalYear","defaultHandleNext","defaultHandlePrev","defaultHandleToday","targetMonth","targetYear","animatedHandleToday","currMonth","$month","$internalMonth","currYear","$year","$internalYear","monthDiff","effectiveHandleNext","effectiveHandlePrev","animatedHandleNext","animatedHandlePrev","DEFAULT_VIEW_OPTIONS","PublicOptions","selectOption","searchQuery","getTestEvent","testDate","loadMonthEvents","isInitial","monthKey","apiMonth","transformedEvents","preloadAdjacentMonths","currentMo","currentYr","initialMonth","initialYear","allCachedEvents","hasNoEvents","allEvents","testEvent","cachedEvents","passedEvents","seen","getEventsForMonth","eventsList","prefetchImagesForMonth","imageUrls","prefetchAdjacentMonths","handleSearch","ev","browseEvents","$filteredEvents","handleNetworkRetry","handleNetworkErrorClose","eventData","eventSlug","updateHostDeepLink","handleBrowseEventClick","browseEvent","slug","$publicView","CalendarToolbar","nav","MonthSwitcher","SkeletonLoader","EmptyState","Calendar","$$component","TimePillsGalleryView","TimePillsCarouselView","TimePillsFeaturedView","PoweredByMicdrop","node_13","NetworkErrorModal","calendarIcon","listIcon","gridIcon","lightTheme","darkTheme","highContrastTheme","themes","applyTheme","cssVarMap","cssVar","generateThemeCSS","lines","goto","onlyOneFreeTicket","dataReady","availableTickets","isMobileDrawer","isCancelled","purchasedTickets","waitlistEnabled","onJoinWaitlist","visibleTickets","totalRemainingCapacity","hasNoTickets","calculatedFee","Time","PriceTag","PriceTagSkeleton","Locked","isSticky","sidebarLeft","aside","ShowCard","TicketActions","show","phoneError","isValidPhone","cleaned","handleSubmit","CheckmarkFilled","disclaimer","fullText","activeTab","scrollToSection","tabId","handleTabKeydown","newTabId","rawEvent","containerRef","stickyRef","stickyTop","showPasswordModal","passwordValue","passwordError","passwordLoading","isPasswordVerified","showWaitlistModal","isEventAuthenticated","evtId","setEventAuthenticated","authedEvents","handlePasswordSubmit","requiresPassword","isLocked","handleJoinWaitlist","filterPublishedShowtimes","rawShowtimes","toFaqArray","venue","venueFAQs","venueDisclaimer","parsedVenueDisclaimer","s","hasPerformers","tabsData","goBack","goToCheckout","updateScreenSize","handleScroll","containerBounding","getTestEventData","loadEventData","effectiveVenueId","venueData","handlePasswordCancel","imageElement","WarningAltFilled","ArrowLeft","StickySidebar","Tab","AboutShow","section_1","FAQs","section_2","Disclaimer","InputModal","WaitlistModal","node_17","RELEASE_TRAIN","runtimeVersionToUrlVersion","ORIGIN","STRIPE_JS_URL","V3_URL_REGEX","STRIPE_JS_URL_REGEX","isStripeJSURL","findScript","scripts","script","injectScript","queryString","headOrBody","registerWrapper","stripe","stripePromise$1","onErrorListener","onLoadListener","onError","cause","onLoad","loadScript","_script$parentNode","initStripe","maybeStripe","pk","isTestKey","expectedVersion","stripePromise","loadCalled","getStripePromise","loadStripe","getPaymentErrorDetails","errorCode","errorType","declineCode","mockVenue","mockPerformers","mockFaqs","mockTickets","mockEvent","mockFreeEvent","mockRegistrationEvent","mockDonationEvent","calculateTax","taxPercentage","DURATION","detectDarkMode","containerSelector","saved","containers","getStripeTheme","isDark","useStripeTheme","watchChanges","updateTheme","display","Text","paymentIntent","paymentError","StripeElementsComp","PaymentElementComp","stripeTheme","lastName","keepUpdated","agreeTerms","cardNumber","cardExpiry","cardCvc","attendees","submitted","errors","att","hasErrors","isTimerUrgent","totalTickets","lastSubmitRequest","handleSameAsPurchaser","ChevronLeft","CheckoutTimer","Heading","Checkbox","attendee","node_24","node_25","node_26","section_3","node_27","Warning","node_30","text_11","Card","OrderSummary","totalTicketCount","dataVariant","toggleOptions","configProp","onPlaceOrderProp","onBackProp","onRetryExpiredProp","isShowcaseMode","buildConfig","timerSeconds","isExpired","processing","submitRequested","orderTotals","adjustedSubtotal","isFreeOrder","isRegistration","handleBack","requestPlaceOrder","handlePlaceOrder","handleRetryExpired","handleVariantChange","isActive","CheckoutForm","CheckoutSidebar","CheckoutMobileFooter","onApplied","onRemoved","appliedCard","showInput","formatCurrency","cents","handleApply","handleRemove","previousCard","toggleInput","Checkmark","Close","slide","Gift","LegacyComponent","initialError","orgSlug","paymentErrorMessage","checkoutConfig","checkoutState","initializeStripePayment","buildOrderLines","buildEventData","details","filteredQuantities","paymentData","stripeKey","venueCharge","qtys","ticketList","ticketId","quantity","unitPrice","calculateTicketFee","serviceFeePercentage","serviceFeeCents","serviceFeeChargeType","maxServiceFeeCents","executeGiftCardOnlyPurchase","submitError","paymentPayload","successData","handleGiftCardApplied","handleGiftCardRemoved","handleExtendSession","CheckoutMain","GiftCardInput","parseAddress","addressStr","stateZipMatch","zip","city","buildGoogleMapsUrl","address","mapTicketStatus","salesBegin","salesEnd","mapEventStatus","rawStatus","transformApiEvent","rawVenue","ticketPdfUrl","ticketCount","headingText","resolvedPdfUrl","handleViewTickets","Ticket","Email","calendarOpen","toggleCalendar","googleCalendarUrl","endDate","formatForGoogle","fullLocation","downloadICS","formatForICS","uid","escapeICS","icsContent","link","safeFilename","handleGoogleCalendar","shareEvent","fallbackShare","handleAppleWallet","handleGoogleWallet","directionsUrl","locationParts","handleBackToEvent","Apple","Share","LocationFilled","fragment_9","Help","dataProp","eventUrlProp","variantData","eventUrl","showCheckmark","reducedMotion","runAnimations","SuccessTicket","SuccessActions","browseUrl","loadError","paramOrderId","paramOrderUuid","paramEmail","paramTicketCount","resolvedOrderId","resolvedEmail","resolvedUuid","orderLines","existing","SuccessMain","MicDropCalendar","VenueCalendar$1","initVenueCalendar","oldValue","onEventClick","targetElement","defaultMonth","defaultYear","mount","CalendarContainer","parseDeepLink","eParam","dashIndex","autoMount","mountCalendars","deepLink","initEventDetailsView","onNavigateBack","onNavigateToCart","EventDetailsView","initCheckoutView","onSuccess","onNavigateToSuccess","stripePublishableKey","component","Checkout","handleSuccess","originalDestroy","initCheckout","initSuccessView","Success","initSuccess","VenueCalendar"],"mappings":"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","x_google_ignoreList":[0,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,107,112]}
|