Best Of 2023
- 2023
- 2022
- 2021
- 2020
- 2019
- 2018
- 2017
- 2016
- 2015
- 2014
- 2013
- 2012
- 2011
- 2008
- 2007
- 2006
- 2005
- Staff Picks
- Readers' Picks
- Music
- Music
- Best Of Tampa
- 2023
- Staff Pick
True to both the haircut and the fish, Mullet’s embodies the “business in the front, party in the back” ethos with excellent seafood (as well as much-praised wings) served on the front porch and in the big, colorful backyard tiki bar, where you can chow down at picnic tables and listen to bands on the outdoor stage. A great addition to South St. Pete. mulletsfishcamp.com
- Best Of Tampa
- 2023
- Staff Pick
The beef is tender and toothsome. The carrots are huge and sweet. The noodles are silky. The onions and scallions add crunch. But it’s the broth that’s the star of this Vietnamese comfort dish, which is really more of a soup than a stew. The broth is nectar of the gods—a sublime mixture of slightly sweet, slightly salty and other elusive flavor elements that can’t be adequately described in words. You must partake to understand. Alesia—a fixture on the west end of St. Pete’s Central Avenue—offers seating indoors as well as outside in a charming courtyard. alesiarestaurant.com
- Best Of Tampa
- 2023
- Readers' Pick
Winner: Bacon Street Diner
Finalists: Ubuntu Food Truck, Pete's Bagels and General Store
- Best Of Tampa
- 2023
- Readers' Pick
Winner: Yummy House China Bistro
Finalists:Hawkers Asian Street Food, Lemon Grass Thai Kitchen
- Best Of Tampa
- 2023
- Staff Pick
We all know of the ubiquity of “fish and chips.” Beer-battered haddock is a staple with British chips, which are usually thick and hand cut similar to U.S. steak fries. In fact, there are relatively few authentic British pubs across the Bay area. What I have discovered is that Jack’s London Grill—in St. Pete, and celebrating its 10-year anniversary—is an oasis which easily delivers the food that Brits crave. Take that, Covent Garden. Add comfort food favorites, the Scotch egg and the sausage roll to the scrumptious entrees shepherds pie, bangers (sausages) ‘n’ mash with rich Guinness gravy or their delicious variety of hand made meat pies. jackslondongrill.com
- Best Of Tampa
- 2023
- Staff Pick
St. Pete’s Par Bar is the best breakup bar, putters down. First of all, there are two exits. This also means there are two entrances so that you can be sure the green is clear of your ex putt-putt partner when you show up not to play putt-putt but to watch the Lightning. And when you’re alone watching the Lightning, you can take comfort in the fact that all the bartenders are familiar with your situation. These Par Bar-tenders call it “the curse” actually, because so many of the League Night couples have ended up in the bunker. Which means, you’re in good company. And on finals night, you can watch comedians heckle your ex which will be totally awkward especially when despite the heckling, your ex wins the whole damn thing. parbarstp.com
- Best Of Tampa
- 2023
- Readers' Pick
Winner: Tampa Bay Brewing Co.
Finalists: Coppertail Brewing Co., Magnanimous Brewing
'Object.defineProperties(this, {'items': { get: function() { return jQuery(this.itemContainerSelector).find(this.itemSelector)}},'currentItem': {get: function() {var foundItem = nullvar foundItemInView = nullthis.items.each(function () {var currentInView = elementInView(jQuery(this), scrollTopOffset, 0)if (currentInView) {// An in view item is already located extra logicif (foundItemInView && foundItemInView.inView) {// The entire previously found item is visible - it winsif (foundItemInView.topInView && foundItemInView.bottomInView) return// The previously found item covers the visible area - it winsif (foundItemInView.middleCoversView) return// The previously found item has more surface area - it winsif (foundItemInView.percentVisable > currentInView.percentOfViewHeight) return}foundItem = jQuery(this)foundItemInView = currentInView}})return foundItem}},'currentItemIndex': {get: function() {var currentElement = this.currentItem.closest('[bestof-index]')if(currentElement) {return parseInt(currentElement.attr('bestof-index'))}return null}},'currentItemId': {get: function() {var currentElement = this.currentItem.closest('[bestof-id]')if(currentElement) {return currentElement.attr('bestof-id')}return null}}})var bestOfInstance = thisvar scrollTopOffset = window.innerHeight > this.smallMenuBreakPoint ? 110 : 140var originUrl = window.location.hrefthis.scrollToIndex = function (index) {var bestOfItem = this.items.filter('[bestof-index="' + index + '"]')if (bestOfItem.length) { var topOffset = bestOfItem.offset().top - scrollTopOffset// window.scrollTo({ top: topOffset, behavior: 'smooth' })window.scrollTo({ top: topOffset, behavior: 'auto' })}else {this.fetchMore(index, function () {bestOfInstance.scrollToIndex(index)})}}this.fetchMore = function (startIndex, callback) {var currentItemOnFetch = this.currentItemvar url = window.location.origin + window.location.pathnamevar params = {ajaxComponent: componentId,action: 'grabMore',startIndex: startIndex,startingItem: jQuery('[bestof-starting-item]').attr('bestof-starting-item'),}var keywords = currentItemOnFetch.attr('bestof-keywords')if (keywords) {params.keywords = keywords}var featureValue = currentItemOnFetch.attr('bestof-feature')if (featureValue) {params.feature = featureValue}jQuery.ajax({url: url,type: 'GET',data: params,dataType: 'json',beforeSend: function () { console.log('Fetching results') },success: function (data) {console.log('success', data.results, data.results.length, data.error, data)if (data) {if (data.error) {console.log(data.error)}else if (data.results) {console.log('bestOfInstance.items', bestOfInstance.items)for (var i = 0; i < data.results.length; i++) {var resultItem = jQuery(data.results[i])var resultItemIndex = parseInt(resultItem.attr('bestof-index'))var resultAlreadyInserted = bestOfInstance.items.filter('[bestof-index="' + resultItemIndex + '"]').length > 0console.log('result', resultItemIndex)var previousItem = nullvar previousItemIndex = 0if (!resultAlreadyInserted) {bestOfInstance.items.each(function () {if (resultAlreadyInserted) returnvar currentItem = jQuery(this)var currentItemIndex = parseInt(currentItem.attr('bestof-index'))if (resultItemIndex === currentItemIndex ) {resultAlreadyInserted = truereturn}else if (resultItemIndex > previousItemIndex && resultItemIndex < currentItemIndex) {var topOffsetBeforeInsert = currentItemOnFetch.get(0).getBoundingClientRect().topresultItem.insertBefore(currentItem)resultAlreadyInserted = truevar adjustedTopPosition = currentItemOnFetch.offset().top - topOffsetBeforeInsertwindow.scrollTo({ top: adjustedTopPosition, behavior: 'auto' })}previousItem = currentItempreviousItemIndex = currentItemIndex})if (!resultAlreadyInserted) {var topOffsetBeforeInsert = currentItemOnFetch.get(0).getBoundingClientRect().topresultItem.insertAfter(bestOfInstance.items.last())resultAlreadyInserted = truevar adjustedTopPosition = currentItemOnFetch.offset().top - topOffsetBeforeInsertwindow.scrollTo({ top: adjustedTopPosition, behavior: 'auto' })}}}}else { console.log('How did we get here?') }}else { console.log('No result or error returned from content request.') }},complete: function () { bestOfInstance.items = jQuery(bestOfInstance.itemSelector) // Update items resultjQuery(bestOfInstance.itemContainerSelector + ' div[uk-spinner]').remove()if (typeof callback === 'function') { callback() }},error: function (error) { console.log(error) }})}var lazyLoadTimeout = nullvar lazyLoadSurroundingItems = function (index) {if (bestOfInstance.lazyLoadMoreResults) {// Give lazyLoad a chance to finish before submiting more requestsvar lazyLoadTimeout = setTimeout(function () {var prevIndex = Math.max(index - 1, 1)var prevPrevIndex = Math.max(index - 2, 1)var nextIndex = index + 1var nextNextIndex = index + 2var prevIndexLoaded = bestOfInstance.items.filter('[bestof-index="' + prevIndex + '"]').length > 0var prevPrevIndexLoaded = bestOfInstance.items.filter('[bestof-index="' + prevPrevIndex + '"]').length > 0var nextIndexLoaded = bestOfInstance.items.filter('[bestof-index="' + nextIndex + '"]').length > 0var nextNextIndexLoaded = bestOfInstance.items.filter('[bestof-index="' + nextNextIndex + '"]').length > 0if(!prevIndexLoaded) {jQuery(bestOfInstance.itemContainerSelector + ' div[uk-spinner]').remove()// jQuery(bestOfInstance.itemContainerSelector).prepend(bestOfInstance.spinnerHTML)bestOfInstance.fetchMore(Math.max(prevIndex - 9, 1))}else if(!prevPrevIndexLoaded) {jQuery(bestOfInstance.itemContainerSelector + ' div[uk-spinner]').remove()// jQuery(bestOfInstance.itemContainerSelector).prepend(bestOfInstance.spinnerHTML)bestOfInstance.fetchMore(Math.max(prevPrevIndex - 9, 1))}if(!nextIndexLoaded) {jQuery(bestOfInstance.itemContainerSelector + ' div[uk-spinner]').remove()jQuery(bestOfInstance.itemContainerSelector).append(bestOfInstance.spinnerHTML)bestOfInstance.fetchMore(nextIndex)}else if(!nextNextIndexLoaded) {jQuery(bestOfInstance.itemContainerSelector + ' div[uk-spinner]').remove()jQuery(bestOfInstance.itemContainerSelector).append(bestOfInstance.spinnerHTML)bestOfInstance.fetchMore(nextNextIndex)}}, 500)}}var lastIndex = bestOfInstance.currentItemIndexjQuery(window).on('scroll resize', function () {// Give lazyLoad a chance to finish before submiting more requests// var lazyLoadTimeout = setTimeout(function () {// }, 200)var currentIndex = bestOfInstance.currentItemIndexif(currentIndex !== lastIndex) {lastIndex = currentIndexlazyLoadSurroundingItems(currentIndex)console.log(`BestOf Item index: ${currentIndex}`)fireEvent('foundation:bestof:itemchange')}})this.initialized = falsethis.init = function () {if (this.initialized === true) return// Prevent the browser from trying to scroll to the last scroll position before reloadif (history.scrollRestoration) {history.scrollRestoration = 'manual'}var startIndex = this.items.first().attr('bestof-index')var oid = window.location.pathname.match(/\d+$/)if (oid) {var grabIndex = parseInt(this.items.closest('[bestof-id="' + oid[0] + '"]').attr('bestof-index'))if (!isNaN(grabIndex)) {var startIndex = grabIndex}}if (startIndex > 1) {this.scrollToIndex(startIndex)}if(jQuery(this.itemContainerSelector + '[single-listing]').length === 0) {this.lazyLoadMoreResults = true}this.initialized = truelazyLoadSurroundingItems(startIndex)}return this}var BestOfItems = new BestOfItemsObj()// Timeout to prevent fast jogging from item to itemvar itemChangeTimeout = nulljQuery(document).on('foundation:bestof:itemchange', function () {itemChangeTimeout = setTimeout(function () {updateMetaDataFromElement(BestOfItems.currentItem)// Google track pageviewif (typeof ga === 'function') {console.log("foundation:bestof:itemchange event", "sending pageview navigation to:", window.location.href);ga('set', 'location', window.location.href)for (let i = 1; i <= 3; i++) {let currentDimension = jQuery(BestOfItems.currentItem).attr('ga-dimension'+i)if (typeof currentDimension === 'string') {ga('set', 'dimension' + i, currentDimension)}else {ga('set', 'dimension' + i, '') }}ga('send', 'pageview')}}, 200)if (typeof (Foundation.Ad.slots['_LeaderboardHeader-1']) === 'object') {Foundation.Ad.refresh('_LeaderboardHeader-1')}if (typeof (Foundation.Ad.slots['_Footer-1']) === 'object') {Foundation.Ad.showFooter('_Footer-1');}})// Try to init immediatelyBestOfItems.init()// On document loadedjQuery(function () {BestOfItems.init()})})();