{"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 || '&nbsp;'\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"}