{"version":3,"mappings":"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","names":["render","_ctx","_cache","_openBlock","_createBlock","_createVNode","subDays","dirtyDate","dirtyAmount","requiredArgs","amount","toInteger","addDays","subMonths","addMonths","sub","date","duration","_typeof","years","months","weeks","days","hours","minutes","seconds","dateWithoutMonths","dateWithoutDays","minutestoSub","secondstoSub","mstoSub","finalDate","props","__props","end","toRefs","difference","ref","intervalToDuration","useIntervalFn","pad","num","size","s","differenceFormatted","computed","d","h","m","nft","side","offer","compact","gobyStore","useGobyStore","submitInProgress","getAndTakeOfferInGoby","offerBech32","getApiRoot","_resolve","reject","error","offeredOrRequested","nfts","assetId","__temp","__restore","_withAsyncContext","offers","expanded","slicedOffers","locale","useI18n","formatDuration","isoString","humanizeDuration","_a","formatTimestamp","timestamp","intlFormat","parseISO","calculateOvertime","auction","endPlusOneHour","add","endMinusOvertimeMinutes","isInOvertime","differenceInMilliseconds","sortedOffers","a","b","lastTime","highestBid","offerTime","diffToLastTime","differenceInSeconds","rops","isMinted","refresh","useFetch","dexieOffers","sellOffers","buyOffers","openDexieOffers","o","getActiveAuction","offsetMinutes","offsetMillis","start","isInRegularTime","overtime","fetchOffers","activeAuction","recentlyEndedAuction","counter","oldActiveAuction","newActiveAuction","recentlyEndedDiff","hasOffersOrAuction","_imports_0","publicAssetsURL","showCollapsed","timeline","auctionStartEvents","auctionEndEvents","event","id","datetime","content","xchPrice","payments","owner","address","minter","acc","payment","previousEvent","navigateToEvent","navigateTo","useRoute","metadata","_b","_d","_c","name","meta","BASE_TITLE","_f","_e","_g","_h","_i","useHead","associatedMedia","webContent","activeMedia","setActiveMedia","media","dataType","getMediaUrl","previewUri","firstDataUri","originalUrl","metadataUrl","licenseUrl","copied","copyToClipboard","input","showSensitive","isSensitiveContent","isZoomedIn","expandAttributes","getNumItems","attributeFrequencyCounts","val","getAttributeFrequency","attribute","traitType","value","getAttributeLink"],"ignoreList":[0,1,2,3,4,5,6,7,8,9,10,11,12,13],"sources":["../../../../node_modules/@heroicons/vue/solid/esm/BellIcon.js","../../../../node_modules/@heroicons/vue/outline/esm/CashIcon.js","../../../../node_modules/@heroicons/vue/outline/esm/ChartBarIcon.js","../../../../node_modules/@heroicons/vue/outline/esm/ChevronDownIcon.js","../../../../node_modules/@heroicons/vue/outline/esm/ChevronUpIcon.js","../../../../node_modules/@heroicons/vue/outline/esm/CubeTransparentIcon.js","../../../../node_modules/@heroicons/vue/outline/esm/CubeIcon.js","../../../../node_modules/@heroicons/vue/outline/esm/DocumentTextIcon.js","../../../../node_modules/@heroicons/vue/outline/esm/ExternalLinkIcon.js","../../../../node_modules/@heroicons/vue/outline/esm/HashtagIcon.js","../../../../node_modules/@heroicons/vue/outline/esm/VideoCameraIcon.js","../../../../node_modules/date-fns/esm/subDays/index.js","../../../../node_modules/date-fns/esm/subMonths/index.js","../../../../node_modules/date-fns/esm/sub/index.js","../../../../components/details/DetailsAuctionCountdown.vue","../../../../components/details/DetailsUploadOfferButton.vue","../../../../components/details/DetailsTakeOfferButton.vue","../../../../components/details/DetailsOfferSide.vue","../../../../components/details/DetailsOffers.vue","../../../../components/details/DetailsDexieOfferSide.vue","../../../../components/details/DetailsDexieOffers.vue","../../../../utilities/overtime.ts","../../../../components/details/DetailsOfferPanel.vue","../../../../virtual:public?%2Fspacescan.ico","../../../../components/details/DetailsProvenance.vue","../../../../pages/nfts/[id]/index.vue"],"sourcesContent":["import { createVNode as _createVNode, openBlock as _openBlock, createBlock as _createBlock } from \"vue\"\n\nexport default function render(_ctx, _cache) {\n return (_openBlock(), _createBlock(\"svg\", {\n xmlns: \"http://www.w3.org/2000/svg\",\n viewBox: \"0 0 20 20\",\n fill: \"currentColor\",\n \"aria-hidden\": \"true\"\n }, [\n _createVNode(\"path\", { d: \"M10 2a6 6 0 00-6 6v3.586l-.707.707A1 1 0 004 14h12a1 1 0 00.707-1.707L16 11.586V8a6 6 0 00-6-6zM10 18a3 3 0 01-3-3h6a3 3 0 01-3 3z\" })\n ]))\n}","import { createVNode as _createVNode, openBlock as _openBlock, createBlock as _createBlock } from \"vue\"\n\nexport default function render(_ctx, _cache) {\n return (_openBlock(), _createBlock(\"svg\", {\n xmlns: \"http://www.w3.org/2000/svg\",\n fill: \"none\",\n viewBox: \"0 0 24 24\",\n \"stroke-width\": \"2\",\n stroke: \"currentColor\",\n \"aria-hidden\": \"true\"\n }, [\n _createVNode(\"path\", {\n \"stroke-linecap\": \"round\",\n \"stroke-linejoin\": \"round\",\n d: \"M17 9V7a2 2 0 00-2-2H5a2 2 0 00-2 2v6a2 2 0 002 2h2m2 4h10a2 2 0 002-2v-6a2 2 0 00-2-2H9a2 2 0 00-2 2v6a2 2 0 002 2zm7-5a2 2 0 11-4 0 2 2 0 014 0z\"\n })\n ]))\n}","import { createVNode as _createVNode, openBlock as _openBlock, createBlock as _createBlock } from \"vue\"\n\nexport default function render(_ctx, _cache) {\n return (_openBlock(), _createBlock(\"svg\", {\n xmlns: \"http://www.w3.org/2000/svg\",\n fill: \"none\",\n viewBox: \"0 0 24 24\",\n \"stroke-width\": \"2\",\n stroke: \"currentColor\",\n \"aria-hidden\": \"true\"\n }, [\n _createVNode(\"path\", {\n \"stroke-linecap\": \"round\",\n \"stroke-linejoin\": \"round\",\n d: \"M9 19v-6a2 2 0 00-2-2H5a2 2 0 00-2 2v6a2 2 0 002 2h2a2 2 0 002-2zm0 0V9a2 2 0 012-2h2a2 2 0 012 2v10m-6 0a2 2 0 002 2h2a2 2 0 002-2m0 0V5a2 2 0 012-2h2a2 2 0 012 2v14a2 2 0 01-2 2h-2a2 2 0 01-2-2z\"\n })\n ]))\n}","import { createVNode as _createVNode, openBlock as _openBlock, createBlock as _createBlock } from \"vue\"\n\nexport default function render(_ctx, _cache) {\n return (_openBlock(), _createBlock(\"svg\", {\n xmlns: \"http://www.w3.org/2000/svg\",\n fill: \"none\",\n viewBox: \"0 0 24 24\",\n \"stroke-width\": \"2\",\n stroke: \"currentColor\",\n \"aria-hidden\": \"true\"\n }, [\n _createVNode(\"path\", {\n \"stroke-linecap\": \"round\",\n \"stroke-linejoin\": \"round\",\n d: \"M19 9l-7 7-7-7\"\n })\n ]))\n}","import { createVNode as _createVNode, openBlock as _openBlock, createBlock as _createBlock } from \"vue\"\n\nexport default function render(_ctx, _cache) {\n return (_openBlock(), _createBlock(\"svg\", {\n xmlns: \"http://www.w3.org/2000/svg\",\n fill: \"none\",\n viewBox: \"0 0 24 24\",\n \"stroke-width\": \"2\",\n stroke: \"currentColor\",\n \"aria-hidden\": \"true\"\n }, [\n _createVNode(\"path\", {\n \"stroke-linecap\": \"round\",\n \"stroke-linejoin\": \"round\",\n d: \"M5 15l7-7 7 7\"\n })\n ]))\n}","import { createVNode as _createVNode, openBlock as _openBlock, createBlock as _createBlock } from \"vue\"\n\nexport default function render(_ctx, _cache) {\n return (_openBlock(), _createBlock(\"svg\", {\n xmlns: \"http://www.w3.org/2000/svg\",\n fill: \"none\",\n viewBox: \"0 0 24 24\",\n \"stroke-width\": \"2\",\n stroke: \"currentColor\",\n \"aria-hidden\": \"true\"\n }, [\n _createVNode(\"path\", {\n \"stroke-linecap\": \"round\",\n \"stroke-linejoin\": \"round\",\n d: \"M14 10l-2 1m0 0l-2-1m2 1v2.5M20 7l-2 1m2-1l-2-1m2 1v2.5M14 4l-2-1-2 1M4 7l2-1M4 7l2 1M4 7v2.5M12 21l-2-1m2 1l2-1m-2 1v-2.5M6 18l-2-1v-2.5M18 18l2-1v-2.5\"\n })\n ]))\n}","import { createVNode as _createVNode, openBlock as _openBlock, createBlock as _createBlock } from \"vue\"\n\nexport default function render(_ctx, _cache) {\n return (_openBlock(), _createBlock(\"svg\", {\n xmlns: \"http://www.w3.org/2000/svg\",\n fill: \"none\",\n viewBox: \"0 0 24 24\",\n \"stroke-width\": \"2\",\n stroke: \"currentColor\",\n \"aria-hidden\": \"true\"\n }, [\n _createVNode(\"path\", {\n \"stroke-linecap\": \"round\",\n \"stroke-linejoin\": \"round\",\n d: \"M20 7l-8-4-8 4m16 0l-8 4m8-4v10l-8 4m0-10L4 7m8 4v10M4 7v10l8 4\"\n })\n ]))\n}","import { createVNode as _createVNode, openBlock as _openBlock, createBlock as _createBlock } from \"vue\"\n\nexport default function render(_ctx, _cache) {\n return (_openBlock(), _createBlock(\"svg\", {\n xmlns: \"http://www.w3.org/2000/svg\",\n fill: \"none\",\n viewBox: \"0 0 24 24\",\n \"stroke-width\": \"2\",\n stroke: \"currentColor\",\n \"aria-hidden\": \"true\"\n }, [\n _createVNode(\"path\", {\n \"stroke-linecap\": \"round\",\n \"stroke-linejoin\": \"round\",\n d: \"M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z\"\n })\n ]))\n}","import { createVNode as _createVNode, openBlock as _openBlock, createBlock as _createBlock } from \"vue\"\n\nexport default function render(_ctx, _cache) {\n return (_openBlock(), _createBlock(\"svg\", {\n xmlns: \"http://www.w3.org/2000/svg\",\n fill: \"none\",\n viewBox: \"0 0 24 24\",\n \"stroke-width\": \"2\",\n stroke: \"currentColor\",\n \"aria-hidden\": \"true\"\n }, [\n _createVNode(\"path\", {\n \"stroke-linecap\": \"round\",\n \"stroke-linejoin\": \"round\",\n d: \"M10 6H6a2 2 0 00-2 2v10a2 2 0 002 2h10a2 2 0 002-2v-4M14 4h6m0 0v6m0-6L10 14\"\n })\n ]))\n}","import { createVNode as _createVNode, openBlock as _openBlock, createBlock as _createBlock } from \"vue\"\n\nexport default function render(_ctx, _cache) {\n return (_openBlock(), _createBlock(\"svg\", {\n xmlns: \"http://www.w3.org/2000/svg\",\n fill: \"none\",\n viewBox: \"0 0 24 24\",\n \"stroke-width\": \"2\",\n stroke: \"currentColor\",\n \"aria-hidden\": \"true\"\n }, [\n _createVNode(\"path\", {\n \"stroke-linecap\": \"round\",\n \"stroke-linejoin\": \"round\",\n d: \"M7 20l4-16m2 16l4-16M6 9h14M4 15h14\"\n })\n ]))\n}","import { createVNode as _createVNode, openBlock as _openBlock, createBlock as _createBlock } from \"vue\"\n\nexport default function render(_ctx, _cache) {\n return (_openBlock(), _createBlock(\"svg\", {\n xmlns: \"http://www.w3.org/2000/svg\",\n fill: \"none\",\n viewBox: \"0 0 24 24\",\n \"stroke-width\": \"2\",\n stroke: \"currentColor\",\n \"aria-hidden\": \"true\"\n }, [\n _createVNode(\"path\", {\n \"stroke-linecap\": \"round\",\n \"stroke-linejoin\": \"round\",\n d: \"M15 10l4.553-2.276A1 1 0 0121 8.618v6.764a1 1 0 01-1.447.894L15 14M5 18h8a2 2 0 002-2V8a2 2 0 00-2-2H5a2 2 0 00-2 2v8a2 2 0 002 2z\"\n })\n ]))\n}","import addDays from \"../addDays/index.js\";\nimport requiredArgs from \"../_lib/requiredArgs/index.js\";\nimport toInteger from \"../_lib/toInteger/index.js\";\n/**\n * @name subDays\n * @category Day Helpers\n * @summary Subtract the specified number of days from the given date.\n *\n * @description\n * Subtract the specified number of days from the given date.\n *\n * @param {Date|Number} date - the date to be changed\n * @param {Number} amount - the amount of days to be subtracted. Positive decimals will be rounded using `Math.floor`, decimals less than zero will be rounded using `Math.ceil`.\n * @returns {Date} the new date with the days subtracted\n * @throws {TypeError} 2 arguments required\n *\n * @example\n * // Subtract 10 days from 1 September 2014:\n * const result = subDays(new Date(2014, 8, 1), 10)\n * //=> Fri Aug 22 2014 00:00:00\n */\nexport default function subDays(dirtyDate, dirtyAmount) {\n requiredArgs(2, arguments);\n var amount = toInteger(dirtyAmount);\n return addDays(dirtyDate, -amount);\n}","import toInteger from \"../_lib/toInteger/index.js\";\nimport addMonths from \"../addMonths/index.js\";\nimport requiredArgs from \"../_lib/requiredArgs/index.js\";\n/**\n * @name subMonths\n * @category Month Helpers\n * @summary Subtract the specified number of months from the given date.\n *\n * @description\n * Subtract the specified number of months from the given date.\n *\n * @param {Date|Number} date - the date to be changed\n * @param {Number} amount - the amount of months to be subtracted. Positive decimals will be rounded using `Math.floor`, decimals less than zero will be rounded using `Math.ceil`.\n * @returns {Date} the new date with the months subtracted\n * @throws {TypeError} 2 arguments required\n *\n * @example\n * // Subtract 5 months from 1 February 2015:\n * const result = subMonths(new Date(2015, 1, 1), 5)\n * //=> Mon Sep 01 2014 00:00:00\n */\nexport default function subMonths(dirtyDate, dirtyAmount) {\n requiredArgs(2, arguments);\n var amount = toInteger(dirtyAmount);\n return addMonths(dirtyDate, -amount);\n}","import _typeof from \"@babel/runtime/helpers/esm/typeof\";\nimport subDays from \"../subDays/index.js\";\nimport subMonths from \"../subMonths/index.js\";\nimport requiredArgs from \"../_lib/requiredArgs/index.js\";\nimport toInteger from \"../_lib/toInteger/index.js\";\n/**\n * @name sub\n * @category Common Helpers\n * @summary Subtract the specified years, months, weeks, days, hours, minutes and seconds from the given date.\n *\n * @description\n * Subtract the specified years, months, weeks, days, hours, minutes and seconds from the given date.\n *\n * @param {Date|Number} date - the date to be changed\n * @param {Duration} duration - the object with years, months, weeks, days, hours, minutes and seconds to be subtracted\n *\n * | Key | Description |\n * |---------|------------------------------------|\n * | years | Amount of years to be subtracted |\n * | months | Amount of months to be subtracted |\n * | weeks | Amount of weeks to be subtracted |\n * | days | Amount of days to be subtracted |\n * | hours | Amount of hours to be subtracted |\n * | minutes | Amount of minutes to be subtracted |\n * | seconds | Amount of seconds to be subtracted |\n *\n * All values default to 0\n *\n * @returns {Date} the new date with the seconds subtracted\n * @throws {TypeError} 2 arguments required\n *\n * @example\n * // Subtract the following duration from 15 June 2017 15:29:20\n * const result = sub(new Date(2017, 5, 15, 15, 29, 20), {\n * years: 2,\n * months: 9,\n * weeks: 1,\n * days: 7,\n * hours: 5,\n * minutes: 9,\n * seconds: 30\n * })\n * //=> Mon Sep 1 2014 10:19:50\n */\nexport default function sub(date, duration) {\n requiredArgs(2, arguments);\n if (!duration || _typeof(duration) !== 'object') return new Date(NaN);\n var years = duration.years ? toInteger(duration.years) : 0;\n var months = duration.months ? toInteger(duration.months) : 0;\n var weeks = duration.weeks ? toInteger(duration.weeks) : 0;\n var days = duration.days ? toInteger(duration.days) : 0;\n var hours = duration.hours ? toInteger(duration.hours) : 0;\n var minutes = duration.minutes ? toInteger(duration.minutes) : 0;\n var seconds = duration.seconds ? toInteger(duration.seconds) : 0;\n\n // Subtract years and months\n var dateWithoutMonths = subMonths(date, months + years * 12);\n\n // Subtract weeks and days\n var dateWithoutDays = subDays(dateWithoutMonths, days + weeks * 7);\n\n // Subtract hours, minutes and seconds\n var minutestoSub = minutes + hours * 60;\n var secondstoSub = seconds + minutestoSub * 60;\n var mstoSub = secondstoSub * 1000;\n var finalDate = new Date(dateWithoutDays.getTime() - mstoSub);\n return finalDate;\n}","<script setup>\nimport { useIntervalFn } from '@vueuse/core';\nimport { intervalToDuration } from 'date-fns';\n\nconst props = defineProps(['end', 'offers']);\nconst { end } = toRefs(props);\n\nconsole.log(end);\nconst difference = ref(\n intervalToDuration({\n start: new Date(),\n end: end.value,\n })\n);\nuseIntervalFn(() => {\n difference.value = intervalToDuration({\n start: new Date(),\n end: end.value,\n });\n}, 1000);\n\nfunction pad(num, size) {\n let s = num + '';\n while (s.length < size) s = '0' + s;\n return s;\n}\n\nconst differenceFormatted = computed(() => {\n if (difference.value.days >= 1) {\n const d = pad(difference.value.days, 2);\n const h = pad(difference.value.hours, 2);\n const m = pad(difference.value.minutes, 2);\n return `${d}d ${h}h ${m}m`;\n } else {\n const h = pad(difference.value.hours, 2);\n const m = pad(difference.value.minutes, 2);\n const s = pad(difference.value.seconds, 2);\n return `${h}:${m}:${s}`;\n }\n});\n</script>\n<template>\n <div>\n <div class=\"text-xl font-bold tabular-nums dark:text-white lg:text-4xl\">{{ differenceFormatted }}</div>\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport type { PropType } from 'vue';\n\nconst props = defineProps({\n nft: { type: Object as PropType<any>, default: () => undefined },\n side: { type: Number as PropType<1 | 2>, default: () => undefined },\n primary: { type: Boolean, default: () => true },\n});\nconst { nft, side } = toRefs(props);\n</script>\n<template>\n <NuxtLink\n :to=\"`/offers/upload?nft=${nft.encoded_id}&side=${side || 1}`\"\n :class=\"[\n primary\n ? ' bg-black text-white dark:bg-neutral-100 dark:text-black'\n : ' bg-white text-black dark:border-[#303030] dark:bg-neutral-800 dark:text-white',\n ]\"\n class=\"betterhover:hover:shadow-card-hover flex w-full justify-center rounded-full border border-transparent px-4 py-3 font-semibold transition duration-100 ease-in-out betterhover:hover:-translate-y-0.5\"\n >\n <slot></slot>\n </NuxtLink>\n</template>\n","<script setup lang=\"ts\">\nimport type { PropType } from 'vue';\nimport { getApiRoot } from '~/utilities/api';\n\nconst props = defineProps({\n compact: Boolean as PropType<boolean>,\n offer: { type: Object as PropType<any>, required: true },\n});\nconst { offer, compact } = toRefs(props);\n\nconst gobyStore = useGobyStore();\n\nconst submitInProgress = ref(false);\n\nconst getAndTakeOfferInGoby = async (offer: any) => {\n const offerBech32 = await $fetch<any>(`${getApiRoot()}/offers/${offer.id}/bech32`);\n\n if (offerBech32) {\n submitInProgress.value = true;\n try {\n await Promise.race([\n gobyStore.takeOffer(offerBech32),\n new Promise((_resolve, reject) =>\n setTimeout(() => reject(new Error('Offer taking timed out after 30 seconds')), 30000)\n ),\n ]);\n } catch (error) {\n console.error(error);\n } finally {\n submitInProgress.value = false;\n }\n }\n};\n</script>\n<template>\n <button\n v-if=\"gobyStore.isWalletInstalled\"\n type=\"button\"\n :class=\"[\n compact ? 'bg-black px-6 py-2 text-sm dark:bg-neutral-100 dark:text-black ' : 'w-full bg-green-600 px-4 py-3',\n ]\"\n class=\"betterhover:hover:shadow-card-hover flex items-center justify-center rounded-full border border-transparent font-semibold text-white transition duration-100 ease-in-out betterhover:hover:-translate-y-0.5\"\n @click.prevent=\"getAndTakeOfferInGoby(offer)\"\n >\n <svg\n v-if=\"submitInProgress\"\n :class=\"[compact ? 'dark:image-black h-4 w-4' : 'h-6 w-6']\"\n class=\"-ml-1 mr-2 h-5 w-5 animate-spin text-white dark:text-black\"\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n >\n <circle class=\"opacity-25\" cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\" stroke-width=\"4\"></circle>\n <path\n class=\"opacity-75\"\n fill=\"currentColor\"\n d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z\"\n ></path>\n </svg>\n <img\n v-else-if=\"gobyStore.type === 'goby'\"\n :class=\"[compact ? 'dark:image-black -ml-1 mr-2 h-4 w-4' : '-ml-1 mr-2 h-6 w-6']\"\n aria-hidden=\"true\"\n src=\"/goby-logo-white.svg\"\n />\n <img\n v-else-if=\"gobyStore.type === 'walletconnect'\"\n :class=\"[compact ? 'dark:image-black -ml-1 mr-2 h-4 w-4' : '-ml-1 mr-2 h-6 w-6']\"\n src=\"https://sagewallet.net/assets/sage-logo.png\"\n />\n <slot></slot>\n </button>\n <NuxtLink\n v-else\n :to=\"`/offers/${offer.id}`\"\n :class=\"[compact ? 'bg-black px-6 py-2 text-sm' : 'w-full bg-green-600 px-4 py-3']\"\n class=\"betterhover:hover:shadow-card-hover flex items-center justify-center rounded-full border border-transparent font-semibold text-white transition duration-100 ease-in-out dark:bg-neutral-100 dark:text-black betterhover:hover:-translate-y-0.5\"\n >\n <slot></slot>\n </NuxtLink>\n</template>\n","<script setup lang=\"ts\">\nimport { getApiRoot } from '~/utilities/api';\nimport { formatXchPrice } from '~/utilities/chia-display-utils';\nimport type { PropType } from 'vue';\n\nconst props = defineProps({\n offeredOrRequested: { type: Object as PropType<{ [assetId: string]: number }>, required: true },\n});\nconst { offeredOrRequested } = toRefs(props);\n\nconst nfts = ref<{ [assetId: string]: any }>({});\nfor (const assetId of Object.keys(offeredOrRequested.value)) {\n if (assetId.startsWith('nft')) {\n nfts.value[assetId] = await $fetch<any>(`${getApiRoot()}/nfts/${assetId}`);\n }\n}\n</script>\n<template>\n <div class=\"w-full\">\n <!-- TODO Check whether a Nuxt upgrade fixes this-->\n <ClientOnly>\n <div v-for=\"[assetId, amount] in Object.entries(offeredOrRequested)\" :key=\"assetId\">\n <div v-if=\"assetId === 'xch'\" class=\"flex items-center gap-1\">\n <img class=\"h-5 w-5\" src=\"/chia_circle.png\" />\n {{ formatXchPrice(amount, true) }}\n </div>\n <NuxtLink :to=\"`/nfts/${assetId}`\" v-else-if=\"assetId.startsWith('nft')\" class=\"flex h-6 items-center gap-2\">\n <img\n v-if=\"nfts[assetId]?.data?.thumbnail_uri\"\n :src=\"nfts[assetId]?.data?.thumbnail_uri\"\n loading=\"lazy\"\n class=\"h-6 w-6 flex-shrink-0 rounded-md border object-cover object-center\"\n />\n <span class=\"truncate\">\n {{ nfts[assetId]?.data?.metadata_json?.name || assetId }}\n </span>\n </NuxtLink>\n <NuxtLink\n v-else\n target=\"_blank\"\n :to=\"`https://dexie.space/assets/${assetId}`\"\n class=\"inline-flex items-center gap-1 font-semibold text-neutral-700 dark:text-neutral-200\"\n >\n <img class=\"h-6 w-6 rounded-full\" :src=\"`https://icons.dexie.space/${assetId}.webp`\" />{{ amount }}\n </NuxtLink>\n </div>\n </ClientOnly>\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport type { PropType } from 'vue';\nimport { intlFormat, parseISO } from 'date-fns';\nimport humanizeDuration from 'humanize-duration';\nimport { useI18n } from 'vue-i18n';\nimport Popper from 'vue3-popper';\nimport { ChevronUpIcon, ChevronDownIcon } from '@heroicons/vue/outline';\n\nconst props = defineProps({\n offers: Object as PropType<any>,\n nft: Object as PropType<any>,\n});\nconst { offers, nft } = toRefs(props);\n\nconst expanded = ref(false);\nconst slicedOffers = computed(() => {\n return (expanded.value ? offers.value : offers.value.slice(0, 4)) || [];\n});\n\nconst { locale } = useI18n();\n\nconst formatDuration = (isoString: number) => {\n return humanizeDuration(Date.now() - new Date(isoString).valueOf(), {\n largest: 1,\n language: locale.value?.replace('zh', 'zh_CN') || 'en',\n });\n};\nconst formatTimestamp = (timestamp: string) => {\n return intlFormat(parseISO(timestamp), { dateStyle: 'medium', timeStyle: 'medium' } as any);\n};\n</script>\n<template>\n <div class=\"mx-0 mt-1 rounded-lg bg-white ring-1 ring-neutral-300 dark:bg-neutral-800 dark:ring-neutral-700\">\n <div class=\"min-w-full divide-y divide-neutral-300 dark:divide-neutral-600\">\n <div>\n <div class=\"grid grid-cols-2 lg:grid-cols-3\">\n <div :class=\"['px-3 py-3.5 text-start text-sm font-semibold text-neutral-600 dark:text-neutral-300']\">\n <div class=\"group inline-flex\">{{ $t('details.price') }}</div>\n </div>\n <div :class=\"['px-3 py-3.5 text-start text-sm font-semibold text-neutral-600 dark:text-neutral-300']\">\n <div class=\"group inline-flex\">{{ $t('details.activeSince') }}</div>\n </div>\n <div\n :class=\"[\n 'hidden px-3 py-3.5 text-center text-sm font-semibold text-neutral-600 dark:text-neutral-300 lg:block',\n ]\"\n >\n <div class=\"group inline-flex\">\n {{ $t('details.actions') }}\n </div>\n </div>\n </div>\n </div>\n <div>\n <NuxtLink\n v-for=\"(offer, planIdx) in slicedOffers\"\n :key=\"offer.id\"\n :to=\"`/offers/${offer.id}`\"\n class=\"grid cursor-pointer grid-cols-2 hover:bg-neutral-50 dark:hover:bg-neutral-900 lg:grid-cols-3\"\n >\n <div\n :class=\"[\n planIdx === 0 ? '' : 'border-t border-neutral-200 dark:border-neutral-700',\n 'flex items-center gap-1 px-3 py-3.5 text-sm font-semibold text-neutral-900 dark:text-neutral-50',\n ]\"\n >\n <DetailsOfferSide :offered-or-requested=\"offer.side === 1 ? offer.requested : offer.offered\" />\n </div>\n <div\n :class=\"[\n planIdx === 0 ? '' : 'border-t border-neutral-200 dark:border-neutral-700',\n 'flex items-center gap-1 px-3 py-3.5 text-sm font-medium text-neutral-900 dark:text-neutral-50',\n ]\"\n >\n <Popper :content=\"formatTimestamp(offer.created_at)\" hover arrow>\n {{ formatDuration(offer.created_at) + $t('activity.ago') }}\n </Popper>\n </div>\n <div\n :class=\"[\n planIdx === 0 ? '' : 'border-t border-neutral-200 dark:border-neutral-700',\n 'sitems-center hidden justify-center gap-1 px-3 py-2 text-sm font-medium text-neutral-900 dark:text-neutral-50 lg:flex',\n ]\"\n >\n <DetailsTakeOfferButton :compact=\"true\" :offer=\"offer\">Take Offer</DetailsTakeOfferButton>\n </div>\n </NuxtLink>\n </div>\n <button\n v-if=\"offers?.length > 4\"\n class=\"flex w-full items-center justify-center gap-1 p-2 text-sm font-semibold text-neutral-600 dark:text-neutral-300\"\n @click=\"expanded = !expanded\"\n >\n <ChevronUpIcon v-if=\"expanded\" class=\"h-4 w-4\" />\n <ChevronDownIcon v-else class=\"h-4 w-4\" />\n {{ expanded ? 'Collapse' : 'Show all' }}\n </button>\n </div>\n </div>\n</template>\n\n<style scoped>\n:deep(.popper) {\n --popper-theme-background-color: #333333;\n --popper-theme-background-color-hover: #333333;\n --popper-theme-text-color: #ffffff;\n --popper-theme-border-width: 0px;\n --popper-theme-border-style: solid;\n --popper-theme-border-radius: 12px;\n --popper-theme-padding: 8px 12px;\n --popper-theme-box-shadow: 0 6px 30px -6px rgba(0, 0, 0, 0.25);\n}\n</style>\n","<script setup lang=\"ts\">\nimport { formatXchPrice } from '~/utilities/chia-display-utils';\nimport type { PropType } from 'vue';\n\nconst props = defineProps({\n offeredOrRequested: { type: Array as PropType<Array<any>>, required: true },\n});\nconst { offeredOrRequested } = toRefs(props);\n</script>\n<template>\n <div class=\"flex w-full flex-col gap-2\">\n <!-- TODO Check whether a Nuxt upgrade fixes this-->\n <ClientOnly>\n <div v-for=\"(thing, index) in offeredOrRequested\" :key=\"thing.id\">\n <div v-if=\"thing.id === 'xch'\" class=\"flex items-center gap-1\">\n <img class=\"h-5 w-5\" src=\"/chia_circle.png\" />\n {{ formatXchPrice(thing.amount, true) }}\n </div>\n <div v-else-if=\"thing.is_nft\" class=\"flex h-6 items-center gap-2\">\n <img\n v-if=\"thing.preview.tiny\"\n :src=\"thing.preview.tiny\"\n loading=\"lazy\"\n class=\"h-6 w-6 flex-shrink-0 rounded-md border object-cover object-center\"\n />\n <span class=\"truncate\">\n {{ thing.name }}\n </span>\n </div>\n <NuxtLink\n v-else-if=\"thing.id !== 'xch'\"\n target=\"_blank\"\n :to=\"`https://dexie.space/assets/${thing.id}`\"\n class=\"inline-flex items-center gap-1 font-semibold text-neutral-700 dark:text-neutral-200\"\n >\n <img class=\"h-6 w-6 rounded-full\" :src=\"`https://icons.dexie.space/${thing.id}.webp`\" />{{ thing.amount }}\n </NuxtLink>\n </div>\n </ClientOnly>\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport { ChevronDownIcon, ChevronUpIcon } from '@heroicons/vue/outline';\nimport { intlFormat, parseISO } from 'date-fns';\nimport humanizeDuration from 'humanize-duration';\nimport type { PropType } from 'vue';\nimport { useI18n } from 'vue-i18n';\nimport Popper from 'vue3-popper';\n\nconst props = defineProps({\n offers: Object as PropType<any>,\n nft: Object as PropType<any>,\n});\nconst { offers, nft } = toRefs(props);\n\nconst expanded = ref(false);\nconst slicedOffers = computed(() => {\n return (expanded.value ? offers.value : offers.value.slice(0, 4)) || [];\n});\n\nconst { locale } = useI18n();\n\nconst formatDuration = (isoString: number) => {\n return humanizeDuration(Date.now() - new Date(isoString).valueOf(), {\n largest: 1,\n language: locale.value?.replace('zh', 'zh_CN') || 'en',\n });\n};\nconst formatTimestamp = (timestamp: string) => {\n return intlFormat(parseISO(timestamp), { dateStyle: 'medium', timeStyle: 'medium' } as any);\n};\n</script>\n<template>\n <div class=\"mx-0 mt-1 rounded-lg bg-white ring-1 ring-neutral-300 dark:bg-black dark:ring-neutral-600\">\n <div class=\"min-w-full divide-y divide-neutral-300 dark:divide-neutral-600\">\n <div>\n <div class=\"grid grid-cols-2 lg:grid-cols-3\">\n <div :class=\"['px-3 py-3.5 text-start text-sm font-semibold text-neutral-500 dark:text-neutral-400']\">\n <div class=\"group inline-flex\">Offered</div>\n </div>\n <div :class=\"['px-3 py-3.5 text-start text-sm font-semibold text-neutral-500 dark:text-neutral-400']\">\n <div class=\"group inline-flex\">Requested</div>\n </div>\n <div :class=\"['px-3 py-3.5 text-start text-sm font-semibold text-neutral-500 dark:text-neutral-400']\">\n <div class=\"group inline-flex\">{{ $t('details.activeSince') }}</div>\n </div>\n </div>\n </div>\n <div>\n <NuxtLink\n v-for=\"(offer, planIdx) in slicedOffers\"\n :key=\"offer.id\"\n target=\"_blank\"\n :to=\"`https://dexie.space/offers/${offer.id}`\"\n class=\"grid cursor-pointer grid-cols-2 hover:bg-neutral-50 dark:hover:bg-neutral-900 lg:grid-cols-3\"\n >\n <div\n :class=\"[\n planIdx === 0 ? '' : 'border-t border-neutral-200 dark:border-neutral-700',\n 'flex items-center gap-1 px-3 py-3.5 text-sm font-semibold text-neutral-900 dark:text-neutral-50',\n ]\"\n >\n <DetailsDexieOfferSide :offered-or-requested=\"offer.offered\" />\n </div>\n <div\n :class=\"[\n planIdx === 0 ? '' : 'border-t border-neutral-200 dark:border-neutral-700',\n 'flex items-center gap-1 px-3 py-3.5 text-sm font-semibold text-neutral-900 dark:text-neutral-50',\n ]\"\n >\n <DetailsDexieOfferSide :offered-or-requested=\"offer.requested\" />\n </div>\n <div\n :class=\"[\n planIdx === 0 ? '' : 'border-t border-neutral-200 dark:border-neutral-700',\n 'flex items-center gap-1 px-3 py-3.5 text-sm font-medium text-neutral-900 dark:text-neutral-50',\n ]\"\n >\n <Popper :content=\"formatTimestamp(offer.date_found)\" hover arrow>\n {{ formatDuration(offer.date_found) + $t('activity.ago') }}\n </Popper>\n </div>\n </NuxtLink>\n </div>\n <button\n v-if=\"offers?.length > 4\"\n class=\"flex w-full items-center justify-center gap-1 p-2 text-sm font-semibold text-neutral-600 dark:text-neutral-300\"\n @click=\"expanded = !expanded\"\n >\n <ChevronUpIcon v-if=\"expanded\" class=\"h-4 w-4\" />\n <ChevronDownIcon v-else class=\"h-4 w-4\" />\n {{ expanded ? 'Collapse' : 'Show all' }}\n </button>\n </div>\n </div>\n</template>\n\n<style scoped>\n:deep(.popper) {\n --popper-theme-background-color: #333333;\n --popper-theme-background-color-hover: #333333;\n --popper-theme-text-color: #ffffff;\n --popper-theme-border-width: 0px;\n --popper-theme-border-style: solid;\n --popper-theme-border-radius: 12px;\n --popper-theme-padding: 8px 12px;\n --popper-theme-box-shadow: 0 6px 30px -6px rgba(0, 0, 0, 0.25);\n}\n</style>\n","import { add, differenceInMilliseconds, differenceInSeconds, parseISO, sub } from 'date-fns';\n\nexport function calculateOvertime(auction: any, offers: any[]) {\n const endPlusOneHour = add(auction.end, { hours: 1 });\n const endMinusOvertimeMinutes = sub(auction.end, { seconds: auction.overtime_seconds });\n\n let end = auction.end;\n let isInOvertime = false;\n if (differenceInMilliseconds(endMinusOvertimeMinutes, new Date()) < 0) {\n const sortedOffers = offers\n .map((offer) => ({ ...offer, created_at: parseISO(offer.created_at) }))\n .sort((a, b) => a.created_at.getTime() - b.created_at.getTime());\n\n let lastTime = sub(auction.end, { seconds: auction.overtime_seconds });\n let highestBid = 0;\n\n for (const offer of sortedOffers) {\n const offerTime = offer.created_at;\n const diffToLastTime = differenceInSeconds(offerTime, lastTime);\n if (diffToLastTime < 0) {\n // ignore old offers\n } else if (diffToLastTime < auction.overtime_seconds && offer.xch_price > highestBid) {\n end = add(offerTime, { seconds: auction.overtime_seconds });\n if (differenceInMilliseconds(end, endPlusOneHour) > 0) {\n end = endPlusOneHour;\n }\n lastTime = offerTime;\n highestBid = offer.xch_price;\n } else {\n break;\n }\n }\n isInOvertime = differenceInMilliseconds(end, auction.end) > 0 && differenceInMilliseconds(end, new Date()) >= 0;\n }\n return { end, isInOvertime };\n}\n","<script setup lang=\"ts\">\nimport type { PropType } from 'vue';\nimport { useIntervalFn } from '@vueuse/core';\nimport { differenceInMilliseconds, parseISO } from 'date-fns';\nimport { getApiRoot } from '~/utilities/api';\nimport { formatXchPrice } from '~/utilities/chia-display-utils';\nimport { calculateOvertime } from '~/utilities/overtime';\n\nconst rops = defineProps({\n nft: { type: Object as PropType<any>, required: true },\n});\nconst { nft } = toRefs(rops);\n\nconst isMinted = computed(() => nft.value.launcher_coin.spent_block_index);\n\nconst { data: offers, refresh } = await useFetch<any>(`${getApiRoot()}/nfts/${nft.value.id}/offers`);\nconst { data: dexieOffers } = await useFetch<any>(\n `https://api.dexie.space/v1/offers?offered_or_requested=${nft.value.encoded_id}`\n);\n\nconst sellOffers = computed(() => {\n return offers?.value\n ?.filter((offer) => offer.side === 1)\n .filter((offer) => offer.status === 0)\n .sort((a, b) => (a.xch_price > b.xch_price ? 1 : -1));\n});\n\nconst buyOffers = computed(() => {\n return offers?.value\n ?.filter((offer) => offer.side === 2)\n .filter((offer) => offer.status === 0)\n .sort((a, b) => (a.xch_price < b.xch_price ? 1 : -1));\n});\n\nconst openDexieOffers = computed(() => {\n return dexieOffers.value.offers?.filter((offer) => !offers.value?.find((o) => o.id === offer.id));\n});\n\nconst getActiveAuction = (offsetMinutes = 0) => {\n const offsetMillis = offsetMinutes * 60 * 1000;\n\n for (let auction of nft.value.auctions) {\n const start = parseISO(auction.start);\n const end = parseISO(auction.end);\n auction = { ...auction, start, end };\n\n const isInRegularTime =\n differenceInMilliseconds(start, new Date()) < offsetMillis &&\n differenceInMilliseconds(end, new Date()) > offsetMillis;\n\n const overtime = calculateOvertime(auction, offers.value || []);\n\n if (overtime.isInOvertime) {\n return { ...auction, end: overtime.end, isInOvertime: true };\n } else if (isInRegularTime) {\n return auction;\n }\n }\n};\n\nfunction fetchOffers() {\n refresh();\n}\n\nconst activeAuction = ref(getActiveAuction());\nconst recentlyEndedAuction = ref(getActiveAuction(-60 * 12));\nconst counter = ref(0);\nuseIntervalFn(() => {\n const oldActiveAuction = activeAuction.value;\n const newActiveAuction = getActiveAuction();\n recentlyEndedAuction.value = getActiveAuction(-60 * 12);\n\n activeAuction.value = newActiveAuction;\n\n if (newActiveAuction?.end.getTime() !== oldActiveAuction?.end.getTime()) {\n fetchOffers();\n } else if (\n newActiveAuction?.end &&\n differenceInMilliseconds(newActiveAuction.end, new Date()) < 30 * 1000 &&\n counter.value % 4 === 0\n ) {\n fetchOffers();\n } else if (newActiveAuction && counter.value >= 30) {\n fetchOffers();\n counter.value = 0;\n return;\n } else {\n const recentlyEndedDiff = differenceInMilliseconds(recentlyEndedAuction.value?.end, new Date()) / 1000;\n if (recentlyEndedDiff < 0 && recentlyEndedDiff > -60 && counter.value % 4 === 0) {\n fetchOffers();\n }\n }\n counter.value += 1;\n}, 1000);\n\nconst hasOffersOrAuction = computed(() => {\n return (\n (sellOffers.value && sellOffers.value.length > 0) ||\n (buyOffers.value && buyOffers.value.length > 0) ||\n (openDexieOffers.value && openDexieOffers.value.length > 0) ||\n activeAuction.value ||\n recentlyEndedAuction.value\n );\n});\n\nconst highestBid = (auction) => {\n const { end } = calculateOvertime(auction, offers.value);\n return offers.value\n .filter((offer) => offer.xch_price >= auction.reserve_xch_price)\n .filter((offer) => differenceInMilliseconds(parseISO(offer.created_at), end) < 0)\n .filter((offer) => offer.side === 2) // bids only\n .filter((offer) => offer.status !== 3 && offer.status !== 6) // not cancelled or expired\n .sort((a, b) => b.xch_price - a.xch_price)[0];\n};\n</script>\n<template>\n <div>\n <div v-if=\"hasOffersOrAuction\">\n <div v-if=\"activeAuction\" class=\"mb-8\">\n <h3 class=\"mb-4 text-2xl font-bold\">{{ $t('details.auction') }}</h3>\n <div\n class=\"flex flex-col gap-4 rounded-lg bg-white px-6 py-4 ring-1 ring-neutral-300 dark:bg-neutral-800 dark:ring-neutral-700\"\n >\n <div v-if=\"activeAuction.description\">\n <div class=\"flex flex-col\">\n <span class=\"text-sm font-bold text-neutral-700 dark:text-neutral-200\">{{\n $t('details.auction_details')\n }}</span>\n <div class=\"mt-1 whitespace-pre-wrap text-sm text-neutral-500 dark:text-neutral-400\">\n {{ activeAuction.description }}\n </div>\n </div>\n </div>\n <div class=\"grid grid-cols-2 gap-2\">\n <div class=\"flex flex-col\">\n <span class=\"text-sm font-bold text-neutral-700 dark:text-neutral-200\">{{\n $t('details.highest_bid')\n }}</span>\n <div class=\"flex flex-1 items-center\">\n <div v-if=\"highestBid(activeAuction)\" class=\"text-xl font-bold lg:text-4xl\">\n {{ formatXchPrice(highestBid(activeAuction).xch_price, true) }}\n </div>\n <div v-else class=\"text-base text-neutral-400 dark:text-neutral-500 lg:text-xl\">\n {{\n activeAuction.reserve_xch_price\n ? $t('details.no_bid_reserve', { price: activeAuction.reserve_xch_price })\n : $t('details.no_bid')\n }}\n </div>\n </div>\n </div>\n <div class=\"flex flex-col justify-between\">\n <span class=\"text-sm font-bold text-neutral-700 dark:text-neutral-200\">{{\n $t(activeAuction.isInOvertime ? 'details.overtime_ends_in' : 'details.auction_ends_in')\n }}</span>\n <DetailsAuctionCountdown :end=\"activeAuction.end\" />\n </div>\n </div>\n <div>\n <DetailsUploadOfferButton :nft=\"nft\" :side=\"2\"> Place Bid </DetailsUploadOfferButton>\n </div>\n </div>\n <div class=\"pt-2 text-xs text-neutral-500 dark:text-neutral-400\">\n {{ $t('details.auction_disclaimer') }}\n </div>\n </div>\n <div v-else-if=\"recentlyEndedAuction\" class=\"mb-8\">\n <h3 class=\"mb-4 text-2xl font-bold\">{{ $t('details.auction_ended') }}</h3>\n <div\n class=\"grid grid-cols-2 gap-2 rounded-lg bg-white px-6 py-4 ring-1 ring-neutral-300 dark:bg-black dark:ring-neutral-600\"\n >\n <div class=\"flex flex-col\">\n <span class=\"text-sm font-bold text-neutral-700 dark:text-neutral-200\">{{\n $t('details.highest_bid')\n }}</span>\n <div class=\"flex flex-1 items-center\">\n <NuxtLink\n v-if=\"highestBid(recentlyEndedAuction)\"\n :to=\"`/offers/${highestBid(recentlyEndedAuction).id}`\"\n class=\"text-xl font-bold lg:text-4xl\"\n >\n {{ formatXchPrice(highestBid(recentlyEndedAuction).xch_price, true) }}\n </NuxtLink>\n <div v-else class=\"text-base text-neutral-400 dark:text-neutral-500 lg:text-xl\">\n {{ $t('details.no_bid') }}\n </div>\n </div>\n </div>\n </div>\n </div>\n <div class=\"mb-8 flex flex-col gap-4 lg:flex-row\">\n <DetailsTakeOfferButton v-if=\"sellOffers?.length > 0\" :offer=\"sellOffers[0]\" :nft=\"nft\">\n {{ isMinted ? 'Buy Now' : 'Mint' }}\n </DetailsTakeOfferButton>\n <DetailsUploadOfferButton v-else :nft=\"nft\" :side=\"1\"> List for Sale </DetailsUploadOfferButton>\n <DetailsUploadOfferButton v-if=\"isMinted\" :nft=\"nft\" :side=\"2\" :primary=\"false\">\n {{ $t('details.uploadOffer') }}\n </DetailsUploadOfferButton>\n </div>\n <div v-if=\"sellOffers && sellOffers.length > 0\" class=\"mb-8\">\n <h3 class=\"mb-4 text-2xl font-bold\">{{ $t('details.listings') }}</h3>\n <DetailsOffers :offers=\"sellOffers\" :nft=\"nft\" />\n </div>\n <div v-if=\"isMinted && buyOffers && buyOffers.length > 0\" class=\"mb-8\">\n <h3 class=\"mb-4 text-2xl font-bold\">{{ $t('details.bids') }}</h3>\n <DetailsOffers :offers=\"buyOffers\" :nft=\"nft\" />\n </div>\n <div v-if=\"isMinted && openDexieOffers && openDexieOffers.length > 0\" class=\"mb-8\">\n <h3 class=\"mb-4 text-2xl font-bold\">Dexie Offers</h3>\n <DetailsDexieOffers :offers=\"openDexieOffers\" :nft=\"nft\" />\n </div>\n </div>\n <div v-else class=\"\">\n <h3 class=\"mb-2 text-2xl font-bold\">{{ $t('details.noOffers') }}</h3>\n <p class=\"mt-1 text-sm text-neutral-500 dark:text-neutral-400\">\n {{ $t('details.uploadFirstOffer') }}\n </p>\n <div class=\"mt-8 flex flex-col gap-4 lg:flex-row\">\n <DetailsUploadOfferButton :nft=\"nft\" :side=\"1\"> List for Sale </DetailsUploadOfferButton>\n <DetailsUploadOfferButton :nft=\"nft\" :side=\"2\" :primary=\"false\">\n {{ $t('details.uploadOffer') }}\n </DetailsUploadOfferButton>\n </div>\n </div>\n </div>\n</template>\n","import { publicAssetsURL } from '#internal/nuxt/paths';export default publicAssetsURL(\"/spacescan.ico\")","<script setup lang=\"ts\">\nimport { FingerPrintIcon } from '@heroicons/vue/outline';\nimport { BellIcon, FireIcon } from '@heroicons/vue/solid';\nimport { differenceInMilliseconds, intlFormat, parseISO } from 'date-fns';\nimport type { PropType } from 'vue';\nimport { addressGradientStyles, avatarGradientStyles } from '~/utilities/avatar-gradient';\nimport { formatXchPrice } from '~/utilities/chia-display-utils';\n\nconst props = defineProps({\n nft: { type: Object as PropType<any>, required: true },\n});\nconst { nft } = toRefs(props);\n\nconst showCollapsed = ref(false);\n\nconst timeline = computed(() => {\n const auctionStartEvents = nft.value.auctions\n .filter((auction) => differenceInMilliseconds(parseISO(auction.start), new Date()) < 0)\n .map((auction) => ({\n timestamp: auction.start,\n owner: undefined,\n address: undefined,\n type: 5,\n }));\n const auctionEndEvents = nft.value.auctions\n .filter((auction) => differenceInMilliseconds(parseISO(auction.overtime.end), new Date()) < 0)\n .map((auction) => ({\n timestamp: auction.overtime.end,\n owner: undefined,\n address: undefined,\n type: 6,\n xch_price: auction.highest_bid?.xch_price,\n }));\n\n return [...nft.value.events, ...auctionStartEvents, ...auctionEndEvents]\n .sort((a, b) =>\n a.event_index && b.event_index\n ? a.event_index - b.event_index\n : differenceInMilliseconds(parseISO(a.timestamp), parseISO(b.timestamp))\n )\n .map((event, id) => {\n let datetime = parseISO(event.timestamp);\n let content = 'provenance.transferredTo';\n let xchPrice;\n let payments;\n const owner = event.owner;\n let address = event.address;\n const minter = undefined;\n if (event.type === 0) {\n content = 'provenance.mintedBy';\n } else if (event.type === 5) {\n content = 'provenance.auctionStarted';\n } else if (event.type === 6) {\n content = 'provenance.auctionEnded';\n xchPrice = event.xch_price;\n } else if (event.type === 2) {\n content = 'provenance.acquiredBy';\n xchPrice = event.xch_price;\n if (event.payments) {\n payments = Object.entries(\n event.payments.reduce(\n (acc: any, payment: any) => ({\n ...acc,\n [payment.asset_id || 'xch']: (acc[payment.asset_id || 'xch'] || 0) + payment.amount,\n }),\n {}\n )\n )\n .map(([assetId, amount]) => ({\n assetId,\n amount,\n }))\n .sort(({ assetId: a }) => (a === 'xch' ? -1 : 1));\n }\n } else if (event.type === 3) {\n content = 'provenance.burned';\n address = undefined;\n }\n return {\n id: event.event_index,\n type: event.type,\n content,\n owner,\n minter,\n address,\n datetime,\n date: intlFormat(datetime, { dateStyle: 'medium', timeStyle: 'medium' } as any),\n xchPrice,\n payments,\n };\n })\n .reduce((acc, event) => {\n const previousEvent = acc && acc[acc.length - 1];\n if (\n !showCollapsed.value &&\n previousEvent &&\n previousEvent.type === 1 &&\n event.type === 1 &&\n (!event.owner || previousEvent.owner === event.owner)\n ) {\n return [\n ...acc.slice(0, -1),\n {\n ...previousEvent,\n date: event.date,\n collapsed: [...(previousEvent.collapsed || []), event],\n },\n ];\n }\n return [...acc, event];\n }, [])\n .reverse();\n});\n\nconst navigateToEvent = (event: any) => {\n navigateTo(`/nfts/${nft.value.encoded_id}/events/${event.id}`);\n};\n</script>\n<template>\n <div class=\"flow-root\">\n <ul role=\"list\" class=\"-mb-8\">\n <li v-for=\"(event, eventIdx) in timeline\" :key=\"event.id\" class=\"cursor-pointer\" @click=\"navigateToEvent(event)\">\n <div class=\"relative pb-10\">\n <span\n v-if=\"eventIdx !== timeline.length - 1\"\n class=\"absolute left-5 top-5 -ml-px h-full w-0.5 bg-neutral-200 dark:bg-neutral-700\"\n aria-hidden=\"true\"\n />\n <div class=\"relative flex space-x-3\">\n <div>\n <span\n :class=\"[\n event.owner?.avatar_uri ? '' : 'bg-gradient-to-br',\n event.type === 3 ? 'bg-red-600' : '',\n event.type === 5 ? 'bg-emerald-600' : '',\n event.type === 6 ? 'bg-emerald-600' : '',\n 'flex h-10 w-10 items-center justify-center rounded-full ring-8 ring-white dark:ring-black',\n ]\"\n :style=\"\n event.owner\n ? { ...avatarGradientStyles(event.owner.id) }\n : event.address\n ? { ...addressGradientStyles(event.address.id) }\n : {}\n \"\n >\n <img\n v-if=\"event.owner?.avatar_uri\"\n :src=\"event.owner.avatar_uri\"\n loading=\"lazy\"\n class=\"inline h-full w-full rounded-full object-cover\"\n />\n <FingerPrintIcon v-else-if=\"event.owner\" class=\"h-3/5 w-3/5 text-neutral-200 dark:text-neutral-900\" />\n <FireIcon v-else-if=\"event.type === 3\" class=\"h-3/5 w-3/5 text-white dark:text-neutral-100\" />\n <BellIcon v-else-if=\"event.type === 5\" class=\"h-3/5 w-3/5 text-white dark:text-neutral-100\" />\n <BellIcon v-else-if=\"event.type === 6\" class=\"h-3/5 w-3/5 text-white dark:text-neutral-100\" />\n </span>\n </div>\n <div class=\"mt-0 flex flex-1 flex-col pt-1.5\">\n <div>\n <span\n class=\"flex min-w-[20rem] flex-wrap items-center gap-1 whitespace-nowrap text-neutral-600 dark:text-neutral-300\"\n >\n {{ $t(`${event.content}Pre`) }}\n <ProfileHandle\n v-if=\"event.owner\"\n :profile=\"event.owner\"\n avatar-dimension=\"\"\n named-classes=\"text-base font-bold text-neutral-700 dark:text-neutral-200\"\n unnamed-classes=\"text-base font-semibold tracking-tight font-mono text-neutral-900 dark:text-neutral-50\"\n />\n <AddressHandle v-else-if=\"event.address\" avatar-dimension=\"\" :address=\"event.address\" />\n {{ $t(`${event.content}Post`) }}\n <a\n v-if=\"event.collapsed\"\n href=\"#\"\n class=\"hover:text-neutral-900 dark:text-neutral-50\"\n @click=\"\n ($event) => {\n $event.preventDefault();\n $event.stopPropagation();\n showCollapsed = !showCollapsed;\n }\n \"\n >\n {{ $t('provenance.andOtherAddresses', { count: event.collapsed.length }) }}</a\n >\n <span v-else-if=\"event.type === 6\" class=\"inline-flex items-center\">\n <span class=\"inline-flex gap-1 font-semibold text-neutral-700 dark:text-neutral-200\">\n <img class=\"h-6 w-6\" src=\"/chia_circle.png\" />{{ formatXchPrice(event.xchPrice, true) }}\n </span></span\n >\n\n <span v-else-if=\"event.payments\"> for</span>\n\n <span\n v-for=\"(payment, index) in event.payments\"\n :key=\"payment.assetId\"\n class=\"inline-flex items-center\"\n >\n <span v-if=\"index !== 0\" class=\"mr-1\">and</span>\n <NuxtLink\n v-if=\"payment.assetId !== 'xch'\"\n target=\"_blank\"\n :to=\"`https://dexie.space/assets/${payment.assetId}`\"\n class=\"inline-flex gap-1 font-semibold text-neutral-700 dark:text-neutral-200\"\n >\n <img class=\"h-6 w-6 rounded-full\" :src=\"`https://icons.dexie.space/${payment.assetId}.webp`\" />{{\n payment.amount / 1000\n }}\n </NuxtLink>\n <span v-else class=\"inline-flex gap-1 font-semibold text-neutral-700 dark:text-neutral-200\">\n <img class=\"h-6 w-6\" src=\"/chia_circle.png\" />{{ formatXchPrice(payment.amount / 10 ** 12) }}\n </span>\n </span>\n </span>\n </div>\n <div class=\"whitespace-nowrap text-sm text-neutral-500 dark:text-neutral-400\">\n <time :datetime=\"event.datetime\">{{\n event.datetime > new Date(0) ? event.date : 'Not yet minted'\n }}</time>\n </div>\n </div>\n </div>\n </div>\n </li>\n </ul>\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport { useRoute } from '#imports';\nimport {\n BanIcon,\n CashIcon,\n ChartBarIcon,\n ChevronDownIcon,\n ChevronUpIcon,\n ClipboardCheckIcon,\n ClipboardCopyIcon,\n CollectionIcon,\n CubeIcon,\n CubeTransparentIcon,\n DocumentTextIcon,\n ExclamationIcon,\n ExternalLinkIcon,\n MusicNoteIcon,\n PhotographIcon,\n QuestionMarkCircleIcon,\n SparklesIcon,\n HashtagIcon,\n XIcon,\n VideoCameraIcon,\n} from '@heroicons/vue/outline';\nimport { FireIcon } from '@heroicons/vue/solid';\nimport { computed } from 'vue';\nimport CollectionHandle from '~/components/CollectionHandle.vue';\nimport DetailsProvenance from '~/components/details/DetailsProvenance.vue';\nimport { getApiRoot } from '~/utilities/api';\nimport { BASE_TITLE } from '~/utilities/constants';\n\ndefinePageMeta({\n backgroundClass: 'bg-neutral-100 dark:bg-neutral-800',\n});\n\nconst route = useRoute();\n\nlet id = route.params?.id;\nif (id && id.includes('-nft1')) {\n id = `nft1${id.split('-nft1').pop()}`;\n}\nconst { data: nft } = await useFetch<any>(`${getApiRoot()}/nfts/${id}`);\n\nconst metadata = computed(() => nft.value?.data?.metadata_json || nft.value?.data?.metadata);\nconst name = computed(() => metadata.value?.name || (nft.value ? 'Unnamed' : 'Unknown NFT'));\n\nconst meta = [\n { property: 'og:title', content: `${name.value} ${BASE_TITLE}` },\n { property: 'og:image', content: nft.value?.data?.thumbnail_uri || nft.value?.thumbnail_uri },\n { name: 'twitter:image', content: nft.value?.data?.thumbnail_uri || nft.value?.thumbnail_uri },\n { name: 'twitter:title', content: `${name.value} ${BASE_TITLE}` },\n { name: 'twitter:card', content: 'summary_large_image' },\n {\n name: 'og:description',\n content: metadata.value?.description || 'Explore this and other NFTs on MintGarden.',\n },\n {\n name: 'twitter:description',\n content: metadata.value?.description || 'Explore this and other NFTs on MintGarden.',\n },\n];\n\nuseHead({\n title: `${name.value} ${BASE_TITLE}`,\n meta,\n});\n\nconst associatedMedia = computed(() => {\n return nft.value?.data?.metadata_json?.data?.associatedMedia || [];\n});\n\nconst webContent = computed(() => {\n return nft.value?.data?.metadata_json?.data?.['@type'] === 'WebContent'\n ? nft.value.data.metadata_json.data\n : undefined;\n});\n\nconst activeMedia = ref<any>(undefined);\nconst setActiveMedia = (media: any | undefined) => {\n activeMedia.value = media;\n};\n\nconst dataType = computed(() => nft.value?.data?.data_type);\n\nconst getMediaUrl = (media: any) => {\n if (media?.url && Array.isArray(media.url)) {\n return media.url[0];\n }\n return media?.url;\n};\n\nconst previewUri = computed(() => {\n if (activeMedia.value) {\n return getMediaUrl(activeMedia.value);\n }\n const firstDataUri = nft.value?.data?.data_uris?.[0];\n if (firstDataUri && (dataType.value === 3 || dataType.value === 4)) {\n return firstDataUri;\n }\n return nft.value?.data?.preview_uri;\n});\n\nconst originalUrl = computed(() => (nft.value ? `${getApiRoot()}/nfts/${id}/original` : ''));\nconst metadataUrl = computed(() => (nft.value ? `${getApiRoot()}/nfts/${id}/metadata` : ''));\nconst licenseUrl = computed(() => (nft.value ? `${getApiRoot()}/nfts/${id}/license` : ''));\n\nconst copied = ref(false);\nconst copyToClipboard = (input: string) => {\n navigator.clipboard.writeText(input);\n copied.value = true;\n setTimeout(() => (copied.value = false), 1000);\n};\n\nconst showSensitive = ref(false);\nconst isSensitiveContent = (nft) =>\n nft.collection?.sensitive_content ||\n nft.data?.metadata_json?.sensitive_content === true ||\n nft.data?.metadata_json?.sensitive_content === 'true';\n\nconst isZoomedIn = ref(false);\nconst expandAttributes = ref(false);\n\nconst getNumItems = (attributeFrequencyCounts: any) => {\n return Object.values<number>(attributeFrequencyCounts['meta_trait:trait_count']).reduce((acc, val) => acc + val, 0);\n};\nconst getAttributeFrequency = (attributeFrequencyCounts: any, attribute: any) => {\n const traitType = (attribute.trait_type || attribute.name)?.toLowerCase();\n const value = String(attribute.value).toLowerCase();\n return attributeFrequencyCounts[traitType]?.[value];\n};\n\nconst getAttributeLink = (attribute: any) => {\n if (\n (typeof attribute?.value === 'string' || attribute?.value instanceof String) &&\n (attribute.value.startsWith('https://') || attribute.value.startsWith('http://'))\n ) {\n return { href: attribute.value, target: '_blank' };\n } else if (nft.value.collection) {\n return {\n href: `/collections/${nft.value.collection.id}?filter=${attribute.name || attribute.trait_type}&filter_value=${\n attribute.value\n }`,\n target: '_self',\n };\n }\n return undefined;\n};\n\nconst formatScript = (script) => script.split('_')[1];\n</script>\n\n<template>\n <div>\n <div class=\"pt-6 dark:text-white lg:pt-0\">\n <Error404 v-if=\"!nft\" />\n <!-- Product -->\n <div v-else class=\"flex flex-col items-center\">\n <div class=\"flex h-[50vh] w-full justify-center\">\n <div\n :class=\"\n isZoomedIn && activeMedia?.['@type'] !== '3DModel'\n ? 'fixed inset-0 z-50 flex h-auto max-h-full w-auto max-w-full items-center justify-center bg-zinc-800'\n : 'relative flex w-full items-center justify-center overflow-hidden sm:py-12 lg:rounded-xl lg:p-16'\n \"\n >\n <BanIcon v-if=\"nft.creator?.verification_state === 2\" class=\"h-1/2 w-1/2 text-red-600\" />\n <BanIcon\n v-else-if=\"nft.is_blocked || nft.collection?.blocked_content\"\n class=\"h-1/2 w-1/2 text-neutral-600 dark:text-neutral-300\"\n />\n <div v-else-if=\"webContent && (!isSensitiveContent(nft) || showSensitive)\" class=\"h-full w-full\">\n <iframe\n class=\"mx-auto aspect-1 h-full max-w-full\"\n :sandbox=\"`allow-scripts${\n nft.creator.id === 'f0bafce98004ac7e3571bba27ae2f0106d164f0abc765e4bf2477197993e65c6'\n ? ' allow-same-origin'\n : ''\n }`\"\n :src=\"webContent.url\"\n ></iframe>\n </div>\n <LazyModelViewer3D\n v-else-if=\"activeMedia?.['@type'] === '3DModel'\"\n :src=\"getMediaUrl(activeMedia)\"\n :poster=\"previewUri\"\n />\n <video\n v-else-if=\"activeMedia?.['@type'] === 'VideoObject' || dataType === 3\"\n autoplay\n loop\n controls\n muted\n :class=\"[isSensitiveContent(nft) && !showSensitive ? 'blur-xl' : '']\"\n class=\"max-h-full\"\n :poster=\"nft?.data?.thumbnail_uri\"\n >\n <source :src=\"previewUri\" type=\"video/mp4\" />\n </video>\n <div v-else-if=\"dataType === 4\" class=\"flex flex-col items-center\">\n <MusicNoteIcon class=\"h-24 w-24 text-neutral-400 dark:text-neutral-500 md:h-36 md:w-36\" />\n <audio controls>\n <source :src=\"previewUri\" type=\"audio/mpeg\" />\n </audio>\n </div>\n <img\n v-else-if=\"previewUri\"\n id=\"nft-image\"\n :src=\"isZoomedIn ? getMediaUrl(activeMedia) || originalUrl : previewUri\"\n class=\"max-h-full object-contain drop-shadow-[0_4px_20px_rgba(0,0,0,0.25)]\"\n :class=\"[\n isSensitiveContent(nft) && !showSensitive ? 'blur-xl' : '',\n isZoomedIn ? 'relative cursor-zoom-out' : 'cursor-zoom-in lg:rounded-xl',\n ]\"\n @click=\"isZoomedIn = !isZoomedIn\"\n />\n <QuestionMarkCircleIcon\n v-else\n class=\"h-1/2 w-1/2 text-neutral-400 transition duration-150 ease-in-out dark:text-neutral-500\"\n />\n <div v-if=\"associatedMedia\" class=\"absolute bottom-4 right-4 flex gap-4\">\n <button\n v-for=\"media in associatedMedia.filter((m) => m !== activeMedia)\"\n :key=\"media.name\"\n type=\"button\"\n class=\"rounded-full bg-neutral-900 p-2 text-white opacity-70 shadow-sm hover:bg-neutral-800 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-indigo-600 dark:bg-neutral-50 dark:text-black dark:hover:bg-neutral-100\"\n @click=\"setActiveMedia(media)\"\n >\n <CubeIcon v-if=\"isZoomedIn\" class=\"h-6 w-6 lg:h-8 lg:w-8\" aria-hidden=\"true\" />\n <CubeTransparentIcon\n v-else-if=\"media['@type'] === '3DModel'\"\n class=\"h-6 w-6 lg:h-8 lg:w-8\"\n aria-hidden=\"true\"\n />\n <VideoCameraIcon\n v-else-if=\"media['@type'] === 'VideoObject'\"\n class=\"h-6 w-6 lg:h-8 lg:w-8\"\n aria-hidden=\"true\"\n />\n <PhotographIcon v-else class=\"h-6 w-6 lg:h-8 lg:w-8\" aria-hidden=\"true\" />\n </button>\n <button\n v-if=\"activeMedia\"\n type=\"button\"\n class=\"rounded-full bg-neutral-900 p-2 text-white opacity-70 shadow-sm hover:bg-neutral-800 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-indigo-600 dark:bg-neutral-50 dark:text-black dark:hover:bg-neutral-100\"\n @click=\"setActiveMedia(undefined)\"\n >\n <XIcon class=\"h-6 w-6 lg:h-8 lg:w-8\" aria-hidden=\"true\" />\n </button>\n </div>\n </div>\n </div>\n <div\n v-if=\"nft.is_blocked || nft.collection?.blocked_content\"\n class=\"h-12 w-full bg-neutral-600 dark:bg-neutral-300\"\n >\n <div class=\"flex h-full items-center justify-center\">\n <span class=\"font-semibold text-white dark:text-black\"\n >This NFT has been removed from display and trading.{{\n nft.collection?.blocked_content_reason ? ` Reason: ${nft.collection.blocked_content_reason}` : ''\n }}</span\n >\n </div>\n </div>\n <div v-else-if=\"isSensitiveContent(nft)\" class=\"h-12 w-full bg-neutral-600 dark:bg-neutral-300\">\n <div class=\"flex h-full items-center justify-center\">\n <a href=\"#\" class=\"font-semibold text-white dark:text-black\" @click.prevent=\"showSensitive = true\"\n >This NFT is marked as sensitive content. Click here to display it.</a\n >\n </div>\n </div>\n <div\n v-if=\"nft?.creator?.verification_state === 2 || nft.data.integrity_state === 2\"\n :class=\"nft?.creator?.verification_state === 2 ? 'bg-red-600' : 'bg-orange-600'\"\n class=\"h-12 w-full\"\n >\n <div class=\"flex h-full items-center justify-center\">\n <span v-if=\"nft?.creator?.verification_state === 2\" class=\"font-semibold text-white dark:text-black\"\n >This NFT has been blocked in the\n <NuxtLink to=\"https://github.com/dexie-space/blocklist\" target=\"_blank\" class=\"underline\"\n >community blocklist</NuxtLink\n >.</span\n >\n <span v-else class=\"font-semibold text-white dark:text-black\"\n >This content does not match the data hash stored in the NFT.</span\n >\n </div>\n </div>\n <div class=\"w-full bg-white dark:bg-black xl:pt-12\">\n <div\n class=\"mx-auto w-full max-w-3xl px-4 sm:px-8 xl:grid xl:max-w-screen-2xl xl:grid-cols-8 xl:gap-x-32 xl:gap-y-10 xl:px-16\"\n >\n <div class=\"mt-14 w-full sm:mt-16 xl:col-span-4 xl:row-span-1 xl:row-end-1 xl:mt-0 xl:max-w-none\">\n <div>\n <h1 class=\"flex items-end gap-4 text-4xl font-semibold text-black dark:text-white xl:text-5xl\">\n {{ name }}\n <span\n v-if=\"nft.data.edition_number && nft.data.edition_total !== 1\"\n class=\"whitespace-nowrap text-2xl font-medium\"\n >{{ nft.data.edition_number }} / {{ nft.data.edition_total || '∞' }}</span\n >\n </h1>\n <div class=\"p-1\">\n <div\n class=\"group flex cursor-pointer items-center overflow-hidden\"\n @click=\"copyToClipboard(nft.encoded_id)\"\n >\n <span class=\"font-mono text-sm tracking-tight text-neutral-500 dark:text-neutral-400 xl:text-base\"\n ><span class=\"font-semibold text-emerald-600\">nft1</span\n >{{ nft.encoded_id.replace('nft1', '') }}</span\n >\n <div class=\"flex hidden group-hover:inline\">\n <ClipboardCheckIcon v-if=\"copied\" class=\"h-5 w-5 text-emerald-600 xl:h-6 xl:w-6\" />\n <ClipboardCopyIcon\n v-else\n class=\"ml-[1px] h-5 w-5 text-neutral-500 dark:text-neutral-400 xl:h-6 xl:w-6\"\n />\n </div>\n </div>\n </div>\n <p\n v-if=\"metadata?.description\"\n class=\"mt-6 max-h-[15rem] overflow-auto whitespace-pre-wrap text-neutral-900 dark:text-neutral-50\"\n >\n {{ metadata.description }}\n </p>\n <div class=\"mt-8 grid grid-rows-1 gap-y-6 sm:grid-cols-3\">\n <div class=\"cols-span-1 flex flex-col gap-2\">\n <span class=\"text-sm font-bold text-neutral-700 dark:text-neutral-200\">{{\n $t('details.creator')\n }}</span>\n <ProfileHandle v-if=\"nft.creator\" :profile=\"nft.creator\" avatar-dimension=\"2rem\" />\n <AddressHandle v-else :address=\"nft.creator_address\" avatar-dimension=\"2rem\" />\n </div>\n <div class=\"cols-span-1 flex flex-col gap-2 overflow-hidden\">\n <span class=\"text-sm font-bold text-neutral-700 dark:text-neutral-200\">{{\n $t('details.owner')\n }}</span>\n <ProfileHandle v-if=\"nft.owner\" :profile=\"nft.owner\" avatar-dimension=\"2rem\" />\n <div\n v-else-if=\"\n !nft.owner_address ||\n nft.owner_address.id === '000000000000000000000000000000000000000000000000000000000000dead'\n \"\n class=\"flex items-center gap-1\"\n >\n <span class=\"inline flex h-8 w-8 items-center justify-center rounded-full bg-red-600\">\n <FireIcon class=\"h-5 w-5 text-white dark:text-black\"></FireIcon>\n </span>\n <span class=\"text-neutral-700 dark:text-neutral-200\">{{ $t('details.burned') }}</span>\n </div>\n <AddressHandle v-else :address=\"nft.owner_address\" avatar-dimension=\"2rem\" />\n </div>\n <div v-if=\"nft.collection\" class=\"cols-span-1 flex flex-col gap-2\">\n <span class=\"text-sm font-bold text-neutral-700 dark:text-neutral-200\">{{\n $t('details.collection')\n }}</span>\n <CollectionHandle :collection=\"nft.collection\" avatar-dimension=\"2rem\" />\n </div>\n </div>\n </div>\n </div>\n\n <div\n v-if=\"!nft.is_blocked && !nft.collection?.blocked_content && nft.creator?.verification_state !== 2\"\n class=\"mt-14 w-full sm:mt-16 xl:col-span-4 xl:row-span-1 xl:row-end-1 xl:mt-0 xl:max-w-none\"\n >\n <DetailsOfferPanel :nft=\"nft\" />\n </div>\n\n <div class=\"mt-14 w-full sm:mt-16 xl:col-span-4 xl:row-span-1 xl:row-start-1 xl:mt-0 xl:max-w-none\">\n <div v-if=\"metadata?.attributes && metadata.attributes.length > 0\" class=\"mb-8\">\n <h3 class=\"text-2xl font-bold\">{{ $t('details.attributes') }}</h3>\n <div class=\"mt-4 grid grid-cols-1 gap-4 sm:grid-cols-2 xl:grid-cols-3\">\n <NuxtLink\n v-for=\"(attribute, index) in metadata.attributes\"\n :key=\"attribute.name || attribute.trait_type\"\n :to=\"getAttributeLink(attribute)?.href || null\"\n :target=\"getAttributeLink(attribute)?.target\"\n :class=\"expandAttributes || index < 4 ? '' : 'hidden'\"\n class=\"lg:block\"\n >\n <div\n class=\"shadow-attribute relative block h-full rounded-lg p-4 transition duration-100 ease-in-out hover:ring hover:ring-black dark:bg-neutral-800 dark:hover:ring-white hover:dark:ring-neutral-300\"\n >\n <p class=\"break-words text-sm font-semibold text-neutral-500 dark:text-neutral-400\">\n {{ attribute.name || attribute.trait_type }}\n </p>\n <p class=\"break-words text-base font-semibold text-neutral-900 dark:text-neutral-50\">\n {{ attribute.value || ' '\n }}<span\n v-if=\"attribute.min_value != null && attribute.max_value != null\"\n class=\"font-medium text-neutral-400 dark:text-neutral-500\"\n >\n of {{ attribute.max_value }}\n </span>\n </p>\n <p\n v-if=\"nft.collection?.attributes_frequency_counts\"\n class=\"break-words text-xs font-semibold text-neutral-500 dark:text-neutral-400\"\n >\n {{\n Math.round(\n ((getAttributeFrequency(nft.collection.attributes_frequency_counts, attribute) * 100) /\n getNumItems(nft.collection.attributes_frequency_counts)) *\n 10000\n ) / 10000\n }}%\n </p>\n <div\n v-if=\"attribute.min_value != null && attribute.max_value != null\"\n class=\"relative mt-1 flex-1\"\n >\n <div\n class=\"h-3 rounded-full border border-neutral-200 bg-neutral-100 dark:border-neutral-700 dark:bg-neutral-800\"\n />\n <div\n class=\"absolute inset-y-0 rounded-full border border-emerald-500 bg-emerald-500\"\n :style=\"{\n width: `calc(${attribute.value - attribute.min_value} / ${\n attribute.max_value - attribute.min_value\n } * 100%)`,\n maxWidth: '100%',\n }\"\n />\n </div>\n </div>\n </NuxtLink>\n </div>\n <a\n v-if=\"metadata?.attributes && metadata.attributes.length > 4\"\n href=\"#\"\n class=\"mt-4 inline-flex items-center gap-1 text-sm font-medium text-neutral-600 hover:text-neutral-900 dark:text-neutral-300 dark:text-neutral-50 lg:hidden\"\n @click.prevent=\"expandAttributes = !expandAttributes\"\n >\n <ChevronUpIcon v-if=\"expandAttributes\" class=\"h-4 w-4\" />\n <ChevronDownIcon v-else class=\"h-4 w-4\" />\n {{ expandAttributes ? 'Collapse' : 'Show all' }}\n </a>\n </div>\n <div class=\"grid gap-8 sm:grid-cols-2\">\n <div>\n <h3 class=\"text-2xl font-bold\">{{ $t('details.title') }}</h3>\n <div class=\"mt-4 flex flex-col gap-4\">\n <div class=\"sm:col-span-1\">\n <span class=\"flex items-center gap-1 text-sm font-medium text-neutral-700 dark:text-neutral-200\"\n ><SparklesIcon class=\"h-6 w-6\" />{{ $t('details.mintHeight') }}:\n {{ nft.launcher_coin.spent_block_index || 'Unminted' }}</span\n >\n </div>\n <div\n v-if=\"nft.data && nft.data.edition_number != null && nft.data.edition_total !== 1\"\n class=\"sm:col-span-1\"\n >\n <span class=\"flex items-center gap-1 text-sm font-medium text-neutral-700 dark:text-neutral-200\"\n ><CollectionIcon class=\"h-6 w-6\" />{{ $t('details.edition') }}: {{ nft.data.edition_number }} /\n {{ nft.data.edition_total || '∞' }}</span\n >\n </div>\n <div\n v-if=\"metadata && metadata.series_number != null && metadata.series_total !== 1\"\n class=\"sm:col-span-1\"\n >\n <span class=\"flex items-center gap-1 text-sm font-medium text-neutral-700 dark:text-neutral-200\"\n ><CollectionIcon class=\"h-6 w-6\" />{{ $t('details.series') }}: {{ metadata.series_number }} /\n {{ metadata.series_total || '∞' }}</span\n >\n </div>\n <div class=\"sm:col-span-1\">\n <span class=\"flex items-center gap-1 text-sm font-medium text-neutral-700 dark:text-neutral-200\"\n ><CashIcon class=\"h-6 w-6\" />{{ $t('details.perpetualRoyalties') }}:\n {{ nft.royalty_percentage / 100 }}%</span\n >\n </div>\n <div v-if=\"nft.openrarity_rank\" class=\"sm:col-span-1\">\n <NuxtLink\n to=\"https://docs.mintgarden.io/mintgarden/rarity\"\n target=\"_blank\"\n class=\"flex items-center gap-1 text-sm font-medium text-neutral-700 hover:text-neutral-900 dark:text-neutral-200 dark:text-neutral-50\"\n >\n <ChartBarIcon class=\"h-6 w-6\" />\n {{ $t('details.openRarityRank') }}: {{ nft.openrarity_rank }}\n </NuxtLink>\n </div>\n <div class=\"sm:col-span-1\">\n <span class=\"flex items-center gap-1 text-sm font-medium text-neutral-700 dark:text-neutral-200\"\n ><HashtagIcon class=\"h-6 w-6\" />Owner Address:\n <AddressHandle avatar-dimension=\"\" :address=\"nft.owner_address\" />...</span\n >\n </div>\n <div v-if=\"nft.data\" class=\"sm:col-span-1\">\n <NuxtLink\n class=\"flex items-center gap-1 text-sm font-medium text-neutral-700 dark:text-neutral-200\"\n :class=\"\n nft.data.license_integrity_state !== 0 ? 'hover:text-neutral-900 dark:text-neutral-50' : ''\n \"\n :to=\"nft.data.license_integrity_state !== 0 ? licenseUrl : undefined\"\n target=\"_blank\"\n >\n <DocumentTextIcon v-if=\"nft.data.license_integrity_state === 1\" class=\"h-6 w-6\" />\n <ExclamationIcon v-else class=\"h-6 w-6 text-orange-600\" />\n {{\n nft.data.license_integrity_state === 1\n ? $t('details.license')\n : nft.data.license_integrity_state === 2\n ? $t('details.licenseMismatch')\n : $t('details.noLicense')\n }}\n </NuxtLink>\n </div>\n <div class=\"mt-8 sm:col-span-1\">\n <NuxtLink\n class=\"flex items-center gap-1 text-sm font-medium text-neutral-700 hover:text-neutral-900 dark:text-neutral-200 dark:text-neutral-50\"\n :to=\"`https://www.spacescan.io/${\n getApiRoot().indexOf('testnet') !== -1 ? 'txch10' : 'xch'\n }/nft/${nft.encoded_id}`\"\n target=\"_blank\"\n >\n <img class=\"h-6 w-6 rounded-full border\" src=\"/spacescan.ico\" />{{\n $t('details.inspectOnSpacescan')\n }}\n </NuxtLink>\n </div>\n <div v-if=\"nft.data && !nft.collection?.blocked_content\" class=\"sm:col-span-1\">\n <NuxtLink\n class=\"flex items-center gap-1 text-sm font-medium text-neutral-700 hover:text-neutral-900 dark:text-neutral-200 dark:text-neutral-50\"\n :to=\"originalUrl\"\n target=\"_blank\"\n >\n <ExternalLinkIcon class=\"h-6 w-6\" />\n {{ $t('details.openOriginalDataURI') }}\n </NuxtLink>\n </div>\n <div v-if=\"nft.data\" class=\"sm:col-span-1\">\n <NuxtLink\n class=\"flex items-center gap-1 text-sm font-medium text-neutral-700 hover:text-neutral-900 dark:text-neutral-200 dark:text-neutral-50\"\n :to=\"metadataUrl\"\n target=\"_blank\"\n >\n <ExternalLinkIcon class=\"h-6 w-6\" />\n {{ $t('details.openOriginalMetadataURI') }}\n </NuxtLink>\n </div>\n </div>\n </div>\n </div>\n </div>\n <div class=\"mt-14 w-full sm:mt-16 xl:col-span-4 xl:mt-0 xl:max-w-none\">\n <div class=\"flex grid-cols-2 flex-col gap-4\">\n <h3 class=\"text-2xl font-bold\">{{ $t('details.provenance') }}</h3>\n <DetailsProvenance :nft=\"nft\" />\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n</template>\n"],"file":"_nuxt/BkEI18LF.js"}