To track down the best tattoo artists in New York, we spoke with dozens of tattooed New Yorkers with great taste on where they go for expertly executed body art. Whether you have one tattoo or 15, these artists can bring your vision to life, from Japanese tebori tattoos and fine-art reproductions to fake freckles and permanent eyebrows.
The moment between placing a tattoo with a stencil and actually putting needle to skin is crucial — it’s the last chance to move, resize, or change a design. Not all artists handle it equally. “Some try and rush you or won’t resize it,” says therapist Maggie Dunleavy. Not Angel Garcia, owner of Hot Rod Taffy in East Williamsburg. When Dunleavy went in for a pair of pansies, they say, they wavered on both the placement and size at the last minute. “Angel was willing to make a new stencil for the pansy an eighth of an inch smaller to see if I liked it at that size better,” Dunleavy says. “Then I asked them to move it to multiple different spots on my body. They never got irritated. Their tattoo bedside manner is unmatched.” Carson Jordan, a poet, says Garcia’s flexibility carries over to the design itself — they are willing to take on any project, no matter how far out of their comfort zone. “I recently had this idea for a portrait of Fiona Apple in full armor on the subway. When I told Angel about it, instead of hesitating or saying, ‘Oh, I don’t do portraits normally,’ they just said, ‘Yes, I can do that.’ There was no question.” (From $200.)
For Photorealism
Atelier Eva, 29 Havemeyer St.; 59 Grand St., Williamsburg; ateliereva.com
Ross Chestnut knew exactly what tattoo he wanted: a highly detailed reproduction of the Maxfield Parrish painting Stars. When he showed up at Bang Bang, a downtown shop run by celebrity tattooer Keith “Bang Bang” McCurdy, with this concept in hand, “the dude at the front desk was like, ‘You don’t want to do that with the person you have an appointment with. You want Eva.’” Eva turned out to be Eva Karabudak, a multidisciplinary artist from Turkey with a background in oil painting and figure drawing. Chestnut switched his appointment, and Karabudak reproduced Parrish’s stargazing woman on his arm “like a perfect HD image,” he says. “Since then, I’ve been tattooed by her in five different places, all fine-art re-creations,” including another of Parrish’s paintings and Paul de Longpré’s Study of Roses. (From $700.) “I don’t trust anyone else to do that kind of work and actually make it perfect, so I followed her from shop to shop until she finally opened her own studio.” Each of the 26 artists who work at Atelier Eva, which debuted in Williamsburg in 2020, have their own specialty, including Dani, who does florals with the finest lines; and Hailey Kim, who is capable of rendering flowers and food as small as half an inch across in exact detail.
.
Ask a Tattoo Artist
Lauren Aigner-Westervelt,artist at Atelier Eva in Williamsburg
Illustration: Pete Gamlen
Before someone gets a tattoo, how should they prepare? Before booking, check out artists on Instagram. Find a style you like. Think about sizing and placement. And then before your appointment, eat, drink water, make sure your skin is moisturized. If your skin is dry, it won’t hold ink or heal as well — it’s going to get irritated faster.
Do any tattoo requests make you cringe? Matching names, or the name of a partner. Especially if they’re really young, I tell them to hold off.
Have you ever covered up a regretted tattoo? I covered up a grammar error once — it was lines of text, and the first line ended in the, and the next line started with the, so it said “the the.” You really have to make sure your artist is double-checking everything. Typos do happen.
Are any areas of the body especially challenging to work on? A lot of finger tattoos don’t work out. Tattoos on the top of the finger can last, but the inner parts of the fingers and hands don’t always heal as we expect. The skin is so thin that it’s kind of just luck if you can get ink to stay and not fade. Feet have a similar issue. Ribs can be tricky because breathing makes people move. Also, people are ticklish there and don’t realize that until they get tattooed and then they’re moving.
What’s the most painful spot to get tattooed? The ribs. Back of the knees. Feet are also very painful. Anywhere where the bone is close under the skin. And the stomach because it’s so sensitive. A couple friends recently got stomach tattoos, and they said it was the worst, like being cut open.
Grad student Kiwi Keaton first spotted the Bed-Stuy Tattooing Co. on @inkthediaspora, an account that highlights Black tattoo parlors. Impressed with the artist’s style and deft ability to tattoo flowers on dark skin, they decided to go into the shop for a consultation. At the front desk, they were given a book of owner Kevin Wong’s “flash” (pre-drawn) tattoos. (From $100.) Inside, they found traditional American patterns revamped to include a wide range of cultures and bodies, like the bust of a queen with epicanthic folds and a cherub with an Afro. “Look at their noses, look at their eyes, look at the way their breasts are shaped,” Keaton remembers. “Even their tummies — I was like, Yo, that’s my tummy! ” Keaton now has more than five tattoos from Wong — the dragon they originally came in for, a tableau of three Black women linking hands on their thigh, and a Black geisha. “I know she’s a Black geisha,” Keaton says. “She’s got my nose.”
Traditional tebori tattoos are not easily accessible in New York — few artists work in the “hand-carved” traditional Japanese style, which relies on a slender bamboo or metal tool with tiny needles at the tip instead of a machine. Teacher Dashi He had seen teboris in person and thought they turned out brighter and more vivid than machine tattoos but didn’t think it would be possible to get one without flying 14 hours — until He stumbled upon Takashi Matsuba’s work on Instagram. He immediately made an appointment with Matsuba, who works from the back of Bushwick shop Behind the Circle. (From $100.) The process is different from your average tattoo experience in the U.S.: Clients sit on tatami mats, while Matsuba kneels beside them, drawing the design freehand directly onto the body (instead of using a stencil) before he begins tattooing. “I read a lot on the internet about tebori hurting more than machine tattoos, but that was not the case with Takashi,” says He, who decided to get a blue-tailed gray hakutaku, a mythical Japanese creature, at Matsuba’s suggestion. It turned out exactly as he’d hoped — “The color and contrast is so vivid. Better than anything I could have gotten if I’d gone with even the most skilled machine artist.”
Recently, Rob Crowe, the general manager of the Wren on the Bowery, finished work around seven and, over the course of a beer, decided he wanted to get a tattoo. So he went around the corner to Fun City, a carnivalesque space on St. Marks that’s been open since the 1970s (21 years before tattooing was legal in New York). “I popped my head in, said, ‘You busy?’ ” Ryan, a Fun City artist who had tattooed Crowe before (a six-inch scorpion on his wrist, also done on a walk-in), told him to come back in 20 minutes. “Forty minutes later, I had a new tattoo” — a thumbs-up on his wrist, executed in delicate, fine-line detail. (From $150.) “He’s a talented guy, really laser-focused and meticulous,” Crowe says. Crowe, who has been tattooed at the shop 14 times, mentioned the staff’s ability to balance speed with above-average skill. “I’ve never once seen them turn anyone away or tell them to come back another day,” he says. “And still they’re collectively doing some of the best letterwork I’ve ever seen.”
Julia Hayes has a niche tattoo specialty: finely drawn and precisely rendered animals, which tend to look torn from the pages of an old bestiary. “They almost feel like science plates,” says Myllicent Felder, a teacher with four of Hayes’s tattoos. Hayes has handled most every species, including a barred owl holding a mouse in its talons, an arm-length rendering of a white-tailed deer, a trio of cows done just above an ankle, and an intricately spotted frog. For Felder, she recently tattooed a bat below one knee and a bat’s skeleton below the other. “I told her the scientific name of the specific bat I wanted, Myotis lucifugus,” says Felder. “She researched it to make sure she was putting the bones in the exact right place.” (From $250.)
For Highly-Realistic Nipples
Sauler Institute of Tattooing,120 E. 56th St., Ste. 910; saulerinstitute.com
After Antonia underwent a double mastectomy in 2018, she was feeling “a little bit like Frankenstein.” So her plastic surgeon recommended she go see Mandy Sauler, whose Sauler Institute of Tattooing specializes in post-op tattoos: areola and nipple tattooing for people who have gone through mastectomies and top surgeries (bilateral areola for $950, unilateral for $750), highly realistic-looking bellybuttons and fingernails, and post-phalloplasty pigmentation. When Antonia went in for her breast-tattooing consultation, she felt immediately at ease with Sauler. “She knows exactly what she’s doing, but she still included me in making decisions, asking, ‘How do you want it to feel, how do you want it to look?’ I wanted something really natural, as realistic as possible, so she experimented with a few different paint colors first to figure out what would go best with my skin tone.” The result was exactly what she was looking for: “She’s an artist and gave it dimension and depth. To look at it is to think it’s actually there, even though it’s not,” Antonia says.
Early in the pandemic, staring at herself on Zoom for hours each day, Yelena Gitlit Nesbit, a book publicist, decided she was finally going to do something about her eyebrows. “I had done some overplucking in the ’90s, and it never fully grew back,” she says. After relying on brow pencils for years, Nesbit decided to go for microblading, a tattooing process that involves inserting pigment under the skin. She chose Laurel on recommendation from a similarly sparse-browed friend, who’d recently had the procedure there — and came out with full-but-really-real-looking brows. She conveyed to owner Clare Vuillemot that she wanted her brows to look “natural and organic to my shape, revived to their previous glory.” Which is exactly what she got, one hour and a half later. “People cannot believe that these are not my natural eyebrows,” Nesbit says. “Claire is a magician, period, full stop. My whole family is really sick of me talking about how much I love them.” Laurel also offers lip blushing (where lips are tinted a more vibrant pink), permanent eyeliner, and tattooed freckles. Thea Gould, a cook, recently got “a smattering” of the latter on her cheeks, nose, forehead, and chin, all carefully placed to best flatter her face by Vuillemot. “They look so natural and so cute,” says Gould.
When editor Aaron Prieto went to get tattooed by Emma Jackson for the first time, he didn’t have anything specific in mind. He’d seen Anderson’s work and knew she had a particular ability to create tattoos that look brushstroked onto the body. “I was just going to pick something from her book, but we wound up chatting for like an hour,” he says, about Prieto’s life growing up in the city, the memory of a friend climbing a chain-link fence. Based on their conversation, Anderson came up with a red and black piece that combined elements of that fence, gothic lettering, and a melting candle. Though he would have never designed it himself, “it was perfect,” Prieto says. For his second tattoo with Anderson, he sent her some inspiration in advance — a handful of stills from his favorite movies. “I sent her some pictures from Barton Fink and Days of Heaven and was like, ‘Can you come up with a design inspired by that?’” She could: a vibrant blue chair illuminated by a red light. “Her ideas are always just better and more interesting than anything I could have ever imagined or come up with,” says Prieto.
By submitting your email, you agree to our
Terms and Privacy Notice
and to receive email correspondence from us. This site is protected by reCAPTCHA and the Google
Privacy Policy and
Terms of Service apply.
or
Already a subscriber?
What is your email?
This email will be used to sign into all New York sites. By submitting your email, you agree to our Terms and Privacy Policy and to receive email correspondence from us.
Password must be at least 8 characters and contain:
Lower case letters (a-z)
Upper case letters (A-Z)
Numbers (0-9)
Special Characters (!@#$%^&*)
This password will be used to sign into all New York sites. By submitting your email, you agree to our Terms and Privacy Policy and to receive email correspondence from us.
You’re in!
As part of your account, you’ll receive occasional updates and offers from New York, which you can opt out of anytime.
or
Already a subscriber?
What is your email?
This email will be used to sign into all New York sites. By submitting your email, you agree to our Terms and Privacy Policy and to receive email correspondence from us.
Password must be at least 8 characters and contain:
Lower case letters (a-z)
Upper case letters (A-Z)
Numbers (0-9)
Special Characters (!@#$%^&*)
This password will be used to sign into all New York sites. By submitting your email, you agree to our Terms and Privacy Policy and to receive email correspondence from us.
You’re in!
As part of your account, you’ll receive occasional updates and offers from New York, which you can opt out of anytime.
Already a subscriber?
Already a subscriber?
`;
// integrate Sub(x) scripts and elements
if (hostname !== 'subs.nymag.com') { // do not integrate on this subdomain
document.head.appendChild(trackingScript);
document.body.insertAdjacentHTML('beforeend', subXAnimationElements);
}
There was an error processing the request. Please try again later."}).catch(e=>console.error("Error verifying email: ",e)))(r.querySelector(".content"),o.bannerCTAVerification)})):(l.remove(),s.remove()),o.dismissable||n.remove(),o.useAlertIcon||a.remove(),r.classList.add("show"),n.addEventListener("click",()=>{u(),r.classList.remove("show")})}else r.remove()}});
}, {"1":1,"6":6,"12":12,"35":35,"40":40}];
window.modules["global-nav.client"] = [function(require,module,exports){"use strict";const dom=require(4),auth=require(12),signInButton=dom.find(".user-signin"),signOutButton=dom.find(".user-signout"),globalNav=dom.find('[class^="global-nav"]'),body=dom.find("body"),dropdownItems=dom.findAll(".dropdown-wrap"),gtm=require(1),appendLandingPageParams=require(135),pageUri=require(124).getPageUri(),subscriptionPromoLinks=dom.findAll(".persist-params"),searchString=window.location.search||"";function closeDropdowns(e){let n=globalNav.querySelectorAll(".dropdown.open");dropdownItems.forEach(function(t){let o=t.querySelector(".dropdown");!n||t.contains(e.target)&&27!==e.keyCode||o.classList.remove("open")})}function gtmSendReport(e,n,t){let o={eventCategory:"ecommerce",eventAction:"componentClick",brand:e,dimension23:"global-nav",list:pageUri,pageZone:"header",variant:"nav-link"};"global-nav-link"===t&&(o.eventLabel=n.href),gtm.reportNow(o)}function updateElementTargetUrlsIfQueryStrings(e){if(searchString){const n=new URLSearchParams(searchString);let t=e.href;if(t.includes("?")){const o=t.split("?"),i=new URLSearchParams(o[1]);for(let e of n.entries())i.set(e[0],e[1]);t=`${o[0]}?${i.toString()}`,e.href=t}else e.href=`${t}?${n.toString()}`}}function init(e){const n=e.querySelectorAll(".to-landing-page");window.addEventListener("auth:init",()=>{signInButton.addEventListener("click",function(e){e.preventDefault(),auth.showEmbeddedLoginFlow("top navigation")}),signOutButton.addEventListener("click",function(e){e.preventDefault(),gtmSendReport("Sign Out",e.target,"user-info-link"),auth.logout()}),auth.isAuthenticated()&&e.classList.add("signed-in"),auth.isSubscriber()&&e.classList.add("subscribed"),e.querySelectorAll(".user-link").forEach(e=>{e.classList.add("active")}),subscriptionPromoLinks.forEach(e=>{updateElementTargetUrlsIfQueryStrings(e)}),appendLandingPageParams(n)})}dropdownItems.forEach(function(e){e.addEventListener("click",function(){e.querySelector(".dropdown").classList.toggle("open")})}),body.addEventListener("click",closeDropdowns),document.addEventListener("keydown",closeDropdowns),globalNav.addEventListener("click",function(e){let n=e.target;n.classList.contains("global-nav-track")&>mSendReport(n.text,n,"global-nav-link")}),module.exports=init;
}, {"1":1,"4":4,"12":12,"124":124,"135":135}];
window.modules["aaa-module-mounting.legacy"] = [function(require,module,exports){"use strict";const _pickBy=require(221),_each=require(406),Fingerprint2=require(408),DS=require(407),Eventify=require(246);function registerGlobals(){window.DS=DS,window.Eventify=Eventify,window.Fingerprint2=Fingerprint2,DS.value("Eventify",Eventify),DS.value("Fingerprint2",Fingerprint2),DS.value("$document",window.document),DS.value("$window",window)}function mountDollarSliceComponents(){DS.service("components",["$document","$module",function(e,n){var o=_pickBy(n.definitions,e=>e.providerStrategy===n.providers.controller),r=Object.keys(o);function t(e){return o=>{try{n.get(e,o)}catch(e){logMountError(o,e)}}}_each(r,n=>{var o=e.querySelectorAll('[data-uri*="/_components/'+n+'/"]'),r=e.querySelectorAll('[data-uri$="/_components/'+n+'"]');_each(o,t(n)),_each(r,t(n))}),this.components=r}]),DS.get("components")}function logMountError(e,n){const o=e.outerHTML.slice(0,e.outerHTML.indexOf(e.innerHTML));console.error("Error attaching controller to "+o,n)}registerGlobals(),"loading"===document.readyState?document.addEventListener("DOMContentLoaded",()=>{mountDollarSliceComponents()}):mountDollarSliceComponents();
}, {"221":221,"246":246,"406":406,"407":407,"408":408}];
window.modules["ads.legacy"] = [function(require,module,exports){"use strict";const _map=require(118),_forEach=require(107),_isString=require(268),_intersectionWith=require(409),_isEqual=require(274),_each=require(406),_debounce=require(182),_sortBy=require(205),page=require(124),visit=require(114);DS.service("adService",["Eventify","$cid","$document","$window",function(e,t,a,i){var o,n,s,r,d,c,u,l,g={},p=this,h=[],f=visit.getQueryParamsObject(["utm_campaign"]),m=document.querySelector('script[data-type="ad-a9"]'),b=[],w=!1,v=[],y=document.querySelector('script[data-name="ad-doubleverify"]');document.querySelector('script[data-name="concert-ads"]')||(i.NYM={},i.NYM.analytics={},i.NYM.analytics.adStartTime=i.performance.now(),i.googletag=i.googletag||{},i.googletag.cmd=i.googletag.cmd||[],u=i.googletag,(m||y)&&(i.googletag.cmd=i.googletag.cmd||[],i.googletag.cmd.push(function(){i.googletag.pubads().disableInitialLoad()})),m&&(l=i.setInterval(function(){void 0!==window.apstag&&void 0!==window.apstag.timeout&&(i.clearInterval(l),window.apstag.cleared=!0,l=null)},10),setTimeout(function(){l&&(i.clearInterval(l),i.googletag.pubads().refresh(),window.apstag||console.log("MESSAGE: Timeout for A9 load exceeded, aborting"))},500)),y&&(b.push(new Promise(function(e){w?e():v.push(e)})),c=i.setTimeout(T,2500)),o=function(e){var t,a,o=e.data,n=[];return o.loaded?e:(o.loaded=!0,t=null,(t=o.sizes?u.defineSlot(o.name,o.sizes,o.id).addService(u.pubads()):u.defineOutOfPageSlot(o.name,o.id).addService(u.pubads())).setTargeting("adid",o.id),f.hasOwnProperty("utm_campaign")&&t.setTargeting("utmcamp",f.utm_campaign),a=p.getAdCount(o.label),t.setTargeting("label",o.label+"_"+o.site+"-"+a),u.display(o.id),u.pubads().addEventListener("slotOnload",function(){i.NYM.analytics.firstAdLoadTime||(i.NYM.analytics.firstAdLoadTime=i.performance.now(),i.NYM.analytics.firstAdLoadLabel=e.data.label)}),n=_(o),Promise.all(b).then(function(){n?window.apstag&&window.apstag.cleared?window.apstag.fetchBids({slots:[n],timeout:window.apstag.timeout},function(){u.cmd.push(function(){window.apstag.setDisplayBids(),u.pubads().refresh([t],{changeCorrelator:!1})})}):y&&u.pubads().refresh([t],{changeCorrelator:!1}):u.pubads().refresh([t],{changeCorrelator:!1})}),e.slot=t,e)},n=function(e){var a,i,o,n=t(),s=e.getAttribute("data-name"),r=e.getAttribute("data-sizes"),d=e.getAttribute("data-label"),c=e.getAttribute("data-site");n=e.id,r&&r.length?(r=r.split(","),a=[],_map(r,function(e){e=e.split("x"),i=parseInt(e[0]),o=parseInt(e[1]),a.push([i,o])})):(e.classList.add("oop"),a=!1),this.data={id:n,name:s,sizes:a,loaded:!1,label:d,site:c},g[n]=this},r=function(e){u.cmd.push(function(){var t=o(e);g[e.data.id]=t})},s=function(e){var t=[];e.slot?(t=_(e))&&window.apstag&&window.apstag.cleared&&window.apstag.fetchBids({slots:[t],timeout:window.apstag.timeout},function(){u.cmd.push(function(){window.apstag.setDisplayBids(),u.pubads().refresh([e.slot],{changeCorrelator:!1})})}):e&&r(e)},u.cmd.push(function(){var e,t,o,n=page.getMeta("article:tag"),s=page.getMeta("author"),r=i.location.href,d=(e=a.head.querySelector(".head-gtm"),t=a.body.querySelector(".gtm"),e&&"top"===e.getAttribute("data-gtm")?"gtmtop":t&&"bottom"===t.getAttribute("data-gtm")?"gtmbottom":"");o=[],_forEach([n,s,d],function(e){_forEach(e.split(","),function(e){(e=e.trim().toLowerCase().replace(/\s/g,"-").replace(/\'|\’/g,"")).length&&o.push(e)})}),u.pubads().setTargeting("kw",o),u.pubads().setTargeting("entry_group",o),r=r.slice(r.lastIndexOf("/")+1),u.pubads().setTargeting("pn",r),u.companionAds().setRefreshUnfilledSlots(!0),u.pubads().enableAsyncRendering(),u.enableServices()}),this.load=r,this.create=function(e){return new n(e)},this.refresh=function(e){var t;_isString(e)?(t=this.getById(e),s(t)):s(e)},this.remove=function(e){var t=e.data.id;a.getElementById(t).innerHTML=""},this.getAdCount=function(e){var t,a=0,i=Object.keys(g);return _each(i,function(i){(t=g[i]).data.loaded&&t.data.label===e&&a++}),a},this.getById=function(e){return g[e]},d=_debounce(function(){var e={TopLeaderboard:1,RightColTopMPU:2,outOfPage:99,"homepageTakeover/TopLeaderboard":1},t=_sortBy(h,function(t){return e[t.data.label]||10});_forEach(t,function(e){return e.data.sizes?r(e):i.setTimeout(function(){r(e)},2e3)}),y&&window.PQ.cmd.push(()=>{try{window.PQ.loadSignals(["ids","bsc","vlp"],T)}catch(e){T(),console.error(`There has been an error loading Double Verify signals: ${e}`)}}),h=[]},10),this.addToPageLoadQueue=function(e){h.push(e),d()});function _(e){var t,a=e.sizes;return a=_intersectionWith(a,[[970,250],[970,90],[728,90],[300,600],[300,250],[320,100],[320,50]],_isEqual),e.sizes&&e.sizes.length&&(t={slotID:e.id,sizes:a,slotName:e.label}),t}function T(){i.clearTimeout(c),w=!0,_forEach(v,function(e){e()})}}]);
}, {"107":107,"114":114,"118":118,"124":124,"182":182,"205":205,"268":268,"274":274,"406":406,"409":409}];
window.modules["cid.legacy"] = [function(require,module,exports){"use strict";DS.service("$cid",function(){var r=Math.floor(100*Math.random());return function(){return"cid-"+ ++r}});
}, {}];
window.modules["client.legacy"] = [function(require,module,exports){"use strict";require("cid.legacy"),require("ads.legacy"),require("facebook.legacy"),require("aaa-module-mounting.legacy");
}, {"cid.legacy":"cid.legacy","ads.legacy":"ads.legacy","facebook.legacy":"facebook.legacy","aaa-module-mounting.legacy":"aaa-module-mounting.legacy"}];
window.modules["facebook.legacy"] = [function(require,module,exports){"use strict";DS.service("facebook",[function(){this.fb=function(i){window.FB&&window.FB[i].apply(this,Array.prototype.slice.call(arguments,1))}}]);
}, {}];
require=(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o typeof key === 'string' && key.match(/\.legacy$/)).forEach(key => window.require(key));
}
function tryToMount(fn, el, name) {
try {
fn(el); // init the controller
} catch (e) {
const elementTag = el.outerHTML.slice(0, el.outerHTML.indexOf(el.innerHTML));
console.error(`Error initializing controller for "${name}" on "${elementTag}"`, e);
}
}
/**
* mount client.js component controllers
*/
function mountComponentModules() {
Object.keys(window.modules).filter(key => typeof key === 'string' && key.match(/\.client$/)).forEach(key => {
let controllerFn = window.require(key);
if (typeof controllerFn === 'function') {
const name = key.replace('.client', ''),
instancesSelector = `[data-uri*="_components/${name}/"]`,
defaultSelector = `[data-uri$="_components${name}"]`,
instances = document.querySelectorAll(instancesSelector),
defaults = document.querySelectorAll(defaultSelector);
for (let el of instances) {
tryToMount(controllerFn, el, name);
}
for (let el of defaults) {
tryToMount(controllerFn, el, name);
}
}
});
}
// Make sure that a `window.process.env.NODE_ENV` is available in the client for any dependencies,
// services, or components that could require it
// note: the `` value is swapped for the actual environment variable in /lib/cmd/compile/scripts.js
window.process = window.process || {};
window.process.env = window.process.env || {};
if (!window.process.env.NODE_ENV) {
window.process.env.NODE_ENV = '';
}
// note: legacy controllers that require legacy services (e.g. dollar-slice) must
// wait for DOMContentLoaded to initialize themselves, as the files themselves must be mounted first
mountLegacyServices();
mountComponentModules();
// ]]