91³Ô¹ÏÍø

Watch CBS News

A reimagined holiday classic dazzles at the Brooklyn Ballet

This holiday season, the is bringing  home with a dazzling twist that weaves the borough's culture and traditions into the beloved classic.

Inside the company's rehearsal studio, the familiar chords of Tchaikovsky ring out as dancers glide across the floor. Among them is Tristan Grannum, the ballet's Director of Community Outreach.

"I adore classical ballet, but classical ballet is not the only style that there is in the world," Grannum said. "So yes, there are 'The Nutcracker' productions that are mainly based around classical ballet. But why not see something that has evolved the art form?"

Grannum's path to the stage began in a public school in Bushwick, where a childhood field trip ignited his passion for dance.

"That was like the moment where I was like, 'I can do this on stage? I can dance for people? I can get paid to do this?'" he said. "So that was kind of like the eye-opening experience."

This year, Grannum reprises his role as the Snow King, performing alongside Miku Kawamura, a dancer he has admired for nearly a decade.

"No where else can have this, only Brooklyn," Kawamura said of the rich culture that inspires the modern take on "The Nutcracker."

Touted as the city's most diverse "Nutcracker," the production features cultural influences spanning Native American hoop dance, Middle Eastern belly dance, and Brooklyn-inspired street styles.

"We use that beautiful music, but we also make some space in it for the flamenco castanets, for an accordion, for the Ukrainian Hopak," said artistic director and founder Lynn Parkerson.

Under Parkerson's direction, the Brooklyn Ballet has created what she calls a bridge between tradition and innovation.

"This 'Brooklyn Nutcracker' is a new way to do something while keeping the tradition of ballet beautifully presented and alive and welcoming others into that world," she said.

Grannum's story has come full circle, from a young boy inspired by dancers onstage to a performer dedicated to inspiring the next generation. Through the company's Elevate outreach program, he works with students who may not otherwise have access to ballet.

"I am trying to give back to the students that never necessarily had access for arts education, because at the end of the day, we want to see ballet become more diverse," Grannum said.

The program offers classroom instruction, subsidized performance tickets and scholarships aimed at expanding opportunities for young dancers.

"Public school outreach programs changed my life. That's why I'm doing what I'm doing," Parkerson said. "It's just a bit of exposure to a real dancer and and just falling in love with the form."

"The Brooklyn Nutcracker" runs at the Theater at City Tech from Dec. 6–14, offering audiences a holiday performance infused with the rich tapestry of Brooklyn.

Have a story idea or tip in Brooklyn? Email Hannah by CLICKING HERE.

View CBS News In
CBS News App Open
Chrome Safari Continue
const link = doc.createElement('link'); link.rel = 'stylesheet'; link.href = '/fly/fly/bundles/cbsnewscontent/css/cmp-banner.min.css?v=fd53910ecf4604072044ab7c46d9b028'; doc.head.appendChild(link); doc.body.innerHTML = CONSENT_MESSAGE; } else { el.insertAdjacentHTML('afterend', CONSENT_MESSAGE); } }); } function hidePrivacyMessage() { // Remove from the main document document.querySelectorAll(`.${CONSENT_MESSAGE_CLASS}`).forEach(el => el.remove()); // Remove from inside any iframes document.querySelectorAll('iframe').forEach(iframe => { const doc = iframe.contentDocument || iframe.contentWindow.document; doc.querySelectorAll(`.${CONSENT_MESSAGE_CLASS}`).forEach(el => el.remove()); }); } function activateGatedScripts() { // Handle both new format (cmp-gated-script) and old OneTrust/Ketch format (optanon-category-4) const gatedScripts = Array.from(document.querySelectorAll('script.cmp-gated-script, script.optanon-category-4')); // Activate scripts sequentially with a small delay to avoid timing issues let delay = 0; gatedScripts.forEach(function(placeholder, index) { setTimeout(function() { // Skip if already processed if (placeholder.hasAttribute('data-cmp-processed')) { return; } placeholder.setAttribute('data-cmp-processed', 'true'); const newScript = document.createElement('script'); newScript.type = 'text/javascript'; // Try new format first (data-cmp-src), then fall back to old format (data-src) const src = placeholder.getAttribute('data-cmp-src') || placeholder.getAttribute('data-src'); if (src) { newScript.src = src; } else if (placeholder.textContent) { // Inline script - just copy the content newScript.textContent = placeholder.textContent; } // Handle new format attributes (data-cmp-attrs) - for both inline and external scripts const attrs = placeholder.getAttribute('data-cmp-attrs'); if (attrs) { const tempDiv = document.createElement('div'); tempDiv.innerHTML = '
<\/div>'; const tempAttrs = tempDiv.firstChild.attributes; for (let i = 0; i < tempAttrs.length; i++) { // For external scripts, allow defer/async. For inline scripts, skip them (not valid) if (src || (tempAttrs[i].name !== 'async' && tempAttrs[i].name !== 'defer')) { newScript.setAttribute(tempAttrs[i].name, tempAttrs[i].value); } } } // Copy other attributes from old OneTrust format for (let i = 0; i < placeholder.attributes.length; i++) { const attr = placeholder.attributes[i]; // Skip attributes we've already handled or don't want to copy if (!['class', 'data-src', 'data-type', 'data-cmp-src', 'data-cmp-attrs', 'data-cmp-processed', 'type', 'async', 'defer', 'src'].includes(attr.name)) { newScript.setAttribute(attr.name, attr.value); } } placeholder.parentNode.replaceChild(newScript, placeholder); // If external script, manually trigger window.onload handlers after it loads // This handles widgets that use window.onload for initialization if (src) { newScript.addEventListener('load', function() { // If page already loaded and script set a new onload handler, trigger it if (document.readyState === 'complete' && window.onload) { const originalOnload = window.onload; window.onload = null; // Clear temporarily to prevent loops originalOnload(); // Execute the handler } }); } }, delay); delay += 500; // 500ms delay between each script to allow full loading }); } cbsoptanon.onScriptsReady(function(cmp) { cmp.ot.targetingAllowed(function(allowed) { if (!allowed) { showPrivacyMessage(); } else { activateGatedScripts(); } }); cmp.ot.awaitInitialConsent(function(consent_model) { cmp.ot.addOnConsentChangedHandler(function() { cmp.ot.targetingAllowed(function(allowed) { if (allowed) { hidePrivacyMessage(); activateGatedScripts(); } else { showPrivacyMessage(); } }); }); }); });