/**
 * Address provider implementation for WooCommerce shortcode checkout
 *
 * Note: The core registration logic and provider management is handled
 * by the common module (address-autocomplete-common.js). This file focuses
 * on the shortcode-specific implementation.
 */

// The common module will have already initialized window.wc.addressAutocomplete
// with providers, activeProvider, serverProviders, and the registration function.
// We just need to use them here.

if (
	! window.wc ||
	! window.wc.wcSettings ||
	! window.wc.wcSettings.allSettings ||
	! window.wc.wcSettings.allSettings.isCheckoutBlock
) {
	( function () {
		/**
		 * Set the active address provider based on which providers' (queried in order) canSearch returns true.
		 * Triggers when country changes.
		 * @param country {string} country code.
		 * @param type {string} type 'billing' or 'shipping'
		 */
		function setActiveProvider( country, type ) {
			// Get server providers list (already ordered by preference).
			const serverProviders =
				window.wc.addressAutocomplete.serverProviders;

			// Check providers in preference order (server handles preferred provider ordering).
			for ( const serverProvider of serverProviders ) {
				const provider =
					window.wc.addressAutocomplete.providers[
						serverProvider.id
					];

				if ( provider && provider.canSearch( country ) ) {
					window.wc.addressAutocomplete.activeProvider[ type ] =
						provider;
					// Add autocomplete-available class to parent .woocommerce-input-wrapper
					const addressInput = document.getElementById(
						`${ type }_address_1`
					);
					if ( addressInput ) {
						const wrapper = addressInput.closest(
							'.woocommerce-input-wrapper'
						);
						if ( wrapper ) {
							wrapper.classList.add( 'autocomplete-available' );
						}
						// Add combobox role and ARIA attributes for accessibility
						addressInput.setAttribute( 'role', 'combobox' );
						addressInput.setAttribute(
							'aria-autocomplete',
							'list'
						);
						addressInput.setAttribute( 'aria-expanded', 'false' );
						addressInput.setAttribute( 'aria-haspopup', 'listbox' );
					}
					return;
				}
			}

			// No provider can search for this country.
			window.wc.addressAutocomplete.activeProvider[ type ] = null;
			// Remove autocomplete-available class from parent .woocommerce-input-wrapper
			const addressInput = document.getElementById(
				`${ type }_address_1`
			);
			if ( addressInput ) {
				const wrapper = addressInput.closest(
					'.woocommerce-input-wrapper'
				);
				if ( wrapper ) {
					wrapper.classList.remove( 'autocomplete-available' );
				}
				// Remove all ARIA attributes when no provider is available
				addressInput.removeAttribute( 'role' );
				addressInput.removeAttribute( 'aria-autocomplete' );
				addressInput.removeAttribute( 'aria-expanded' );
				addressInput.removeAttribute( 'aria-haspopup' );
				addressInput.removeAttribute( 'aria-activedescendant' );
				addressInput.removeAttribute( 'aria-owns' );
				addressInput.removeAttribute( 'aria-controls' );
			}
		}

		document.addEventListener( 'DOMContentLoaded', function () {
			// This script would not be enqueued if the feature was not enabled.
			const addressTypes = [ 'billing', 'shipping' ];
			const addressInputs = {};
			const suggestionsContainers = {};
			const suggestionsLists = {};
			let activeSuggestionIndices = {};
			let addressSelectionTimeout;
			const blurHandlers = {};

			/**
			 * Cache address fields for a given type, will re-run when country changes.
			 * @param type
			 * @return {{address_2: HTMLElement, city: HTMLElement, country: HTMLElement, postcode: HTMLElement}}
			 */
			function cacheAddressFields( type ) {
				addressInputs[ type ] = {};
				addressInputs[ type ][ 'address_1' ] = document.getElementById(
					`${ type }_address_1`
				);
				addressInputs[ type ][ 'address_2' ] = document.getElementById(
					`${ type }_address_2`
				);
				addressInputs[ type ][ 'city' ] = document.getElementById(
					`${ type }_city`
				);
				addressInputs[ type ][ 'country' ] = document.getElementById(
					`${ type }_country`
				);
				addressInputs[ type ][ 'postcode' ] = document.getElementById(
					`${ type }_postcode`
				);
				addressInputs[ type ][ 'state' ] = document.getElementById(
					`${ type }_state`
				);
			}

			// Initialize for both billing and shipping.
			addressTypes.forEach( ( type ) => {
				cacheAddressFields( type );
				const addressInput = addressInputs[ type ][ 'address_1' ];
				const countryInput = addressInputs[ type ][ 'country' ];

				if ( addressInput ) {
					// Create suggestions container if it doesn't exist.
					if (
						! document.getElementById(
							`address_suggestions_${ type }`
						)
					) {
						const container = document.createElement( 'div' );
						container.id = `address_suggestions_${ type }`;
						container.className = 'woocommerce-address-suggestions';
						container.style.display = 'none';
						container.setAttribute( 'role', 'region' );
						container.setAttribute( 'aria-live', 'polite' );

						const list = document.createElement( 'ul' );
						list.className = 'suggestions-list';
						list.setAttribute( 'role', 'listbox' );
						list.setAttribute(
							'aria-label',
							'Address suggestions'
						);

						container.appendChild( list );
						addressInput.parentNode.insertBefore(
							container,
							addressInput.nextSibling
						);

						// Add search icon.
						const searchIcon = document.createElement( 'div' );
						searchIcon.className = 'address-search-icon';
						addressInput.parentNode.appendChild( searchIcon );
					}

					suggestionsContainers[ type ] = document.getElementById(
						`address_suggestions_${ type }`
					);
					suggestionsLists[ type ] =
						suggestionsContainers[ type ].querySelector(
							'.suggestions-list'
						);
					activeSuggestionIndices[ type ] = -1;
				}

				// Get country value and set active address provider based on it.
				if ( countryInput ) {
					setActiveProvider( countryInput.value, type );

					/**
					 * Listen for country changes to re-evaluate provider availability.
					 * Handle both regular change events and Select2 events.
					 */
					const handleCountryChange = function () {
						cacheAddressFields( type );
						setActiveProvider( countryInput.value, type );
						if ( addressInputs[ type ][ 'address_1' ] ) {
							hideSuggestions( type );
							// Remove branding element when country changes
							if ( suggestionsContainers[ type ] ) {
								const brandingElement = suggestionsContainers[
									type
								].querySelector(
									'.woocommerce-address-autocomplete-branding'
								);
								if ( brandingElement ) {
									brandingElement.remove();
								}
							}
						}
					};

					countryInput.addEventListener(
						'change',
						handleCountryChange
					);

					// Also listen for Select2 change event if jQuery and Select2 are available.
					if (
						window.jQuery &&
						window.jQuery( countryInput ).select2
					) {
						window
							.jQuery( countryInput )
							.on( 'select2:select', handleCountryChange );
					}
				}
			} );

			/**
			 * Disable browser autofill for address inputs to prevent conflicts with autocomplete.
			 * @param input {HTMLInputElement} The input element to disable autofill for.
			 */
			function disableBrowserAutofill( input ) {
				if ( input.getAttribute( 'autocomplete' ) === 'none' ) {
					return;
				}

				// Store the original autocomplete value before disabling
				const originalAutocomplete =
					input.getAttribute( 'autocomplete' ) || '';
				input.setAttribute(
					'data-original-autocomplete',
					originalAutocomplete
				);

				input.setAttribute( 'autocomplete', 'none' );
				input.setAttribute( 'data-lpignore', 'true' );
				input.setAttribute( 'data-op-ignore', 'true' );
				input.setAttribute( 'data-1p-ignore', 'true' );

				// To prevent 1Password/LastPass and autocomplete clashes, we need to refocus the element.
				// This is achieved by removing and re-adding the element to trigger browser updates.
				const parentElement = input.parentElement;
				if ( parentElement ) {
					// Store the current value to preserve it
					const currentValue = input.value;

					// Mark that we're manipulating the DOM to prevent checkout updates
					input.setAttribute(
						'data-autocomplete-manipulating',
						'true'
					);

					parentElement.appendChild(
						parentElement.removeChild( input )
					);

					// Restore the value if it was lost
					if ( input.value !== currentValue ) {
						input.value = currentValue;
					}

					// Remove the manipulation flag after a brief delay
					setTimeout( function () {
						input.removeAttribute(
							'data-autocomplete-manipulating'
						);
					}, 10 );

					input.focus();
				}
			}

			/**
			 * Enable browser autofill for address input.
			 * @param input {HTMLInputElement} The input element to enable autofill for.
			 * @param shouldFocus {boolean} Whether to focus the input after enabling autofill.
			 */
			function enableBrowserAutofill( input, shouldFocus = true ) {
				if ( input.getAttribute( 'autocomplete' ) !== 'none' ) {
					return;
				}

				// Restore the original autocomplete value
				const originalAutocomplete =
					input.getAttribute( 'data-original-autocomplete' ) ||
					'address-line1';
				input.setAttribute( 'autocomplete', originalAutocomplete );
				input.setAttribute( 'data-lpignore', 'false' );
				input.setAttribute( 'data-op-ignore', 'false' );
				input.setAttribute( 'data-1p-ignore', 'false' );

				// To ensure browser updates and re-enables autofill, we need to refocus the element.
				// This is achieved by removing and re-adding the element to trigger browser updates.
				const parentElement = input.parentElement;
				if ( parentElement ) {
					// Store the current value to preserve it
					const currentValue = input.value;

					// Mark that we're manipulating the DOM to prevent checkout updates
					input.setAttribute(
						'data-autocomplete-manipulating',
						'true'
					);

					parentElement.appendChild(
						parentElement.removeChild( input )
					);

					// Restore the value if it was lost
					if ( input.value !== currentValue ) {
						input.value = currentValue;
					}

					// Remove the manipulation flag after a brief delay. Use two rAFs to ensure layout/assistive tech settle.
					requestAnimationFrame( function () {
						requestAnimationFrame( function () {
							input.removeAttribute(
								'data-autocomplete-manipulating'
							);
						} );
					} );

					if ( shouldFocus ) {
						input.focus();
					}
				}
			}

			/**
			 * Get highlighted label parts based on matches returned by `search` results.
			 * @param label {string} The label to highlight.
			 * @param matches {*[]} Array of match objects with `offset` and `length`.
			 * @return {*[]} Array of nodes with highlighted parts.
			 */
			function getHighlightedLabel( label, matches ) {
				// Sanitize label for display.
				const sanitizedLabel = sanitizeForDisplay( label );
				const parts = [];
				let lastIndex = 0;

				// Validate matches array.
				if ( ! Array.isArray( matches ) ) {
					// If matches is invalid, just return plain text.
					parts.push( document.createTextNode( sanitizedLabel ) );
					return parts;
				}

				// Validate matches.
				const safeMatches = matches.filter(
					( match ) =>
						match &&
						typeof match.offset === 'number' &&
						typeof match.length === 'number' &&
						match.offset >= 0 &&
						match.length > 0 &&
						match.offset + match.length <= sanitizedLabel.length
				);

				safeMatches.forEach( ( match ) => {
					// Add text before match.
					if ( match.offset > lastIndex ) {
						parts.push(
							document.createTextNode(
								sanitizedLabel.slice( lastIndex, match.offset )
							)
						);
					}

					// Add bold matched text.
					const bold = document.createElement( 'strong' );
					bold.textContent = sanitizedLabel.slice(
						match.offset,
						match.offset + match.length
					);
					parts.push( bold );

					lastIndex = match.offset + match.length;
				} );

				// Add remaining text.
				if ( lastIndex < sanitizedLabel.length ) {
					parts.push(
						document.createTextNode(
							sanitizedLabel.slice( lastIndex )
						)
					);
				}

				return parts;
			}

			/**
			 * Sanitize HTML for display by removing any HTML tags.
			 *
			 * @param html
			 * @return {string|string}
			 */
			function sanitizeForDisplay( html ) {
				const doc = document.implementation.createHTMLDocument( '' );
				doc.body.innerHTML = html;
				return doc.body.textContent || '';
			}

			/**
			 * Handle searching and displaying autocomplete results below the address input if the value meets the criteria
			 * of 3 or more characters. No suggestion is initially highlighted.
			 * @param inputValue {string} The value entered into the address input.
			 * @param country {string} The country code to pass to the provider's search method.
			 * @param type {string} The address type ('billing' or 'shipping').
			 * @return {Promise<void>}
			 */
			async function displaySuggestions( inputValue, country, type ) {
				// Sanitize input value.
				const sanitizedInput = sanitizeForDisplay( inputValue );
				if ( sanitizedInput !== inputValue ) {
					console.warn( 'Input was sanitized for security' );
				}

				// Check if the address section exists (shipping may be disabled/hidden)
				if (
					! addressInputs[ type ] ||
					! addressInputs[ type ][ 'address_1' ]
				) {
					return;
				}

				if (
					! suggestionsLists[ type ] ||
					! suggestionsContainers[ type ]
				) {
					return;
				}

				const addressInput = addressInputs[ type ][ 'address_1' ];
				const suggestionsList = suggestionsLists[ type ];
				const suggestionsContainer = suggestionsContainers[ type ];

				// Hide suggestions if input has less than 3 characters
				if ( sanitizedInput.length < 3 ) {
					hideSuggestions( type );
					enableBrowserAutofill( addressInput );
					return;
				}

				// Check if we have an active provider for this address type.
				if ( ! window.wc.addressAutocomplete.activeProvider[ type ] ) {
					hideSuggestions( type );
					enableBrowserAutofill( addressInput );
					return;
				}

				try {
					const filteredSuggestions =
						await window.wc.addressAutocomplete.activeProvider[
							type
						].search( sanitizedInput, country, type );
					// Validate suggestions array.
					if ( ! Array.isArray( filteredSuggestions ) ) {
						console.error(
							'Invalid suggestions response - not an array'
						);
						hideSuggestions( type );
						return;
					}

					// Limit number of suggestions, API may return many results but we should only show the first 5.
					const maxSuggestions = 5;
					const safeSuggestions = filteredSuggestions.slice(
						0,
						maxSuggestions
					);

					if ( safeSuggestions.length === 0 ) {
						hideSuggestions( type );
						return;
					}

					// Clear existing suggestions only when we have new results to show.
					suggestionsList.innerHTML = '';

					safeSuggestions.forEach( ( suggestion, index ) => {
						const li = document.createElement( 'li' );
						li.setAttribute( 'role', 'option' );
						li.setAttribute( 'aria-label', suggestion.label );
						li.id = `suggestion-item-${ type }-${ index }`;
						li.dataset.id = suggestion.id;

						li.textContent = ''; // Clear existing content.
						const labelParts = getHighlightedLabel(
							suggestion.label,
							suggestion.matchedSubstrings || []
						);
						labelParts.forEach( ( part ) =>
							li.appendChild( part )
						);

						li.addEventListener( 'click', async function () {
							// Hide suggestions immediately for better UX.
							hideSuggestions( type );
							await selectAddress( type, this.dataset.id );
							addressInput.focus();
						} );

						li.addEventListener( 'mouseenter', function () {
							setActiveSuggestion( type, index );
						} );

						suggestionsList.appendChild( li );
					} );

					// Update branding HTML content and make sure it's visible.
					// Sanitize the HTML using DOMPurify if available
					if (
						typeof DOMPurify !== 'undefined' &&
						typeof DOMPurify.sanitize === 'function'
					) {
						// Add branding HTML if available from the active provider.
						const activeProvider =
							window.wc.addressAutocomplete.activeProvider[
								type
							];
						if ( activeProvider && activeProvider.id ) {
							const serverProvider =
								window.wc.addressAutocomplete.getServerProvider(
									activeProvider.id
								);
							const brandingHtml =
								serverProvider &&
								typeof serverProvider.branding_html === 'string'
									? serverProvider.branding_html.trim()
									: '';
							if ( brandingHtml ) {
								// Check if branding element already exists.
								let brandingElement =
									suggestionsContainer.querySelector(
										'.woocommerce-address-autocomplete-branding'
									);
								if ( ! brandingElement ) {
									brandingElement =
										document.createElement( 'div' );
									brandingElement.className =
										'woocommerce-address-autocomplete-branding';
									suggestionsContainer.appendChild(
										brandingElement
									);
								}
								// Allow common HTML tags and attributes for branding
								const sanitizedHtml = DOMPurify.sanitize(
									serverProvider.branding_html,
									{
										ALLOWED_TAGS: [
											'img',
											'span',
											'div',
											'a',
											'b',
											'i',
											'em',
											'strong',
											'br',
										],
										ALLOWED_ATTR: [
											'href',
											'target',
											'rel',
											'src',
											'alt',
											'style',
											'class',
											'id',
											'width',
											'height',
										],
										ALLOW_DATA_ATTR: false,
									}
								);
								brandingElement.innerHTML = sanitizedHtml;
								brandingElement.style.display = 'flex';
								brandingElement.removeAttribute(
									'aria-hidden'
								);
							}
						}
					}

					disableBrowserAutofill( addressInput );
					suggestionsContainer.style.display = 'block';
					suggestionsContainer.style.marginTop =
						addressInputs[ type ][ 'address_1' ].offsetHeight +
						'px';
					addressInput.setAttribute( 'aria-expanded', 'true' );
					suggestionsList.id = `address_suggestions_${ type }_list`;
					addressInput.setAttribute(
						'aria-controls',
						`address_suggestions_${ type }_list`
					);
					// Don't auto-highlight first suggestion for better screen reader accessibility
					activeSuggestionIndices[ type ] = -1;

					// Add blur event listener when suggestions are shown
					if ( ! blurHandlers[ type ] ) {
						blurHandlers[ type ] = function () {
							// Use a small delay to allow clicks on suggestions to register
							setTimeout( () => {
								hideSuggestions( type );
								enableBrowserAutofill( addressInput, false );
							}, 200 );
						};
						addressInput.addEventListener(
							'blur',
							blurHandlers[ type ]
						);
					}
				} catch ( error ) {
					console.error( 'Address search error:', error );
					hideSuggestions( type );
					enableBrowserAutofill( addressInput );
				}
			}

			/**
			 * Hide the suggestions container for a given address type.
			 * @param type {string} The address type ('billing' or 'shipping').
			 */
			function hideSuggestions( type ) {
				// Check if the address section exists (shipping may be disabled/hidden)
				if (
					! addressInputs[ type ] ||
					! addressInputs[ type ][ 'address_1' ]
				) {
					return;
				}

				if (
					! suggestionsLists[ type ] ||
					! suggestionsContainers[ type ]
				) {
					return;
				}

				const suggestionsList = suggestionsLists[ type ];
				const suggestionsContainer = suggestionsContainers[ type ];
				const addressInput = addressInputs[ type ][ 'address_1' ];

				suggestionsList.innerHTML = '';

				// Hide branding element but keep it in DOM (will be removed on country change).
				const brandingElement = suggestionsContainer.querySelector(
					'.woocommerce-address-autocomplete-branding'
				);
				if ( brandingElement ) {
					brandingElement.style.display = 'none';
					brandingElement.setAttribute( 'aria-hidden', 'true' );
				}

				suggestionsContainer.style.display = 'none';
				addressInput.setAttribute( 'aria-expanded', 'false' );
				addressInput.removeAttribute( 'aria-activedescendant' );
				addressInput.removeAttribute( 'aria-controls' );
				activeSuggestionIndices[ type ] = -1;

				// Remove blur event listener when suggestions are hidden
				if ( blurHandlers[ type ] ) {
					addressInput.removeEventListener(
						'blur',
						blurHandlers[ type ]
					);
					delete blurHandlers[ type ];
				}
			}

			/**
			 * Helper function to set field value and trigger events.
			 * @param input {HTMLInputElement} The input element to set the value for.
			 * @param value {string} The value to set.
			 */
			const setFieldValue = ( input, value ) => {
				if ( input ) {
					input.value = value;
					input.setAttribute( 'value', value );
					input.dispatchEvent( new Event( 'change' ) );

					// Also trigger Select2 update if it's a Select2 field.
					if (
						window.jQuery &&
						window
							.jQuery( input )
							.hasClass( 'select2-hidden-accessible' )
					) {
						window.jQuery( input ).trigger( 'change' );
					}
				}
			};

			/**
			 * Select an address from the suggestions list and submit it to the provider's `select` method.
			 * @param type {string} The address type ('billing' or 'shipping').
			 * @param addressId {string} The ID of the address to select.
			 * @return {Promise<void>}
			 */
			async function selectAddress( type, addressId ) {
				let addressData;
				try {
					addressData =
						await window.wc.addressAutocomplete.activeProvider[
							type
						].select( addressId );
				} catch ( error ) {
					console.error(
						'Error selecting address from provider',
						window.wc.addressAutocomplete.activeProvider[ type ].id,
						error
					);
					return; // Exit early if address selection fails.
				}

				if (
					typeof addressData !== 'object' ||
					addressData === null ||
					! addressData
				) {
					// Return without setting the address since response was invalid.
					return;
				}

				// Check if addressInputs exists for this type
				if ( ! addressInputs[ type ] ) {
					return;
				}

				if ( addressData.country ) {
					setFieldValue(
						addressInputs[ type ][ 'country' ],
						addressData.country
					);
				}
				if ( addressData.address_1 ) {
					setFieldValue(
						addressInputs[ type ][ 'address_1' ],
						addressData.address_1
					);
				}

				// Note: Passing an invalid ID to clearTimeout() silently does nothing; no exception is thrown.
				if ( addressSelectionTimeout ) {
					clearTimeout( addressSelectionTimeout );
				}

				addressSelectionTimeout = setTimeout( function () {
					// Cache address fields again as they may have updated following the country change.
					cacheAddressFields( type );

					// Check if addressInputs exists for this type after re-caching
					if ( ! addressInputs[ type ] ) {
						return;
					}

					// Set all available fields.
					// Only set fields if the address data property exists and has a value.
					if ( addressData.address_2 ) {
						setFieldValue(
							addressInputs[ type ][ 'address_2' ],
							addressData.address_2
						);
					} else {
						// Clear address_2 if not provided in address data.
						const addr2El = addressInputs[ type ][ 'address_2' ];
						if ( addr2El && addr2El.value ) {
							setFieldValue( addr2El, '' );
						}
					}
					if ( addressData.city ) {
						setFieldValue(
							addressInputs[ type ][ 'city' ],
							addressData.city
						);
					} else {
						// Clear city if not provided in address data.
						const cityEl = addressInputs[ type ][ 'city' ];
						if ( cityEl && cityEl.value ) {
							setFieldValue( cityEl, '' );
						}
					}
					if ( addressData.postcode ) {
						setFieldValue(
							addressInputs[ type ][ 'postcode' ],
							addressData.postcode
						);
					} else {
						// Clear postcode if not provided in address data.
						const postcodeEl = addressInputs[ type ][ 'postcode' ];
						if ( postcodeEl && postcodeEl.value ) {
							setFieldValue( postcodeEl, '' );
						}
					}
					if ( addressData.state ) {
						setFieldValue(
							addressInputs[ type ][ 'state' ],
							addressData.state
						);
					} else {
						// Clear state if not provided in address data.
						const stateEl = addressInputs[ type ][ 'state' ];
						if ( stateEl && stateEl.value ) {
							setFieldValue( stateEl, '' );
						}
					}
				}, 50 );
			}

			/**
			 * Set the active suggestion in the suggestions list, highlights it.
			 * @param type {string} The address type ('billing' or 'shipping').
			 * @param index {number} The index of the suggestion to set as active.
			 */
			function setActiveSuggestion( type, index ) {
				// Check if the address section exists (shipping may be disabled/hidden)
				if (
					! addressInputs[ type ] ||
					! addressInputs[ type ][ 'address_1' ]
				) {
					return;
				}

				if ( ! suggestionsLists[ type ] ) {
					return;
				}

				const suggestionsList = suggestionsLists[ type ];
				const addressInput = addressInputs[ type ][ 'address_1' ];

				const activeLi = suggestionsList.querySelector( 'li.active' );
				if ( activeLi ) {
					activeLi.classList.remove( 'active' );
					activeLi.setAttribute( 'aria-selected', 'false' );
				}

				const newActiveLi = suggestionsList.querySelector(
					`li#suggestion-item-${ type }-${ index }`
				);

				if ( newActiveLi ) {
					newActiveLi.classList.add( 'active' );
					newActiveLi.setAttribute( 'aria-selected', 'true' );
					addressInput.setAttribute(
						'aria-activedescendant',
						newActiveLi.id
					);
					activeSuggestionIndices[ type ] = index;
				}
			}

			// Initialize event handlers for each address type.
			addressTypes.forEach( ( type ) => {
				// Check if addressInputs exists for this type
				if ( ! addressInputs[ type ] ) {
					return;
				}
				const addressInput = addressInputs[ type ][ 'address_1' ];
				const countryInput = addressInputs[ type ][ 'country' ];
				if ( addressInput && countryInput ) {
					addressInput.addEventListener( 'input', function () {
						// Unset any active suggestion when user types
						if ( suggestionsLists[ type ] ) {
							const activeLi =
								suggestionsLists[ type ].querySelector(
									'li.active'
								);
							if ( activeLi ) {
								activeLi.classList.remove( 'active' );
								activeLi.setAttribute(
									'aria-selected',
									'false'
								);
							}
							addressInput.removeAttribute(
								'aria-activedescendant'
							);
							activeSuggestionIndices[ type ] = -1;
						}
						displaySuggestions(
							this.value,
							countryInput.value,
							type
						);
					} );

					addressInput.addEventListener(
						'keydown',
						async function ( e ) {
							// Check if suggestions exist before accessing them
							if (
								! suggestionsLists[ type ] ||
								! suggestionsContainers[ type ]
							) {
								return;
							}

							const items =
								suggestionsLists[ type ].querySelectorAll(
									'li'
								);
							if (
								items.length === 0 ||
								suggestionsContainers[ type ].style.display ===
									'none'
							) {
								return;
							}

							let newIndex = activeSuggestionIndices[ type ];

							if ( e.key === 'ArrowDown' ) {
								e.preventDefault();
								newIndex =
									( activeSuggestionIndices[ type ] + 1 ) %
									items.length;
								setActiveSuggestion( type, newIndex );
							} else if ( e.key === 'ArrowUp' ) {
								e.preventDefault();
								newIndex =
									( activeSuggestionIndices[ type ] -
										1 +
										items.length ) %
									items.length;
								setActiveSuggestion( type, newIndex );
							} else if ( e.key === 'Enter' ) {
								if ( activeSuggestionIndices[ type ] > -1 ) {
									e.preventDefault();
									const selectedItem = suggestionsLists[
										type
									].querySelector(
										`li#suggestion-item-${ type }-${ activeSuggestionIndices[ type ] }`
									);
									if (
										! selectedItem ||
										! selectedItem.dataset ||
										! selectedItem.dataset.id
									) {
										// The selected item was invalid, hide suggestions and re-enable autofill.
										hideSuggestions( type );
										enableBrowserAutofill( addressInput );
										return;
									}
									// Hide suggestions immediately for better UX.
									hideSuggestions( type );
									enableBrowserAutofill( addressInput );
									await selectAddress(
										type,
										selectedItem.dataset.id
									);
									// Return focus to the address input after selection
									addressInput.focus();
								}
							} else if ( e.key === 'Escape' ) {
								hideSuggestions( type );
								enableBrowserAutofill( addressInput );
							}
						}
					);
				}
			} );

			// Hide suggestions when clicking outside.
			document.addEventListener( 'click', function ( event ) {
				addressTypes.forEach( ( type ) => {
					// Check if the address section exists before accessing elements
					if (
						! addressInputs[ type ] ||
						! addressInputs[ type ][ 'address_1' ]
					) {
						return;
					}

					if ( ! suggestionsContainers[ type ] ) {
						return;
					}

					const target = event.target;
					if (
						target !== suggestionsContainers[ type ] &&
						! suggestionsContainers[ type ].contains( target ) &&
						target !== addressInputs[ type ][ 'address_1' ]
					) {
						hideSuggestions( type );
						// Restore native autofill after manual dismissal.
						if (
							addressInputs[ type ] &&
							addressInputs[ type ][ 'address_1' ]
						) {
							enableBrowserAutofill(
								addressInputs[ type ][ 'address_1' ],
								false
							);
						}
					}
				} );
			} );
		} );
	} )();
}
<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Serie Power - G.O.A.T. Paddle Italia - Racchette Pickleball Professionali USA</title>
	<atom:link href="https://www.goatpaddle.it/categoria-prodotto/serie-power/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.goatpaddle.it</link>
	<description>Importatore ufficiale Italia. Racchette in Carbonio T700 e tecnologia USA. Spedizione gratuita in 24h. Non scegliere una racchetta, scegli la tua arma.</description>
	<lastBuildDate>Sun, 26 Jul 2026 16:26:31 +0000</lastBuildDate>
	<language>it-IT</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	
	<item>
		<title>Stealth Power 16mm Paddle</title>
		<link>https://www.goatpaddle.it/prodotto/stealth-power-16mm/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=stealth-power-16mm</link>
					<comments>https://www.goatpaddle.it/prodotto/stealth-power-16mm/#respond</comments>
		
		<dc:creator><![CDATA[wp_2444863]]></dc:creator>
		<pubDate>Tue, 02 Dec 2025 01:13:03 +0000</pubDate>
				<guid isPermaLink="false">https://www.goatpaddle.it/?post_type=product&#038;p=382</guid>

					<description><![CDATA[<p>Potenza senza sforzo e stabilità totale. Lo spessore da 16mm con PowerCoreX+ offre una spinta massiccia da fondo campo e un blocco solido come un muro a rete.</p>
<p>The post <a href="https://www.goatpaddle.it/prodotto/stealth-power-16mm/">Stealth Power 16mm Paddle</a> first appeared on <a href="https://www.goatpaddle.it">G.O.A.T. Paddle Italia - Racchette Pickleball Professionali USA</a>.</p>]]></description>
										<content:encoded><![CDATA[<p data-path-to-node="0">Ecco la traduzione e la conversione delle specifiche nel sistema metrico decimale per la <b>G.O.A.T. Paddle Power Stealth Series</b>.</p>
<hr data-path-to-node="1" />
<h3 data-path-to-node="2"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f410.png" alt="🐐" class="wp-smiley" style="height: 1em; max-height: 1em;" /> G.O.A.T. Paddle Power Stealth Series – 16 mm</h3>
<p data-path-to-node="3"><b>Potenza Senza Pari. Controllo Chirurgico. Costruita per gli Attaccanti.</b></p>
<p data-path-to-node="4">Se vuoi imporre la tua volontà in campo — e non reagire a quella del tuo avversario — la <b>Power Stealth Series 16mm</b> è la racchetta che fa per te. Progettata per <b>giocatori di potenza d&#8217;élite</b> che hanno bisogno di una racchetta capace di <b>spingere attraverso il contatto</b>, resistere sotto pressione e sferrare colpi di chiusura da KO.</p>
<p data-path-to-node="5">Questa è la racchetta che scegli quando il tuo gioco si basa su un <b>attacco al primo colpo</b>, contrattacchi punitivi e un gioco a rete impavido.</p>
<h4 data-path-to-node="6"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f52c.png" alt="🔬" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Progettata dalla G.O.A.T. Paddle Factory per un&#8217;Offensiva Implacabile</h4>
<p data-path-to-node="7">Con un profondo background nel gioco competitivo e nel design delle racchette, la <b>G.O.A.T. Paddle Factory</b> ha creato la Stealth Series per offrire un&#8217;<b>esplosività controllata</b>, permettendo ai migliori giocatori di giocare in modo <b>veloce, impavido e intelligente</b> senza sacrificare il tocco.</p>
<hr data-path-to-node="8" />
<h3 data-path-to-node="9"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f50d.png" alt="🔍" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Caratteristiche Principali:</h3>
<ul data-path-to-node="10">
<li><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f4a5.png" alt="💥" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Strato di Stabilità PowerCoreX+ da 16 mmUn nucleo più spesso ottimizzato per massimizzare il ritorno di energia e la stabilità direzionale. A differenza delle tradizionali racchette a nucleo spesso che risultano &#8220;molli&#8221;, questa mantiene una sensazione solida e reattiva (poppy) con uno smorzamento delle vibrazioni di livello d&#8217;élite.</li>
<li><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f525.png" alt="🔥" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Faccia in Carbonio &#8220;Torched&#8221; PowerSpin<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2122.png" alt="™" class="wp-smiley" style="height: 1em; max-height: 1em;" />Una superficie in carbonio grezzo con trattamento &#8220;stealth&#8221; che morde di più, carica lo spin più in profondità e offre drive e volée più pesanti. Sentirai la palla allungarsi, scattare e ruotare con autorità.</li>
<li><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2696.png" alt="⚖" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Swing Weight Ottimizzato per l&#8217;AttaccoLeggermente bilanciata in testa per generare velocità senza sforzo sui contrattacchi e sui passanti, pur rimanendo abbastanza maneggevole per le battaglie di mani veloci sottorete (kitchen).</li>
<li><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f9e4.png" alt="🧤" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Impugnatura ErgoLock + Granulosità Pro-GradeIl nostro manico esteso da 14 cm (5.5&#8243;) offre la capacità di rovescio a due mani senza compromettere la manovrabilità. Rifinito con un grip ergonomico che si &#8220;blocca&#8221; in mano durante i punti più intensi.</li>
</ul>
<hr data-path-to-node="11" />
<h3 data-path-to-node="12"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f4a3.png" alt="💣" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Costruita per:</h3>
<ul data-path-to-node="13">
<li>
<p data-path-to-node="13,0,0">Giocatori aggressivi di livello 4.0+ e da torneo.</p>
</li>
<li>
<p data-path-to-node="13,1,0">Giocatori con mentalità offensiva che cercano <b>più potenza di chiusura</b>.</p>
</li>
<li>
<p data-path-to-node="13,2,0">Giocatori che vogliono <b>generare velocità senza forzare troppo lo swing</b>.</p>
</li>
<li>
<p data-path-to-node="13,3,0">Coloro che desiderano un&#8217;arma da spin + un telaio di potenza.</p>
</li>
</ul>
<hr data-path-to-node="14" />
<h3 data-path-to-node="15"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f3c6.png" alt="🏆" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Specifiche Tecniche (Sistema Metrico)</h3>
<table style="height: 223px;" width="611" data-path-to-node="16">
<thead>
<tr>
<td><strong>Specifica</strong></td>
<td><strong>Dettaglio</strong></td>
</tr>
</thead>
<tbody>
<tr>
<td><span data-path-to-node="16,1,0,0"><b>Nucleo</b></span></td>
<td><span data-path-to-node="16,1,1,0">Composito Polimerico PowerCoreX+ da 16 mm</span></td>
</tr>
<tr>
<td><span data-path-to-node="16,2,0,0"><b>Faccia</b></span></td>
<td><span data-path-to-node="16,2,1,0">Fibra di Carbonio Grezzo &#8220;Torched&#8221; PowerSpin<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2122.png" alt="™" class="wp-smiley" style="height: 1em; max-height: 1em;" /></span></td>
</tr>
<tr>
<td><span data-path-to-node="16,3,0,0"><b>Peso</b></span></td>
<td><span data-path-to-node="16,3,1,0"><b>~227 – 238 grammi</b> (8.0–8.4 oz)</span></td>
</tr>
<tr>
<td><span data-path-to-node="16,4,0,0"><b>Swing Weight</b></span></td>
<td><span data-path-to-node="16,4,1,0">Medio-alto per generare potenza</span></td>
</tr>
<tr>
<td><span data-path-to-node="16,5,0,0"><b>Lunghezza Impugnatura</b></span></td>
<td><span data-path-to-node="16,5,1,0"><b>14 cm</b> (5.5&#8243;)</span></td>
</tr>
<tr>
<td><span data-path-to-node="16,6,0,0"><b>Lunghezza Totale</b></span></td>
<td><span data-path-to-node="16,6,1,0"><b>41,9 cm</b> (16.5&#8243;)</span></td>
</tr>
<tr>
<td><span data-path-to-node="16,7,0,0"><b>Larghezza</b></span></td>
<td><span data-path-to-node="16,7,1,0"><b>19 cm</b> (7.5&#8243;)</span></td>
</tr>
<tr>
<td><span data-path-to-node="16,8,0,0"><b>Grip</b></span></td>
<td><span data-path-to-node="16,8,1,0">ErgoLock<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2122.png" alt="™" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Performance Cushion (<b>circonferenza 10,8 cm</b>)</span></td>
</tr>
</tbody>
</table>
<p data-path-to-node="17"><p>The post <a href="https://www.goatpaddle.it/prodotto/stealth-power-16mm/">Stealth Power 16mm Paddle</a> first appeared on <a href="https://www.goatpaddle.it">G.O.A.T. Paddle Italia - Racchette Pickleball Professionali USA</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>https://www.goatpaddle.it/prodotto/stealth-power-16mm/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Stealth Power Pure White 14mm Paddle</title>
		<link>https://www.goatpaddle.it/prodotto/stealth-power-pure-white-14mm-paddle-2/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=stealth-power-pure-white-14mm-paddle-2</link>
					<comments>https://www.goatpaddle.it/prodotto/stealth-power-pure-white-14mm-paddle-2/#respond</comments>
		
		<dc:creator><![CDATA[wp_2444863]]></dc:creator>
		<pubDate>Thu, 27 Nov 2025 01:12:28 +0000</pubDate>
				<guid isPermaLink="false">https://www.goatpaddle.it/?post_type=product&#038;p=177</guid>

					<description><![CDATA[<p>Versione Power elegante White</p>
<p>The post <a href="https://www.goatpaddle.it/prodotto/stealth-power-pure-white-14mm-paddle-2/">Stealth Power Pure White 14mm Paddle</a> first appeared on <a href="https://www.goatpaddle.it">G.O.A.T. Paddle Italia - Racchette Pickleball Professionali USA</a>.</p>]]></description>
										<content:encoded><![CDATA[<pre id="tw-target-text" class="tw-data-text tw-text-large tw-ta" dir="ltr" tabindex="-1" role="text" data-placeholder="Traduzione" data-ved="2ahUKEwixoqDzxLKRAxXoiv0HHd30IyEQ3ewLegQIDBAW" aria-label="Testo tradotto: Serie G.O.A.T. Power Stealth – 14 mm
Velocissima. Precisa e letale. Costruita per attaccare. &#x26a1;

La serie Stealth è pensata per i giocatori che colpiscono per primi e chiudono in fretta. Con un nucleo più sottile da 14 mm, una superficie in carbonio grezzo e uno swing weight ottimizzato per la velocità, questa racchetta offre mani rapide, spin potente e un controllo preciso.

&#x2699; PowerCoreX+ da 14 mm per ricariche rapide e feedback

&#x1f300; Superficie in carbonio grezzo PowerSpin&#x2122; per il massimo spin

&#x2696; Swing weight ottimizzato per la velocità per i combattimenti di mano

&#x1f590; Manico esteso per colpi a due mani

Ideale per giocatori di livello 3.5–5.0+ che eccellono in attacco e giocano con determinazione.

Prendi il primo colpo. Gioca come il G.O.A.T. &#x1f410;"><span class="Y2IQFc" lang="it">Serie G.O.A.T. Power Stealth – 14 mm
Velocissima. Precisa e letale. Costruita per attaccare. <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/26a1.png" alt="⚡" class="wp-smiley" style="height: 1em; max-height: 1em;" />

La serie Stealth è pensata per i giocatori che colpiscono per primi e chiudono in fretta. Con un nucleo più sottile da 14 mm, una superficie in carbonio grezzo e uno swing weight ottimizzato per la velocità, questa racchetta offre mani rapide, spin potente e un controllo preciso.

<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2699.png" alt="⚙" class="wp-smiley" style="height: 1em; max-height: 1em;" /> PowerCoreX+ da 14 mm per ricariche rapide e feedback

<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f300.png" alt="🌀" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Superficie in carbonio grezzo PowerSpin<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2122.png" alt="™" class="wp-smiley" style="height: 1em; max-height: 1em;" /> per il massimo spin

<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2696.png" alt="⚖" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Swing weight ottimizzato per la velocità per i combattimenti di mano

<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f590.png" alt="🖐" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Manico esteso per colpi a due mani

Ideale per giocatori di livello 3.5–5.0+ che eccellono in attacco e giocano con determinazione.

Prendi il primo colpo. Gioca come il G.O.A.T. <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f410.png" alt="🐐" class="wp-smiley" style="height: 1em; max-height: 1em;" /></span></pre><p>The post <a href="https://www.goatpaddle.it/prodotto/stealth-power-pure-white-14mm-paddle-2/">Stealth Power Pure White 14mm Paddle</a> first appeared on <a href="https://www.goatpaddle.it">G.O.A.T. Paddle Italia - Racchette Pickleball Professionali USA</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>https://www.goatpaddle.it/prodotto/stealth-power-pure-white-14mm-paddle-2/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Performance 14mm Paddle</title>
		<link>https://www.goatpaddle.it/prodotto/performance-14mm-paddle-3/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=performance-14mm-paddle-3</link>
					<comments>https://www.goatpaddle.it/prodotto/performance-14mm-paddle-3/#respond</comments>
		
		<dc:creator><![CDATA[wp_2444863]]></dc:creator>
		<pubDate>Thu, 27 Nov 2025 01:12:27 +0000</pubDate>
				<guid isPermaLink="false">https://www.goatpaddle.it/?post_type=product&#038;p=176</guid>

					<description><![CDATA[<p>Reattivo, veloce, leggero</p>
<p>The post <a href="https://www.goatpaddle.it/prodotto/performance-14mm-paddle-3/">Performance 14mm Paddle</a> first appeared on <a href="https://www.goatpaddle.it">G.O.A.T. Paddle Italia - Racchette Pickleball Professionali USA</a>.</p>]]></description>
										<content:encoded><![CDATA[<h3 data-path-to-node="2"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f410.png" alt="🐐" class="wp-smiley" style="height: 1em; max-height: 1em;" /> G.O.A.T. Paddle Performance Series – 14mm</h3>
<p data-path-to-node="3"><b>Costruita con Precisione. Approvata dai Giocatori. Comprovata nei Tornei.</b></p>
<p data-path-to-node="4">Quando scendi in campo, non vuoi una racchetta — vuoi un&#8217;<b>arma</b>. La <b>G.O.A.T. Performance Series 14mm</b> è stata progettata per i giocatori che esigono <b>feedback, controllo e versatilità di livello d&#8217;élite</b> in tutte le fasi di gioco.</p>
<h4 data-path-to-node="5"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f9e0.png" alt="🧠" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Progettata dalla G.O.A.T. Paddle Factory. Ottimizzata per la Precisione Competitiva.</h4>
<p data-path-to-node="6">Sviluppata dalla G.O.A.T. Paddle Factory, questa racchetta unisce materiali all&#8217;avanguardia, punti di bilanciamento calibrati a mano e texture superficiali avanzate per dare ai giocatori ciò di cui hanno realmente bisogno: <b>sensibilità senza perdita di potenza di fuoco</b>.</p>
<hr data-path-to-node="7" />
<h3 data-path-to-node="8"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f50d.png" alt="🔍" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Caratteristiche Principali:</h3>
<ul data-path-to-node="9">
<li><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2699.png" alt="⚙" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Sistema di Stabilità PolyCore+ da 14mm
<p>Un nucleo reattivo di medio spessore che trova il perfetto equilibrio tra tocco e stabilità torsionale. Ideale per i giocatori che vivono sulla linea della kitchen (sottorete) ma hanno bisogno di sicurezza sui drive e sui contrattacchi.</li>
<li><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f300.png" alt="🌀" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Faccia in Carbonio Grezzo SpinTech+
<p>La nostra superficie ultra-testurizzata in carbonio 3K &#8220;aggrappa&#8221; la palla più a lungo, permettendoti di sferrare dink in topspin, ritorni in slice e modellare volée aggressive (roll volleys) con autorità.</li>
<li><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2696.png" alt="⚖" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Swing Weight Bilanciato per la Performance
<p>Lo swing weight ottimizzato ti offre mani veloci nelle battaglie ravvicinate — ma abbastanza massa per punire le palle alte (floaters). Una racchetta che si muove con te, non contro di te.</li>
<li><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f590.png" alt="🖐" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Protezione Bordo ProContour + Grip ComfortMax
<p>Ogni dettaglio conta. Un sistema di bordi raffinato riduce i colpi decentrati sui reset. Combinato con il nostro grip che assorbe l&#8217;umidità e il contorno sagomato, ottieni un controllo sicuro sotto pressione.</li>
</ul>
<hr data-path-to-node="10" />
<h3 data-path-to-node="11"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f525.png" alt="🔥" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Perché i Giocatori Scelgono la 14mm:</h3>
<ul data-path-to-node="12">
<li>
<p data-path-to-node="12,0,0"><b>Tocco migliorato</b> per reset e drop.</p>
</li>
<li>
<p data-path-to-node="12,1,0"><b>Feedback rigido e reattivo</b> per un controllo di alto livello.</p>
</li>
<li>
<p data-path-to-node="12,2,0"><b>Generazione di spin a livello Tour</b> senza sacrificare la stabilità.</p>
</li>
<li>
<p data-path-to-node="12,3,0">Ideale per <b>giocatori da torneo</b>, amatori avanzati e chiunque stia passando al livello successivo.</p>
</li>
</ul>
<hr data-path-to-node="13" />
<h3 data-path-to-node="14"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f3c6.png" alt="🏆" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Specifiche Tecniche (Sistema Metrico)</h3>
<table data-path-to-node="15">
<thead>
<tr>
<td><strong>Specifica</strong></td>
<td><strong>Dettaglio</strong></td>
</tr>
</thead>
<tbody>
<tr>
<td><span data-path-to-node="15,1,0,0"><b>Nucleo</b></span></td>
<td><span data-path-to-node="15,1,1,0">Nido d&#8217;ape PolyCore+ da 14mm + Tecnologia Thermoform</span></td>
</tr>
<tr>
<td><span data-path-to-node="15,2,0,0"><b>Superficie</b></span></td>
<td><span data-path-to-node="15,2,1,0">Fibra di Carbonio Grezzo 3K SpinTech+</span></td>
</tr>
<tr>
<td><span data-path-to-node="15,3,0,0"><b>Peso</b></span></td>
<td><span data-path-to-node="15,3,1,0"><b>~224 – 232 grammi</b> (7.9–8.2 oz)</span></td>
</tr>
<tr>
<td><span data-path-to-node="15,4,0,0"><b>Swing Weight</b></span></td>
<td><span data-path-to-node="15,4,1,0">Ottimizzato per velocità + inerzia (plow-through)</span></td>
</tr>
<tr>
<td><span data-path-to-node="15,5,0,0"><b>Lunghezza Impugnatura</b></span></td>
<td><span data-path-to-node="15,5,1,0"><b>14 cm</b> (5.5&#8243;)</span></td>
</tr>
<tr>
<td><span data-path-to-node="15,6,0,0"><b>Lunghezza Totale</b></span></td>
<td><span data-path-to-node="15,6,1,0"><b>41,9 cm</b> (16.5&#8243;)</span></td>
</tr>
<tr>
<td><span data-path-to-node="15,7,0,0"><b>Larghezza</b></span></td>
<td><span data-path-to-node="15,7,1,0"><b>19 cm</b> (7.5&#8243;)</span></td>
</tr>
<tr>
<td><span data-path-to-node="15,8,0,0"><b>Grip</b></span></td>
<td><span data-path-to-node="15,8,1,0">ComfortMax<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2122.png" alt="™" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Mid-cushion (<b>circonferenza 10,8 cm</b>)</span></td>
</tr>
</tbody>
</table><p>The post <a href="https://www.goatpaddle.it/prodotto/performance-14mm-paddle-3/">Performance 14mm Paddle</a> first appeared on <a href="https://www.goatpaddle.it">G.O.A.T. Paddle Italia - Racchette Pickleball Professionali USA</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>https://www.goatpaddle.it/prodotto/performance-14mm-paddle-3/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Stealth Power 14mm Hybrid Neon Green Paddle</title>
		<link>https://www.goatpaddle.it/prodotto/stealth-power-14mm-hybrid-neon-green-paddle/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=stealth-power-14mm-hybrid-neon-green-paddle</link>
					<comments>https://www.goatpaddle.it/prodotto/stealth-power-14mm-hybrid-neon-green-paddle/#respond</comments>
		
		<dc:creator><![CDATA[wp_2444863]]></dc:creator>
		<pubDate>Thu, 27 Nov 2025 00:57:44 +0000</pubDate>
				<guid isPermaLink="false">https://www.goatpaddle.it/?post_type=product&#038;p=170</guid>

					<description><![CDATA[<p>Paddle aggressivo Neon</p>
<p>The post <a href="https://www.goatpaddle.it/prodotto/stealth-power-14mm-hybrid-neon-green-paddle/">Stealth Power 14mm Hybrid Neon Green Paddle</a> first appeared on <a href="https://www.goatpaddle.it">G.O.A.T. Paddle Italia - Racchette Pickleball Professionali USA</a>.</p>]]></description>
										<content:encoded><![CDATA[<pre id="tw-target-text" class="tw-data-text tw-text-large tw-ta" dir="ltr" tabindex="-1" role="text" data-placeholder="Traduzione" data-ved="2ahUKEwixoqDzxLKRAxXoiv0HHd30IyEQ3ewLegQIDBAW" aria-label="Testo tradotto: &#x1f410; G.O.A.T. Paddle Power Stealth Series – 14 mm Velocissima. Incredibilmente precisa. Costruita per dominare. La Power Stealth da 14 mm è la racchetta per i giocatori che vogliono iniziare per primi, concludere velocemente e dominare il ritmo di gioco. Realizzata con materiali d'élite, una sensazione di precisione e uno swing weight perfettamente regolato, questa racchetta è pensata per l'attaccante di precisione, il giocatore che vede angoli che gli altri non colgono e punisce l'esitazione."><span class="Y2IQFc" lang="it"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f410.png" alt="🐐" class="wp-smiley" style="height: 1em; max-height: 1em;" /> G.O.A.T. Paddle Power Stealth Series – 14 mm
Velocissima. Incredibilmente precisa. Costruita per dominare.

La Power Stealth da 14 mm è la racchetta per i giocatori che vogliono iniziare per primi, concludere velocemente e dominare il ritmo di gioco. Realizzata con materiali d'élite, una sensazione di precisione e uno swing weight perfettamente regolato, questa racchetta è pensata per l'attaccante di precisione, il giocatore che vede angoli che gli altri non colgono e punisce l'esitazione.</span></pre><p>The post <a href="https://www.goatpaddle.it/prodotto/stealth-power-14mm-hybrid-neon-green-paddle/">Stealth Power 14mm Hybrid Neon Green Paddle</a> first appeared on <a href="https://www.goatpaddle.it">G.O.A.T. Paddle Italia - Racchette Pickleball Professionali USA</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>https://www.goatpaddle.it/prodotto/stealth-power-14mm-hybrid-neon-green-paddle/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
