Reading from NEAR testnet…
Reading from NEAR testnet…
AgBbjB88EnfS85PzQ5QeXHxcppoCGerK4i2CTFg9fSxe
web4.web3stick.testnet to web4.web3stick.testnet · failed
fs_store()
{
"mappings": "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",
"sources": [
"<anon>",
"src/js/playground_nft.js"
],
"sourcesContent": [
"import \"./gallery.f3b2974b.js\";\n\n\n var $parcel$global = globalThis;\n \nvar $parcel$modules = {};\nvar $parcel$inits = {};\n\nvar parcelRequire = $parcel$global[\"parcelRequirec0d9\"];\n\nif (parcelRequire == null) {\n parcelRequire = function(id) {\n if (id in $parcel$modules) {\n return $parcel$modules[id].exports;\n }\n if (id in $parcel$inits) {\n var init = $parcel$inits[id];\n delete $parcel$inits[id];\n var module = {id: id, exports: {}};\n $parcel$modules[id] = module;\n init.call(module.exports, module, module.exports);\n return module.exports;\n }\n var err = new Error(\"Cannot find module '\" + id + \"'\");\n err.code = 'MODULE_NOT_FOUND';\n throw err;\n };\n\n parcelRequire.register = function register(id, init) {\n $parcel$inits[id] = init;\n };\n\n $parcel$global[\"parcelRequirec0d9\"] = parcelRequire;\n}\n\nvar parcelRegister = parcelRequire.register;\n// Import NFT data service\n\nvar $2P331 = parcelRequire(\"2P331\");\n// Constants\nconst $2fdf69318339bf6e$var$EDITED_NFT_KEY = 'web3stick_edited_nft';\n// DOM Elements\nconst $2fdf69318339bf6e$var$searchBar = document.getElementById('searchBar');\nconst $2fdf69318339bf6e$var$canvas = document.getElementById('nftCanvas');\nconst $2fdf69318339bf6e$var$ctx = $2fdf69318339bf6e$var$canvas.getContext('2d');\nconst $2fdf69318339bf6e$var$colorPicker = document.getElementById('colorPicker');\nconst $2fdf69318339bf6e$var$saveButton = document.getElementById('saveButton');\nconst $2fdf69318339bf6e$var$nftNameSpan = document.getElementById('nftName');\nconst $2fdf69318339bf6e$var$nftOwnerSpan = document.getElementById('nftOwner');\nconst $2fdf69318339bf6e$var$nftImage = document.getElementById('nftImage');\nconsole.log('Initializing NFT playground components...');\n// Canvas Setup\nfunction $2fdf69318339bf6e$var$setupCanvas() {\n console.log('Setting up canvas...');\n // Set canvas size for high quality\n const size = 1000;\n $2fdf69318339bf6e$var$canvas.width = size;\n $2fdf69318339bf6e$var$canvas.height = size;\n // Set initial background\n $2fdf69318339bf6e$var$ctx.fillStyle = $2fdf69318339bf6e$var$colorPicker.value;\n $2fdf69318339bf6e$var$ctx.fillRect(0, 0, $2fdf69318339bf6e$var$canvas.width, $2fdf69318339bf6e$var$canvas.height);\n console.log('Canvas initialized with color:', $2fdf69318339bf6e$var$colorPicker.value);\n // Set blend mode\n $2fdf69318339bf6e$var$ctx.globalCompositeOperation = 'difference';\n console.log('Canvas setup complete');\n}\n// Drawing state\nlet $2fdf69318339bf6e$var$isDrawing = false;\nlet $2fdf69318339bf6e$var$lastX = 0;\nlet $2fdf69318339bf6e$var$lastY = 0;\n// Drawing functions\nfunction $2fdf69318339bf6e$var$startDrawing(e) {\n $2fdf69318339bf6e$var$isDrawing = true;\n [$2fdf69318339bf6e$var$lastX, $2fdf69318339bf6e$var$lastY] = $2fdf69318339bf6e$var$getCanvasCoordinates(e);\n console.log('Started drawing at coordinates:', {\n x: $2fdf69318339bf6e$var$lastX,\n y: $2fdf69318339bf6e$var$lastY\n });\n}\nfunction $2fdf69318339bf6e$var$draw(e) {\n if (!$2fdf69318339bf6e$var$isDrawing) return;\n const [currentX, currentY] = $2fdf69318339bf6e$var$getCanvasCoordinates(e);\n $2fdf69318339bf6e$var$ctx.beginPath();\n $2fdf69318339bf6e$var$ctx.moveTo($2fdf69318339bf6e$var$lastX, $2fdf69318339bf6e$var$lastY);\n $2fdf69318339bf6e$var$ctx.lineTo(currentX, currentY);\n $2fdf69318339bf6e$var$ctx.strokeStyle = 'white';\n $2fdf69318339bf6e$var$ctx.lineWidth = 3;\n $2fdf69318339bf6e$var$ctx.lineCap = 'round';\n $2fdf69318339bf6e$var$ctx.stroke();\n [$2fdf69318339bf6e$var$lastX, $2fdf69318339bf6e$var$lastY] = [\n currentX,\n currentY\n ];\n console.log('Drawing line to:', {\n x: currentX,\n y: currentY\n });\n}\nfunction $2fdf69318339bf6e$var$stopDrawing() {\n if ($2fdf69318339bf6e$var$isDrawing) {\n console.log('Stopped drawing');\n $2fdf69318339bf6e$var$isDrawing = false;\n }\n}\nfunction $2fdf69318339bf6e$var$getCanvasCoordinates(e) {\n const rect = $2fdf69318339bf6e$var$canvas.getBoundingClientRect();\n const scaleX = $2fdf69318339bf6e$var$canvas.width / rect.width;\n const scaleY = $2fdf69318339bf6e$var$canvas.height / rect.height;\n return [\n (e.clientX - rect.left) * scaleX,\n (e.clientY - rect.top) * scaleY\n ];\n}\n// NFT Search and Display\nasync function $2fdf69318339bf6e$var$fetchNFTData() {\n console.log('Fetching NFT data from storage...');\n try {\n const cachedData = localStorage.getItem(STORAGE_KEY);\n if (cachedData) {\n console.log('Found cached NFT data');\n return JSON.parse(cachedData);\n }\n console.log('No cached NFT data found');\n return [];\n } catch (error) {\n console.error('Error fetching NFT data:', error);\n return [];\n }\n}\nfunction $2fdf69318339bf6e$var$createSuggestionsContainer() {\n console.log('Creating suggestions container...');\n let container = document.querySelector('.suggestions-container');\n if (!container) {\n console.log('No existing container found, creating new one');\n container = document.createElement('div');\n container.className = 'suggestions-container';\n $2fdf69318339bf6e$var$searchBar.parentNode.appendChild(container);\n }\n return container;\n}\nasync function $2fdf69318339bf6e$var$showSuggestions(searchText) {\n console.log('Showing suggestions for search text:', searchText);\n const container = $2fdf69318339bf6e$var$createSuggestionsContainer();\n container.innerHTML = '';\n if (!searchText) {\n console.log('No search text provided, hiding suggestions');\n container.style.display = 'none';\n return;\n }\n const nftData = await (0, $2P331.getNFTData)();\n const matches = nftData.filter((nft)=>nft.metadata.title.toLowerCase().includes(searchText.toLowerCase()));\n if (matches.length > 0) {\n container.style.display = 'block';\n matches.forEach((nft)=>{\n const div = document.createElement('div');\n div.className = 'suggestion-item';\n div.innerHTML = `\n ${nft.metadata.title}\n <small>${nft.owner_id}</small>\n `;\n div.onclick = ()=>$2fdf69318339bf6e$var$loadNFT(nft);\n container.appendChild(div);\n });\n } else container.style.display = 'none';\n}\nasync function $2fdf69318339bf6e$var$loadNFT(nft) {\n // Reset original image data\n $2fdf69318339bf6e$var$originalImageData = null;\n // Update NFT details\n $2fdf69318339bf6e$var$nftNameSpan.textContent = nft.metadata.title;\n $2fdf69318339bf6e$var$nftOwnerSpan.textContent = nft.owner_id;\n // Load NFT image\n const cleanMediaUrl = nft.metadata.media.replace(/[\\s`]/g, '');\n // Create a new image object for loading\n const img = new Image();\n img.crossOrigin = 'anonymous'; // Enable CORS for the image\n // Handle image loading with promise\n await new Promise((resolve, reject)=>{\n img.onload = resolve;\n img.onerror = ()=>reject(new Error('Failed to load NFT image'));\n img.src = cleanMediaUrl;\n }).catch((error)=>{\n console.error('Error loading NFT image:', error);\n return; // Exit if image fails to load\n });\n // Clear canvas and set blend mode\n $2fdf69318339bf6e$var$ctx.globalCompositeOperation = 'source-over';\n $2fdf69318339bf6e$var$ctx.fillStyle = $2fdf69318339bf6e$var$colorPicker.value;\n $2fdf69318339bf6e$var$ctx.fillRect(0, 0, $2fdf69318339bf6e$var$canvas.width, $2fdf69318339bf6e$var$canvas.height);\n // Set blend mode before drawing image\n $2fdf69318339bf6e$var$ctx.globalCompositeOperation = 'difference';\n // Calculate dimensions to maintain aspect ratio\n const scale = Math.min($2fdf69318339bf6e$var$canvas.width / img.width, $2fdf69318339bf6e$var$canvas.height / img.height);\n const x = ($2fdf69318339bf6e$var$canvas.width - img.width * scale) / 2;\n const y = ($2fdf69318339bf6e$var$canvas.height - img.height * scale) / 2;\n // Draw image on canvas with blend mode applied\n $2fdf69318339bf6e$var$ctx.drawImage(img, x, y, img.width * scale, img.height * scale);\n // Update display image\n $2fdf69318339bf6e$var$nftImage.src = cleanMediaUrl;\n // Clear suggestions\n const container = document.querySelector('.suggestions-container');\n if (container) container.style.display = 'none';\n // Clear search bar\n $2fdf69318339bf6e$var$searchBar.value = '';\n}\n// Save canvas state\nfunction $2fdf69318339bf6e$var$saveCanvasState() {\n console.log('Saving canvas state...');\n try {\n // Create a download link\n const link = document.createElement('a');\n // Get the canvas data as PNG\n const imageData = $2fdf69318339bf6e$var$canvas.toDataURL('image/png');\n link.href = imageData;\n // Generate filename with NFT name and timestamp\n const timestamp = new Date().toISOString().replace(/[:.]/g, '-');\n const filename = `${$2fdf69318339bf6e$var$nftNameSpan.textContent || 'nft'}_${timestamp}.png`;\n link.download = filename;\n // Save to localStorage for reference\n const currentNFT = {\n image: imageData,\n name: $2fdf69318339bf6e$var$nftNameSpan.textContent,\n owner: $2fdf69318339bf6e$var$nftOwnerSpan.textContent,\n timestamp: timestamp\n };\n localStorage.setItem($2fdf69318339bf6e$var$EDITED_NFT_KEY, JSON.stringify(currentNFT));\n // Trigger download\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n console.log('Canvas saved as PNG successfully');\n alert('NFT saved as PNG successfully!');\n } catch (error) {\n console.error('Error saving canvas state:', error);\n alert('Failed to save NFT');\n }\n}\n// Event Listeners\n// Initialize components and load NFT data\nwindow.addEventListener('load', async ()=>{\n console.log('Window loaded, initializing components...');\n $2fdf69318339bf6e$var$setupCanvas();\n // Load NFT data on page load\n try {\n await (0, $2P331.getNFTData)();\n console.log('NFT data loaded successfully');\n } catch (error) {\n console.error('Error loading NFT data:', error);\n }\n});\n// Canvas drawing events\n$2fdf69318339bf6e$var$canvas.addEventListener('mousedown', $2fdf69318339bf6e$var$startDrawing);\n$2fdf69318339bf6e$var$canvas.addEventListener('mousemove', $2fdf69318339bf6e$var$draw);\n$2fdf69318339bf6e$var$canvas.addEventListener('mouseup', $2fdf69318339bf6e$var$stopDrawing);\n$2fdf69318339bf6e$var$canvas.addEventListener('mouseout', $2fdf69318339bf6e$var$stopDrawing);\n// Touch events for mobile\n$2fdf69318339bf6e$var$canvas.addEventListener('touchstart', (e)=>{\n e.preventDefault();\n $2fdf69318339bf6e$var$startDrawing(e.touches[0]);\n});\n$2fdf69318339bf6e$var$canvas.addEventListener('touchmove', (e)=>{\n e.preventDefault();\n $2fdf69318339bf6e$var$draw(e.touches[0]);\n});\n$2fdf69318339bf6e$var$canvas.addEventListener('touchend', $2fdf69318339bf6e$var$stopDrawing);\n// Save button event\n$2fdf69318339bf6e$var$saveButton.addEventListener('click', $2fdf69318339bf6e$var$saveCanvasState);\n// Store original image data\nlet $2fdf69318339bf6e$var$originalImageData = null;\n// Color picker event\n$2fdf69318339bf6e$var$colorPicker.addEventListener('input', (e)=>{\n console.log('Color changed to:', e.target.value);\n // Store current canvas state if not already stored\n if (!$2fdf69318339bf6e$var$originalImageData) {\n console.log('Storing original canvas state');\n $2fdf69318339bf6e$var$originalImageData = $2fdf69318339bf6e$var$ctx.getImageData(0, 0, $2fdf69318339bf6e$var$canvas.width, $2fdf69318339bf6e$var$canvas.height);\n }\n // Reset composite operation to default\n $2fdf69318339bf6e$var$ctx.globalCompositeOperation = 'source-over';\n // Clear canvas and set new background\n $2fdf69318339bf6e$var$ctx.clearRect(0, 0, $2fdf69318339bf6e$var$canvas.width, $2fdf69318339bf6e$var$canvas.height);\n $2fdf69318339bf6e$var$ctx.fillStyle = e.target.value;\n $2fdf69318339bf6e$var$ctx.fillRect(0, 0, $2fdf69318339bf6e$var$canvas.width, $2fdf69318339bf6e$var$canvas.height);\n // Set blend mode for drawing\n $2fdf69318339bf6e$var$ctx.globalCompositeOperation = 'difference';\n // Draw the original content back if it exists\n if ($2fdf69318339bf6e$var$originalImageData) {\n const tempCanvas = document.createElement('canvas');\n tempCanvas.width = $2fdf69318339bf6e$var$canvas.width;\n tempCanvas.height = $2fdf69318339bf6e$var$canvas.height;\n const tempCtx = tempCanvas.getContext('2d');\n tempCtx.putImageData($2fdf69318339bf6e$var$originalImageData, 0, 0);\n $2fdf69318339bf6e$var$ctx.drawImage(tempCanvas, 0, 0);\n }\n});\n// Search bar events\n$2fdf69318339bf6e$var$searchBar.addEventListener('input', (e)=>$2fdf69318339bf6e$var$showSuggestions(e.target.value));\n// Click outside search suggestions to close\ndocument.addEventListener('click', (e)=>{\n if (!e.target.closest('.search-container')) {\n const container = document.querySelector('.suggestions-container');\n if (container) container.style.display = 'none';\n }\n});\nfunction $2fdf69318339bf6e$var$checkMobileDevice() {\n const isMobile = /Mobi|Android/i.test(navigator.userAgent);\n if (isMobile) {\n $2fdf69318339bf6e$var$canvas.style.display = 'none';\n $2fdf69318339bf6e$var$searchBar.style.display = 'none';\n $2fdf69318339bf6e$var$colorPicker.style.display = 'none';\n $2fdf69318339bf6e$var$saveButton.style.display = 'none';\n const mobileMessage = document.createElement('p');\n mobileMessage.textContent = \"\\u2139\\uFE0F Canvas Feature not supported on mobile \\u2139\\uFE0F\";\n document.querySelector('section').appendChild(mobileMessage);\n }\n}\nwindow.addEventListener('load', $2fdf69318339bf6e$var$checkMobileDevice);\nwindow.addEventListener('resize', $2fdf69318339bf6e$var$checkMobileDevice);\n\n\n//# sourceMappingURL=playground.8043c0fe.js.map\n",
"// Import NFT data service\nimport { getNFTData } from './nft_data_service';\n\n// Constants\nconst EDITED_NFT_KEY = 'web3stick_edited_nft';\n\n// DOM Elements\nconst searchBar = document.getElementById('searchBar');\nconst canvas = document.getElementById('nftCanvas');\nconst ctx = canvas.getContext('2d');\nconst colorPicker = document.getElementById('colorPicker');\nconst saveButton = document.getElementById('saveButton');\nconst nftNameSpan = document.getElementById('nftName');\nconst nftOwnerSpan = document.getElementById('nftOwner');\nconst nftImage = document.getElementById('nftImage');\n\nconsole.log('Initializing NFT playground components...');\n\n// Canvas Setup\nfunction setupCanvas() {\n console.log('Setting up canvas...');\n // Set canvas size for high quality\n const size = 1000;\n canvas.width = size;\n canvas.height = size;\n \n // Set initial background\n ctx.fillStyle = colorPicker.value;\n ctx.fillRect(0, 0, canvas.width, canvas.height);\n console.log('Canvas initialized with color:', colorPicker.value);\n \n // Set blend mode\n ctx.globalCompositeOperation = 'difference';\n console.log('Canvas setup complete');\n}\n\n// Drawing state\nlet isDrawing = false;\nlet lastX = 0;\nlet lastY = 0;\n\n// Drawing functions\nfunction startDrawing(e) {\n isDrawing = true;\n [lastX, lastY] = getCanvasCoordinates(e);\n console.log('Started drawing at coordinates:', { x: lastX, y: lastY });\n}\n\nfunction draw(e) {\n if (!isDrawing) return;\n \n const [currentX, currentY] = getCanvasCoordinates(e);\n \n ctx.beginPath();\n ctx.moveTo(lastX, lastY);\n ctx.lineTo(currentX, currentY);\n ctx.strokeStyle = 'white';\n ctx.lineWidth = 3;\n ctx.lineCap = 'round';\n ctx.stroke();\n \n [lastX, lastY] = [currentX, currentY];\n console.log('Drawing line to:', { x: currentX, y: currentY });\n}\n\nfunction stopDrawing() {\n if (isDrawing) {\n console.log('Stopped drawing');\n isDrawing = false;\n }\n}\n\nfunction getCanvasCoordinates(e) {\n const rect = canvas.getBoundingClientRect();\n const scaleX = canvas.width / rect.width;\n const scaleY = canvas.height / rect.height;\n \n return [\n (e.clientX - rect.left) * scaleX,\n (e.clientY - rect.top) * scaleY\n ];\n}\n\n// NFT Search and Display\nasync function fetchNFTData() {\n console.log('Fetching NFT data from storage...');\n try {\n const cachedData = localStorage.getItem(STORAGE_KEY);\n if (cachedData) {\n console.log('Found cached NFT data');\n return JSON.parse(cachedData);\n }\n console.log('No cached NFT data found');\n return [];\n } catch (error) {\n console.error('Error fetching NFT data:', error);\n return [];\n }\n}\n\nfunction createSuggestionsContainer() {\n console.log('Creating suggestions container...');\n let container = document.querySelector('.suggestions-container');\n if (!container) {\n console.log('No existing container found, creating new one');\n container = document.createElement('div');\n container.className = 'suggestions-container';\n searchBar.parentNode.appendChild(container);\n }\n return container;\n}\n\nasync function showSuggestions(searchText) {\n console.log('Showing suggestions for search text:', searchText);\n const container = createSuggestionsContainer();\n container.innerHTML = '';\n \n if (!searchText) {\n console.log('No search text provided, hiding suggestions');\n container.style.display = 'none';\n return;\n }\n \n const nftData = await getNFTData();\n const matches = nftData.filter(nft => \n nft.metadata.title.toLowerCase().includes(searchText.toLowerCase())\n );\n \n if (matches.length > 0) {\n container.style.display = 'block';\n matches.forEach(nft => {\n const div = document.createElement('div');\n div.className = 'suggestion-item';\n div.innerHTML = `\n ${nft.metadata.title}\n <small>${nft.owner_id}</small>\n `;\n div.onclick = () => loadNFT(nft);\n container.appendChild(div);\n });\n } else {\n container.style.display = 'none';\n }\n}\n\nasync function loadNFT(nft) {\n // Reset original image data\n originalImageData = null;\n \n // Update NFT details\n nftNameSpan.textContent = nft.metadata.title;\n nftOwnerSpan.textContent = nft.owner_id;\n \n // Load NFT image\n const cleanMediaUrl = nft.metadata.media.replace(/[\\s`]/g, '');\n \n // Create a new image object for loading\n const img = new Image();\n img.crossOrigin = 'anonymous'; // Enable CORS for the image\n \n // Handle image loading with promise\n await new Promise((resolve, reject) => {\n img.onload = resolve;\n img.onerror = () => reject(new Error('Failed to load NFT image'));\n img.src = cleanMediaUrl;\n }).catch(error => {\n console.error('Error loading NFT image:', error);\n return; // Exit if image fails to load\n });\n \n // Clear canvas and set blend mode\n ctx.globalCompositeOperation = 'source-over';\n ctx.fillStyle = colorPicker.value;\n ctx.fillRect(0, 0, canvas.width, canvas.height);\n \n // Set blend mode before drawing image\n ctx.globalCompositeOperation = 'difference';\n \n // Calculate dimensions to maintain aspect ratio\n const scale = Math.min(\n canvas.width / img.width,\n canvas.height / img.height\n );\n const x = (canvas.width - img.width * scale) / 2;\n const y = (canvas.height - img.height * scale) / 2;\n \n // Draw image on canvas with blend mode applied\n ctx.drawImage(\n img,\n x, y,\n img.width * scale,\n img.height * scale\n );\n \n // Update display image\n nftImage.src = cleanMediaUrl;\n \n // Clear suggestions\n const container = document.querySelector('.suggestions-container');\n if (container) {\n container.style.display = 'none';\n }\n \n // Clear search bar\n searchBar.value = '';\n\n}\n\n// Save canvas state\nfunction saveCanvasState() {\n console.log('Saving canvas state...');\n try {\n // Create a download link\n const link = document.createElement('a');\n \n // Get the canvas data as PNG\n const imageData = canvas.toDataURL('image/png');\n link.href = imageData;\n \n // Generate filename with NFT name and timestamp\n const timestamp = new Date().toISOString().replace(/[:.]/g, '-');\n const filename = `${nftNameSpan.textContent || 'nft'}_${timestamp}.png`;\n link.download = filename;\n \n // Save to localStorage for reference\n const currentNFT = {\n image: imageData,\n name: nftNameSpan.textContent,\n owner: nftOwnerSpan.textContent,\n timestamp: timestamp\n };\n localStorage.setItem(EDITED_NFT_KEY, JSON.stringify(currentNFT));\n \n // Trigger download\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n \n console.log('Canvas saved as PNG successfully');\n alert('NFT saved as PNG successfully!');\n } catch (error) {\n console.error('Error saving canvas state:', error);\n alert('Failed to save NFT');\n }\n}\n\n// Event Listeners\n// Initialize components and load NFT data\nwindow.addEventListener('load', async () => {\n console.log('Window loaded, initializing components...');\n setupCanvas();\n \n // Load NFT data on page load\n try {\n await getNFTData();\n console.log('NFT data loaded successfully');\n } catch (error) {\n console.error('Error loading NFT data:', error);\n }\n});\n\n// Canvas drawing events\ncanvas.addEventListener('mousedown', startDrawing);\ncanvas.addEventListener('mousemove', draw);\ncanvas.addEventListener('mouseup', stopDrawing);\ncanvas.addEventListener('mouseout', stopDrawing);\n\n// Touch events for mobile\ncanvas.addEventListener('touchstart', (e) => {\n e.preventDefault();\n startDrawing(e.touches[0]);\n});\ncanvas.addEventListener('touchmove', (e) => {\n e.preventDefault();\n draw(e.touches[0]);\n});\ncanvas.addEventListener('touchend', stopDrawing);\n\n// Save button event\nsaveButton.addEventListener('click', saveCanvasState);\n\n// Store original image data\nlet originalImageData = null;\n\n// Color picker event\ncolorPicker.addEventListener('input', (e) => {\n console.log('Color changed to:', e.target.value);\n // Store current canvas state if not already stored\n if (!originalImageData) {\n console.log('Storing original canvas state');\n originalImageData = ctx.getImageData(0, 0, canvas.width, canvas.height);\n }\n \n // Reset composite operation to default\n ctx.globalCompositeOperation = 'source-over';\n \n // Clear canvas and set new background\n ctx.clearRect(0, 0, canvas.width, canvas.height);\n ctx.fillStyle = e.target.value;\n ctx.fillRect(0, 0, canvas.width, canvas.height);\n \n // Set blend mode for drawing\n ctx.globalCompositeOperation = 'difference';\n \n // Draw the original content back if it exists\n if (originalImageData) {\n const tempCanvas = document.createElement('canvas');\n tempCanvas.width = canvas.width;\n tempCanvas.height = canvas.height;\n const tempCtx = tempCanvas.getContext('2d');\n tempCtx.putImageData(originalImageData, 0, 0);\n \n ctx.drawImage(tempCanvas, 0, 0);\n }\n});\n\n// Search bar events\nsearchBar.addEventListener('input', (e) => showSuggestions(e.target.value));\n\n// Click outside search suggestions to close\ndocument.addEventListener('click', (e) => {\n if (!e.target.closest('.search-container')) {\n const container = document.querySelector('.suggestions-container');\n if (container) {\n container.style.display = 'none';\n }\n }\n});\n\n\nfunction checkMobileDevice() {\n const isMobile = /Mobi|Android/i.test(navigator.userAgent);\n if (isMobile) {\n canvas.style.display = 'none';\n searchBar.style.display = 'none';\n colorPicker.style.display = 'none';\n saveButton.style.display = 'none';\n\n const mobileMessage = document.createElement('p');\n mobileMessage.textContent = 'ℹ️ Canvas Feature not supported on mobile ℹ️';\n document.querySelector('section').appendChild(mobileMessage);\n }\n}\n\nwindow.addEventListener('load', checkMobileDevice);\nwindow.addEventListener('resize', checkMobileDevice);"
],
"names": [
"$parcel$global",
"globalThis",
"$parcel$modules",
"$parcel$inits",
"parcelRequire",
"id",
"exports",
"init",
"module",
"call",
"err",
"Error",
"code",
"register",
"$2P331",
"$2fdf69318339bf6e$var$searchBar",
"document",
"getElementById",
"$2fdf69318339bf6e$var$canvas",
"$2fdf69318339bf6e$var$ctx",
"getContext",
"$2fdf69318339bf6e$var$colorPicker",
"$2fdf69318339bf6e$var$saveButton",
"$2fdf69318339bf6e$var$nftNameSpan",
"$2fdf69318339bf6e$var$nftOwnerSpan",
"$2fdf69318339bf6e$var$nftImage",
"console",
"log",
"$2fdf69318339bf6e$var$isDrawing",
"$2fdf69318339bf6e$var$lastX",
"$2fdf69318339bf6e$var$lastY",
"$2fdf69318339bf6e$var$startDrawing",
"e",
"$2fdf69318339bf6e$var$getCanvasCoordinates",
"x",
"y",
"$2fdf69318339bf6e$var$draw",
"currentX",
"currentY",
"beginPath",
"moveTo",
"lineTo",
"strokeStyle",
"lineWidth",
"lineCap",
"stroke",
"$2fdf69318339bf6e$var$stopDrawing",
"rect",
"getBoundingClientRect",
"scaleX",
"width",
"scaleY",
"height",
"clientX",
"left",
"clientY",
"top",
"$2fdf69318339bf6e$var$showSuggestions",
"searchText",
"container",
"querySelector",
"createElement",
"className",
"parentNode",
"appendChild",
"innerHTML",
"style",
"display",
"matches",
"nftData",
"getNFTData",
"filter",
"nft",
"metadata",
"title",
"toLowerCase",
"includes",
"length",
"forEach",
"div",
"owner_id",
"onclick",
"$2fdf69318339bf6e$var$loadNFT",
"$2fdf69318339bf6e$var$originalImageData",
"textContent",
"cleanMediaUrl",
"media",
"replace",
"img",
"Image",
"crossOrigin",
"Promise",
"resolve",
"reject",
"onload",
"onerror",
"src",
"catch",
"error",
"globalCompositeOperation",
"fillStyle",
"value",
"fillRect",
"scale",
"Math",
"min",
"drawImage",
"window",
"addEventListener",
"preventDefault",
"touches",
"link",
"imageData",
"toDataURL",
"href",
"timestamp",
"Date",
"toISOString",
"download",
"currentNFT",
"image",
"name",
"owner",
"localStorage",
"setItem",
"JSON",
"stringify",
"body",
"click",
"removeChild",
"alert",
"$2fdf69318339bf6e$var$checkMobileDevice",
"test",
"navigator",
"userAgent",
"mobileMessage",
"target",
"getImageData",
"clearRect",
"tempCanvas",
"tempCtx",
"putImageData",
"closest"
],
"version": 3,
"file": "playground.8043c0fe.js.map"
}fs_store()
import"./gallery.f3b2974b.js";var e=globalThis,t={},n={},o=e.parcelRequirec0d9;null==o&&((o=function(e){if(e in t)return t[e].exports;if(e in n){var o=n[e];delete n[e];var a={id:e,exports:{}};return t[e]=a,o.call(a.exports,a,a.exports),a.exports}var i=Error("Cannot find module '"+e+"'");throw i.code="MODULE_NOT_FOUND",i}).register=function(e,t){n[e]=t},e.parcelRequirec0d9=o),o.register;var a=o("2P331");let i=document.getElementById("searchBar"),l=document.getElementById("nftCanvas"),r=l.getContext("2d"),s=document.getElementById("colorPicker"),d=document.getElementById("saveButton"),c=document.getElementById("nftName"),g=document.getElementById("nftOwner"),u=document.getElementById("nftImage");console.log("Initializing NFT playground components...");let m=!1,h=0,p=0;function v(e){m=!0,[h,p]=w(e),console.log("Started drawing at coordinates:",{x:h,y:p})}function y(e){if(!m)return;let[t,n]=w(e);r.beginPath(),r.moveTo(h,p),r.lineTo(t,n),r.strokeStyle="white",r.lineWidth=3,r.lineCap="round",r.stroke(),[h,p]=[t,n],console.log("Drawing line to:",{x:t,y:n})}function f(){m&&(console.log("Stopped drawing"),m=!1)}function w(e){let t=l.getBoundingClientRect(),n=l.width/t.width,o=l.height/t.height;return[(e.clientX-t.left)*n,(e.clientY-t.top)*o]}async function E(e){let t;console.log("Showing suggestions for search text:",e);let n=(console.log("Creating suggestions container..."),(t=document.querySelector(".suggestions-container"))||(console.log("No existing container found, creating new one"),(t=document.createElement("div")).className="suggestions-container",i.parentNode.appendChild(t)),t);if(n.innerHTML="",!e){console.log("No search text provided, hiding suggestions"),n.style.display="none";return}let o=(await (0,a.getNFTData)()).filter(t=>t.metadata.title.toLowerCase().includes(e.toLowerCase()));o.length>0?(n.style.display="block",o.forEach(e=>{let t=document.createElement("div");t.className="suggestion-item",t.innerHTML=`
${e.metadata.title}
<small>${e.owner_id}</small>
`,t.onclick=()=>C(e),n.appendChild(t)})):n.style.display="none"}async function C(e){L=null,c.textContent=e.metadata.title,g.textContent=e.owner_id;let t=e.metadata.media.replace(/[\s`]/g,""),n=new Image;n.crossOrigin="anonymous",await new Promise((e,o)=>{n.onload=e,n.onerror=()=>o(Error("Failed to load NFT image")),n.src=t}).catch(e=>{console.error("Error loading NFT image:",e)}),r.globalCompositeOperation="source-over",r.fillStyle=s.value,r.fillRect(0,0,l.width,l.height),r.globalCompositeOperation="difference";let o=Math.min(l.width/n.width,l.height/n.height),a=(l.width-n.width*o)/2,d=(l.height-n.height*o)/2;r.drawImage(n,a,d,n.width*o,n.height*o),u.src=t;let m=document.querySelector(".suggestions-container");m&&(m.style.display="none"),i.value=""}window.addEventListener("load",async()=>{console.log("Window loaded, initializing components..."),console.log("Setting up canvas..."),l.width=1e3,l.height=1e3,r.fillStyle=s.value,r.fillRect(0,0,l.width,l.height),console.log("Canvas initialized with color:",s.value),r.globalCompositeOperation="difference",console.log("Canvas setup complete");try{await (0,a.getNFTData)(),console.log("NFT data loaded successfully")}catch(e){console.error("Error loading NFT data:",e)}}),l.addEventListener("mousedown",v),l.addEventListener("mousemove",y),l.addEventListener("mouseup",f),l.addEventListener("mouseout",f),l.addEventListener("touchstart",e=>{e.preventDefault(),v(e.touches[0])}),l.addEventListener("touchmove",e=>{e.preventDefault(),y(e.touches[0])}),l.addEventListener("touchend",f),d.addEventListener("click",function(){console.log("Saving canvas state...");try{let e=document.createElement("a"),t=l.toDataURL("image/png");e.href=t;let n=new Date().toISOString().replace(/[:.]/g,"-");e.download=`${c.textContent||"nft"}_${n}.png`;let o={image:t,name:c.textContent,owner:g.textContent,timestamp:n};localStorage.setItem("web3stick_edited_nft",JSON.stringify(o)),document.body.appendChild(e),e.click(),document.body.removeChild(e),console.log("Canvas saved as PNG successfully"),alert("NFT saved as PNG successfully!")}catch(e){console.error("Error saving canvas state:",e),alert("Failed to save NFT")}});let L=null;function N(){if(/Mobi|Android/i.test(navigator.userAgent)){l.style.display="none",i.style.display="none",s.style.display="none",d.style.display="none";let e=document.createElement("p");e.textContent="ℹ️ Canvas Feature not supported on mobile ℹ️",document.querySelector("section").appendChild(e)}}s.addEventListener("input",e=>{if(console.log("Color changed to:",e.target.value),L||(console.log("Storing original canvas state"),L=r.getImageData(0,0,l.width,l.height)),r.globalCompositeOperation="source-over",r.clearRect(0,0,l.width,l.height),r.fillStyle=e.target.value,r.fillRect(0,0,l.width,l.height),r.globalCompositeOperation="difference",L){let e=document.createElement("canvas");e.width=l.width,e.height=l.height,e.getContext("2d").putImageData(L,0,0),r.drawImage(e,0,0)}}),i.addEventListener("input",e=>E(e.target.value)),document.addEventListener("click",e=>{if(!e.target.closest(".search-container")){let e=document.querySelector(".suggestions-container");e&&(e.style.display="none")}}),window.addEventListener("load",N),window.addEventListener("resize",N);
//# sourceMappingURL=playground.8043c0fe.js.map
fs_store()
<!doctype html><html lang="en"><head><script type="module" src="/gallery.f3b2974b.js"></script><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>WEB3STICK</title><link rel="icon shortcut" type="image/x-icon" href="/web3stick.2f189c3f.png"><meta name="title" content="WEB3STICK"><meta name="description" content="A social experiment and playground project featuring stick figure NFTs on the NEAR blockchain. Create and customize your own web3stick account."><meta name="keywords" content="web3, NFT, NEAR Protocol, stick figure, blockchain, web3stick, cryptocurrency, digital art"><meta name="author" content="nonresistant.near and sleet.near"><meta name="robots" content="index, follow"><meta name="language" content="English"><meta name="revisit-after" content="7 days"><meta name="distribution" content="global"><meta name="rating" content="general"><meta name="copyright" content="web3stick"><meta name="author" content="web3stick"><meta property="og:type" content="website"><base target="_blank"><link rel="stylesheet" href="/workspace.6d8e5b3f.css"><link rel="stylesheet" href="/playground.aa884822.css"></head><body> <article> <section> <h2>PLAYGROUND</h2> <p>add color and art to your stick figure nft</p> <div class="search-container"> <input type="text" id="searchBar" placeholder="Enter your NFT name"> </div> <canvas id="nftCanvas"></canvas> <input type="color" id="colorPicker" name="colorPicker" value="#ff0000"> <button id="saveButton">SAVE</button> <h3>NFT Details</h3> <p>make sure you only play with and share your own nft</p> <div id="nftDetails"> <img src="/web3stick.2f189c3f.png" alt="NFT Image" id="nftImage"> <div> <p>Name: <span id="nftName">Example NFT</span></p> <p>Owner: <span id="nftOwner">Owner Name</span></p> </div> </div> </section> <section> <footer> <a href="/index.html" target="_self">home</a> <a href="/hello.html" target="_self">hello</a> <a href="/playground.html" target="_self">playground</a> <a href="/gallery.html" target="_self">gallery</a> <a href="/about.html" target="_self">about</a> <a href="/store.html" target="_self">store</a> </footer> </section> </article> <script src="/workspace.74d2f5f8.js"></script> <script type="module" src="/playground.8043c0fe.js"></script> </body></html>
fs_store()
5
$U �Bc-�-
��xXx4PA���"�� 1���G�
about.html�>
$U �:���-��P#��WN?�&s>��U�`OG�����Rgallery.883a780d.js�B
$U l��QĞy�|������z�c�2b&�Tv��:gallery.883a780d.js.map�{?
$U cd�"��cS*�q�N�?Ul, ^p��߅+�gallery.da4e0cad.css�C
$U ����sh�!TQ��!�4Su�1,;{r�U�gallery.da4e0cad.css.map�H?
$U 5�*C�����0aRaj�����b�v��F����gallery.f3b2974b.js��C
$U ��#MV�[�z�A~Z�\��Ԉ��$��Egallery.f3b2974b.js.map��7
$U ���)b�k�d��s3Y͉�+�5�Ni������gallery.html�5
$U ���&��<xo�?���b$|��"��J��Ѓ�pj
hello.html�5
$U o�����Hx��0Vr��N����pG=�F?��9
index.html�A
$U �t�z��-R���
�]������'�Mplayground.8043c0fe.js�)F
$U >��UQ���!���R+8�_����g]6�_Splayground.8043c0fe.js.map�B
$U :{$'%��
P��٪4
,����.l8��V�)Splayground.aa884822.css�
F
$U s��?!b�j< >��{�}�f��t+���s���hUplayground.aa884822.css.map�!:
$U �_5�q$�:�,�����x�G���9r���CCplayground.html�5
$U �y S���%t�[^���D����Ap�¤����FB
store.html�A
$U �G�����$`x4@-��*�S��T������web3stick.2f189c3f.png�LA
$U p���˻@'�X�=}�D!�Z7��`V���Z�bworkspace.6d8e5b3f.css�
E
$U ��q��_]�~���1<�=|T�k��J��workspace.6d8e5b3f.css.map�@
$U �Z;l# 2[�D�ꍩ����E������@workspace.74d2f5f8.js�D
$U ��/
B8`��RUoޭ�1�<���A�Rworkspace.74d2f5f8.js.map�
{"ActionError":{"index":0,"kind":{"FunctionCallError":{"MethodResolveError":"MethodNotFound"}}}}
1 automatic refund step from the network not shown.
This page reads FastNEAR's public transaction index and stores nothing. This command asks a NEAR archival node for the same transaction and needs no keys.
curl -s https://archival-rpc.testnet.fastnear.com -H 'Content-Type: application/json' -d '{"jsonrpc":"2.0","id":1,"method":"tx","params":{"tx_hash":"AgBbjB88EnfS85PzQ5QeXHxcppoCGerK4i2CTFg9fSxe","sender_account_id":"web4.web3stick.testnet","wait_until":"FINAL"}}'Vouch has its own page because testnet.nearblocks.io stopped indexing on 27 Sep 2026, so it can't show newer transactions.