Img Stage Line

21 Apr 19
This Week In 4n6

Thanks to Lodrina for her work on the Threat Hunting and Malware Analysis sections. As always, Thanks to those who give a little back for their support! FORENSIC ANALYSIS Andrea Fortuna at ‘So Long, and Thanks for All the Fish’ demonstrates how to extract useful data from the pagefile using strings, grep, and YARA How […]

19 Apr 19
Archy news nety

In Minneapolis the training in warrior style for police officers is out. And hopefully the move will lead to safer communities for citizens and the police officers who serve them. During his State of the City speech last week, Mayor Jacob Frey said that officers may no longer participate in that type of training, even […]

17 Apr 19

By Paul Sperry Although Republicans were pleased that Special Counsel Robert Mueller said he was unable to establish a criminal conspiracy between the Trump campaign and Russia, they fear his practice of distorting facts during his investigation will color his final report, which Attorney General William Barr is expected to release to Congress in redacted […]

17 Apr 19
Archy news nety

Ole Gunnar Solskjaer spent most of his time as a Manchester United manager, returning to the club's triumph with Alex Ferguson. Now it's time to focus on the future – and he knows it. United's 4-0 aggregate defeat by Barcelona in the quarter-finals of the Champions League highlighted how the biggest club in England remained […]

15 Apr 19
Archy news nety

PORTLAND, Oregon – The NWSL opens this seventh season this weekend with some lingering questions about its health, but also the encouraging possibility of a "bump" in the World Cup. The National Women & # 39; s Soccer League is already longer than the other previous professional women's competitions in the United States. With the […]

14 Apr 19
Flourishing as an NHS Doctor

— by Raisa Khan Hi all, I have been successful in getting Core Surgical Training this year and have received quite a few messages from people looking towards building a surgical career seeking guidance. So, I decided to share my experience here. Hope you find it useful. My Background: I graduated from Pakistan (2016) Completed […]

12 Apr 19
Archy news nety

Petroleum production in North Dakota fell by 5% in February, the largest monthly decline in more than two years, as the state's oil fields collapsed in cold weather, according to a report released Friday. "It was a fairly significant decline," said Lynn Helms, director of North Dakota's Department of Mineral Resources, during a conference call […]

12 Apr 19
FutureLab3D

Formlabs Introduces Form 3   The Form 3L and the Form 3 made their debut on AMUG (image Formlabs) The Form 3 and Form 3L emerged this week, introducing new capabilities to Formlabs’ popular SLA offerings. Low Force Stereolithography (LFS) makes its debut with these new machines, set to enhance reliability and print quality. The […]

11 Apr 19
The Santa Barbara Independent
.top-nav { display: none; } .main-navigation-wrapper { display: none; } .ad-border-bottom { display: none; } .padding-top {padding: 0px;} #site-navigation { display: none; } .main-nav-bar { display: none; } .entry-meta { display: none; } .entry-title { display: none; } .subtitle { display: none; } .posts-query { display: none; } .cell.small-12 {padding: 7px 0px;} .sd-content { display: none; } .social-media .sd-content { display: none; } .entry .entry-content>*.alignfull img, .entry .wp-block-cgb-block-tk-slider-block>div img { margin: 0px 0; width: auto; } #wpadminbar { display: none; } .indy-nav { width: 100%; padding: 0px 0px; margin: 0px auto; background-color: #000; height: 70px; z-index: 50; position: fixed; top:0; } .indy-nav .button-wrap { position: absolute; top: 23px; left: 25px; margin: auto; } .indy-nav .logo-wrap { margin: 0px auto; padding: 8px 0px 0px 0px; text-align: center; } .indy-nav .social-media { position: absolute; right: 0; top: 0; padding: 10px 0px 0px 0px; } .indy-nav .logo-wrap img { padding: 0px; height: 60px; text-align: center; } button.menu-toggle, button.search-toggle { font-size: 1.6em; } button { color: #fff; } .social-media .sharedaddy .sd-social-icon .sd-content ul li { margin: 0px 0px 0px 25px; float: left; display: block; } .social-media .sharedaddy .sd-social-icon .sd-content ul li a.sd-button:before { color: #fff; font-size: 30px; display: block; } .post-template-long-post-format .sharedaddy, .multimedia-template-long-post-format .sharedaddy { position: static; } .logged-in .flyout-nav { top: 0; } @media screen and (max-width: 800px) { .indy-nav .social-media { display: none; } .indy-nav .logo-wrap { text-align: right; padding-right: 25px; } .entry .entry-content>*.alignfull, .entry .wp-block-cgb-block-tk-slider-block>div { width: 100hw; } } #heading { width: 100%; padding: 70px 0px 0px 0px; background-color: #1fc8db; background-image: linear-gradient(155deg, #af4a5f 10%, #af4a5f 28%, #da9243 75%); } #heading .ae-logo-wrap { text-align: center; color: #fff; } #heading .ae-logo-wrap h1 { font-family: eloquent-jf-pro, serif; font-weight: 400; font-style: normal; font-size: 100px; line-height: 100px; padding: 100px 0px 40px 0px; } #heading .ae-logo-wrap h2 { font-family: rift, sans-serif; font-weight: 400; font-style: normal; font-size: 50px; padding: 30px 0px 0px 0px; } #heading p { margin: -48px 0px 0px 0px; } #heading h6 { display: none; } #heading h7 { display: none; } #heading h3 { width: 100%; background-color: #000; color: #fff; margin: 0px 0px 0px 0px; padding: 5px 0px; text-align: center; font-family: rift,sans-serif; font-weight: 400; font-style: normal; } #heading h3 strong{ letter-spacing: 2px; } @media screen and (max-width: 1600px) { #heading p { display:none; } #heading h6 { display: block; margin: -48px 0px 0px 0px; } #heading .ae-logo-wrap h1 { font-size: 80px; line-height: 100px; padding: 50px 0px 40px 0px; } #heading .ae-logo-wrap h2 { font-size: 30px; padding: 45px 0px 0px 0px; } } @media screen and (max-width: 800px) { #heading .ae-logo-wrap h1 { font-size: 50px; line-height: 60px; padding: 40px 0px 60px 0px; } #heading .ae-logo-wrap h2 { font-size: 25px; padding: 25px 0px 0px 0px; } #heading h6 { display: none; } #heading h7 { display: block; margin: -48px 0px 0px 0px; } } Share this:Click to share on Facebook (Opens in new window)Click to share on Twitter (Opens in new window)Click to email this to a friend (Opens in new window)Click to print (Opens in new window) UCSB Arts & Lectures ____________________________________                                                                                                                         ____________________________________ _____________________                                                                   _____________________ ______                                                                   ______ Redefining Cultural Impact Story By Charles Donelan | Photos courtesy UCSB Arts & Lectures unless otherwise noted Annie Lebovitz Dizzy Gillespie Gloria Steinem Alvin Ailey | By Andrew Eccles Malala Yousafzai | By Antonio Olmos Bishop Tutu David Byrne Margaret Atwood Bill T. Jones | By Stephanie Berger .slider-wrap { width: 100%; z-index: 0; background-color: #000; } .slider { height: auto; padding: 0px; margin: 0px; background-color: transparent; } .slick-slide { padding: 0px 9px 0px 0px; } .slick-slide img { display: block; height: 400px; width: auto; } .slick-dots { height: 0; overflow: visible; } .single .type-post-single .slider-wrap figcaption { position: static; color: #fff; background-color: #000; padding: 0px; margin: 5px 0px 0px 5px; } @media screen and (max-width: 800px) { .slick-slide img { display: block; height: 260px; width: auto; } } $(document).on('ready', function() { $(".variable").slick({ dots: true, infinite: true, variableWidth: true }); }); .main-content { padding: 50px 0px; width: 80%; margin: 0px auto; } .main-content h2 { max-width: 800px; margin: 0px auto; font-family: eloquent-jf-pro, serif; font-weight: 400; font-style: normal; font-size: 45px; padding: 40px 0px 5px 0px; } .main-content p { max-width: 800px; margin: 25px auto; font-size: 18px; } .main-content p:first-child:first-letter { color: #000; float: left; font-family: Georgia; font-size: 75px; line-height: 60px; padding: 4px 8px 3px 0px; } @media screen and (max-width: 800px) { .main-content h2 { font-size: 33px; padding: 30px 0px 20px 0px; text-align: center; } .main-content p { width: 100%; } } Thanks to the tireless and innovative programs of UCSB Arts & Lectures, Thursday, April 4, was ukulele day in Santa Barbara. In the morning, YouTube star and ukulele virtuoso Jake Shimabukuro got things started at the Granada in front of more than 1,000 schoolchildren. The students attended the free concert as part of Arts Adventures, a collaboration between Arts & Lectures and the University’s Office of Education Partnerships that links field trips to The Granada Theatre with the idea of possibly going to college. Later that same day, Shimabukuro performed at the Isla Vista School and on campus at Storke Plaza. If you haven’t yet seen him, know that this young man from Hawai‘i does things with his instrument that have earned him the accolade that he’s “the Jimi Hendrix of the ukulele.” What counts as high praise for his musicianship does little, however, to convey the wholesome qualities he conveys as an individual. Largely self-taught, endearingly humble, and devoted to bringing a message of hope to audiences of all ages, Shimabukuro is the antithesis of negative millennial stereotypes. For a whirlwind introduction to what he can do, check out the video that launched him, a cover of George Harrison’s “While My Guitar Gently Weeps” that’s been viewed more than 16 million times.  That night, the seven members of the Ukulele Orchestra of Great Britain entertained a packed Campbell Hall with even more clever ukulele arrangements and their signature brand of dry humor. The audience for this performance was mostly older, and it’s possible that some of those present could remember when singer and comedian George Formby established the ukulele as a staple of popular culture in the U.K. Yet to understand why this little instrument rated an entire day of such varied activities, it’s necessary to go beyond what we know about ukulele players, past and present. .pull-out { width: 100%; height: auto; position: relative; margin: 50px auto; border-top: 15px #000 solid; } .pull-out h2 { font-family: eloquent-jf-pro, serif; font-size: 30px; font-weight: 400; margin: 50px 20px 10px 20px; padding: 0px; text-align: center; } .pull-out h3 { font-size: 16px; margin: 0px; padding: 0px; text-align: center; font-weight: 400; font-family: rift, sans-serif; } .pull-out em { text-decoration: none; color: #af4a5f; font-size: 40px; padding: 0px 6px 0px 0px; line-height: 0px; } “For some of our patrons, this program is why they moved here.”— Celesta Billeci, Miller McCune executive director of UCSB Arts & Lectures What made ukulele day such a success was the degree to which it fit the mission of Arts & Lectures, which is to provide access to great events for all ages, all the time, and all over town. In one day, this coordinated series of concerts entertained a diverse audience that numbered in the thousands. Through the Arts Adventures program, ukulele day brought young people to campus who might not otherwise ever visit UCSB, or consider going to college as an option for themselves. For those of us who are past school age, the evening performance by the Ukulele Orchestra of Great Britain was a fun and fresh experience, representative of the unexpected offerings that Arts & Lectures provides that are often unavailable anywhere else on the Central Coast. From morning until night, the bright and funky sound of the ukulele, expertly played, acted as a clarion call to community.  For 60 years, UCSB Arts & Lectures has been bringing performances, lectures, and films to Santa Barbara that challenge us to become not just the most beautiful place to live in America but also one of the world’s most thoughtful and compassionate societies. Building on our city’s longstanding tradition of providing an alternative approach to living on the West Coast, Arts & Lectures dares to espouse a vision of life here that’s equally oriented toward wholeness and virtuosity. Sara Miller McCune, whose support has meant so much to the program over the past two decades, summarized its significance this way: “First and foremost is the sheer number and variety of exciting events Arts & Lectures brings to us. Second, it is virtually impossible to imagine any other community of our size ​— ​which is relatively modest ​— ​having as much high-quality exposure to the good and the great as we do. It is on a par with what you would normally expect if you lived in a major metropolitan area like London or New York. Third, it bridges the town-gown divide.” Echoing this estimation, but from the perspective of the program itself, Celesta Billeci, the Miller McCune executive director of UCSB Arts & Lectures, told me that “for some of our patrons, this program is why they moved here.”  Expanding in Stages The Arts & Lectures story begins in the late 1950s, when UCSB first took possession of its current campus location on the bluffs in Goleta. Funding for cultural events at this outpost of University of California, President Clark Kerr’s “multiversity,” flowed freely, even if it did so in what are by today’s standards relatively small amounts. One of the first speakers to visit the campus under the direction of the new program was author Aldous Huxley, who gave a series of lectures that included some of his speculations on the human potential of psychedelic substances. When author Michael Pollan arrives on Tuesday, April 23, to discuss his latest book, How to Change Your Mind, the conversation that Huxley began will have come through a full 60-year circle. Although Arts & Lectures began as a faculty-run operation, the professors soon realized that the job required a full-time director, and, as a result, they appointed Margaret “Peg” Armstrong as the first head of A&L in 1959. The market for cultural events across the western United States at the time was in its infancy, but Santa Barbara, with its longstanding tradition of commitment to the arts, proved to be a particularly fertile spot for the kind of programming that Armstrong championed. With the completion of Campbell Hall in 1962, the program took off, and by 1967, Armstrong, along with the directors of similar programs at the other universities and cities across the west, had formed an organization, the Alliance of Western Colleges for Cultural Presentations, that would prove to be a crucial step in the development of a network that allowed performers from all over the world to afford regular tours in California and beyond. In 1974, the group changed its name to the Western Alliance of Arts Administrators, and in 1998, they shortened it to the Western Arts Alliance.  A&L Executive Director Celesta Billeci (pictured center) brought to the job a passion for developing lasting relationships with top artists. She and the rest of the A&L team have effectively ushered in a golden age for the program that has lasted nearly 20 years. For Armstrong’s successor, an arts administrator from the East Coast named Jan Oetinger, the economic environment beginning in 1980 was quite different. The days of total reliance on university support were over, but the impact of federal programs like the National Endowment for the Arts (NEA) was reaching a peak. Another important organization arose in 1985 to streamline booking procedures and to generate efficiencies of scale for artists touring the West Coast, this one called California Presenters. Arts & Lectures plays a key role in the organization to this day; A&L Programming Manager Heather Jeno Silva is its current president.  Following cutbacks to federal funding of the arts in the late 1990s and early 2000s, yet another era came to Arts & Lectures, and with it the dynamic leadership of the woman who heads the organization today, Celesta Billeci. With experience at UCLA’s Center for the Art of Performance and a passion for developing lasting relationships with top artists, Billeci came to town understanding that she would need a strong team of patrons from within the Santa Barbara community to realize her ambitious plans. This strategy of seeking sustained support from leading philanthropists ushered in a golden age for the program that has lasted nearly 20 years, and that looks set to continue for many decades to come.  Roughly speaking then, there have been three eras in the evolution of Arts & Lectures: an initial period of relative plenty driven by California state investment in higher education, a middle period of increasing dependence on national sources of funding like the NEA and the National Endowment for the Humanities, and the current period of merging with the greater Santa Barbara community. Behind these three phases lies a single crucial factor, which is the westward pivot in American national culture. From Gustavo Dudamel at Disney Hall to Beyoncé and hologram Tupac at Coachella, the country’s cultural center of gravity has shifted away from the East Coast and New York to the West Coast and the cities of California. And it’s not just that people all over the world are paying more attention to live performances that originate here; there’s also a migration, in part driven by technology, of people who can choose to live anywhere and who, as a result, choose to live here.  Pursuing Greatness, Measuring Impact This year, the total number of attendees for the current Arts & Lectures season will surpass 100,000. In the 2017-18 season, which was hampered by fire and mudslides, the number was already very close: 99,771. That’s more than the entire population of the city of Santa Barbara. But push a little further into the statistical record as presented in the organization’s “Impact Report” for the 2017-18 season, and you’ll find a lot more happening below the surface of A&L’s public programming. In the 21st-century, community-driven phase of its development, A&L has adapted to the new funding environment by absorbing the lessons learned in Santa Barbara’s thriving nonprofit sector. Alongside partners like Sara Miller McCune and Lynda Weinman, the organization has become progressively savvier in the methods it uses to measure and pursue impact.  Programming decisions are still made from an intuitive point of view that’s the product of decades of firsthand experience, but increasingly the way that these performances and ideas are implemented involves taking into consideration what will do the community the most good. It’s one thing to attract the best artists in every category, and another to know that what you are doing is changing the lives of the people in your region for the better. Once upon a time, it was enough to believe that arts and ideas improved people simply by being available, however narrowly the latter term was defined. Today, we expect more in the way of evidence for these claims, and Arts & Lectures stands at the forefront of that shift in understanding.  Judith Jaimison Considered from this new, data-driven perspective, programming that might seem whimsical, like ukulele day, suddenly comes into sharp focus. Every component of that carefully planned April 4 operation was designed to meet an impact goal, and the whole sequence was coordinated so that each individual engagement would be treated as equally important. In the several hours that I spent discussing the organization’s goals and mission with the staff, one message kept coming through loud and clear ​— ​all of the events that Arts & Lectures presents are of equal importance. Whether you are a season ticket holder at a sold-out performance at the Granada, or a 4th grader from Lompoc taking the bus to UCSB campus for the first time, the program aims to make that moment as great as possible for you.  The way that we measure the impact of the arts has evolved. It’s not just that elitism has been abandoned in favor of popularity; on the contrary, A&L’s power to mobilize elite performers and to attract discerning patrons has never been stronger. But the notion of where culture begins and ends has been transformed. What was conceived as a support for the intellectual life of university faculty who missed the cultural options they enjoyed as graduate students in Boston, New York, and Chicago is now understood as the source of potentially life-changing moments in the lives of all our citizens, including those who may be the first in their families to go to college.  Here Comes a Regular No discussion of Arts & Lectures would be complete without confronting common misperceptions about the frequency with which certain artists return season after season. Yes, it’s true that David Sedaris is as much a regular at the Arlington as Santa Barbara International Film Festival Executive Director Roger Durling, but it’s not necessarily for the reasons you might suppose. Demand plays a role, and loyalty is a factor, but the real reason why legends such as Wynton Marsalis and Yo-Yo Ma keep coming back to Santa Barbara and to Arts & Lectures lies in their capacity for growth and development. These men started out as virtuoso instrumentalists, but over time they have acquired reputations that are based on something that’s even more rare than once-in-a-generation talent, and that’s the vision needed to change the course of an art form. Through the Silkroad project, Ma has become the most influential classical musician of our time. The approach of that group ​— ​which will make a triumphant return to the Granada on Friday, April 26, for a program titled Heroes Take Their Stands that was commissioned by A&L ​— ​has influenced an entire generation of young musicians, many of whom, like Brooklyn Rider and The Knights, have also performed here. Ma will return to the Granada on the night after the Silkroad concert to offer his reflection on Culture, Understanding & Survival. There’s no one I would rather hear at this critical point in history.  Jazz at Lincoln Center Orchestra Marsalis, for his part, succeeded not only in establishing the Jazz at Lincoln Center Orchestra back in 1987, but in creating the world’s only venue entirely devoted to the art of jazz, the Jazz at Lincoln Center facility in Columbus Circle, Manhattan, with its three concert venues, including the 1,200-seat Rose Theater. His appearance at the Granada in the fall of 2018 was surrounded by a whirlwind of outreach activities, including a thrilling Arts Adventure that exposed grade-school students to the wonders of big-band jazz and modern dance. Sedaris represents Arts & Lectures’ remarkable sensitivity to changes in the media ecosphere. He’s a writer who connects with his audience in a way that only a small handful of writers do ​— ​another is Neil Gaiman, and both are on the spring calendar for 2019. What sets Sedaris apart is his ability to transcend genre through the fundamental role of voice in both writing and audio. It was radio that first brought him to a broader audience, and the audio recordings he has made of his books have cemented his position at the center of American essay writing for the past two decades. Likewise, it’s Gaiman’s ability to cross from graphic novel to film and beyond that’s made his work so compelling. This spring he’ll be reading from a new collection, Norse Mythology, which he’s told in his own inimitable style. For Roman Baratiak, the programmer whose tenure exceeds that of any other such figure in the region, bringing the most important writers and thinkers in the world to Campbell Hall and the Arlington is a near obsession. Whether we are talking about His Holiness the Dalai Lama or talking with the Dalai Lama’s good friend Pico Iyer, Baratiak’s intent is always the same: to put the best in contemporary thought and knowledge up for discussion. With roots in film programming that extend back to his undergraduate days, Baratiak has pioneered several film initiatives within Arts & Lectures, including the enormously popular Free Summer Cinema series at the Courthouse. Next-Generation Innovations  Two particularly forward-looking recent initiatives also deserve our attention before we sign off to go check out some of these amazing events. First, there’s ¡Viva el Arte de Santa Bárbara!, a Spanish-language program that brings top artists to venues like the Marjorie Luke Theatre at Santa Barbara Junior High School. Entirely free and already very popular, ¡Viva el Arte de Santa Bárbara! brings Arts & Lectures programming into the lives and hearts of a growing number of residents whose first language is not English, or who just enjoy great music.  A&L’s new Thematic Learning Initiative derives from the support and vision of sponsors Lynda Weinman and Bruce Heavin. This program augments the local appearances of important authors by distributing their books to members of the community for free and arranging for small groups of people who work in relevant professions to meet with them. For example, this spring Beth Macy, the author of Dopesick: Dealers, Doctors, and the Drug Company that Addicted America, gave a public lecture at Campbell Hall and also conducted grand rounds with the doctors at Cottage Hospital. It’s innovative ideas like these that will keep UCSB Arts & Lectures at the center of our culture for many decades to come.
10 Apr 19
Archy news nety

BISMARCK, N.D. – Republican Government of North Dakota, Doug Burgum, signed a bill on Wednesday that makes it a crime for a doctor who performs abortion in the second trimester to use instruments such as clamps, scissors and tweezers to remove the fetus from the womb. The law that easily passed into the GOP-led legislature […]

09 Apr 19
Muqdisho Online - Caasimada Muqdisho. Somalia

Halima Aden is breaking barriers in the fashion industry at a time when xenophobia is at a peak. A proud Somali-American model turned UNICEF ambassador, she made history as the first Miss Minnesota pageant contestant to don a hijab and a burkini on stage. A year later, she signed with international modeling agency, IMG Models, […]

09 Apr 19
Infotainment Factory

// Valentine Holmes has done it. The NRL star has secured a deal in the NFL, signing with the New York Jets. So, how did it happen? And what’s next? For starters, it’s clear that the NRL superstar is not doing this for the money. Here is what we know so far about some key […]

04 Apr 19
rmolsonguitars

One of My Newest Ollandoc’s in Brazilian Rosewood For Sale… Everything top of the line.. .Seymour Duncan SH-1 pickups – Gotoh locking tuners – Brass Saddle bridge – Ebony tailpiece with brass string retainer. Email me for more info… ro@artelco.com $1575.00 plus $50.00 S/H with Free Custom made to fit case. This guitar setup ready […]

04 Apr 19
The Santa Barbara Independent
.top-gap {margin-top: -53px;} h1.entry-title { display:none;} p.subtitle { display:none;} .entry-meta {width: 80%; margin: 0px auto 0px auto; } .cover-title { max-width: 1200px; padding: 0px 40px; margin: 0px auto 50px auto; color: #f3f0dd; text-align: center; } .cover-title h1 { margin: 0px auto 0px auto; font-family: eloquent-jf-pro, serif; font-size: 60px; font-weight: 400; line-height: 70px; padding: 40px 0px 0px 0px; } .cover-title h2{ margin: 0px auto 0px auto; font-size: 28px; font-weight: 400; padding: 0px 0px 20px 0px; } .cover-title h3 { margin: -15px auto 0px auto; font-size: 17px; font-weight: 200; line-height: auto; padding: 0px 0px 0px 0px; } @media screen and (max-width: 1890px) { .cover-title { max-width: 950px; } } @media screen and (max-width: 1410px) { .cover-title { max-width: 1200px; } } @media screen and (max-width: 960px) { .cover-title h1, .cover-title h2, .cover-title h3 { text-align: center; } } .alignfull .intro { margin: 0px auto 0px auto; padding: 40px 0px 0px 0px; color: #f3f0dd; } .alignfull .block { margin: 0px auto; max-width: 1200px; padding: 50px 40px; } .x { background-color: #414042; color: #f3f0dd;} .a { background-color: #f3f0dd; color: #414042;} .b { background-color: #6d6e71; color: #f3f0dd;} .line { border-top: #ed7b27 solid 20px; } Santa Barbara Loves Beer Toasting Our Seaside Suds with the First-Ever Santa Barbara Brewery Guide By Matt Kettmann Like many communities across today’s United States, Santa Barbara County is awash in breweries, from the otherwise wine-soaked stretches of the Santa Ynez Valley down to the sandy shores of Carpinteria. We’re the birthplace of regional brewing behemoths like Firestone Walker and Figueroa Mountain, but also a comfortable home for much more boutique producers such as brewLAB and Draughtsmen.  By our count, there are 26 breweries, brewpubs, and home-brewing supply stores in the county, a considerable concentration for the less than half million people who live here. This thriving industry is now a firm fixture of life in the 805, employing our neighbors, contributing to countless causes, and, best of all, filling our fridges and bellies with handcrafted beverages.  It’s time to toast Santa Barbara’s brewing scene, and so we present to you our first-ever Santa Barbara Brewery Guide. Also inside this special issue are two more stories: one by a college student who embarks on home brewing for the first time, the other an interview with the man hired to teach UCSB’s first beer class. Cheers! .entry .entry-content>*.alignfull figure img { margin: 0px 0; width: auto; } figure { margin: 0px; padding: 0px; } .single .type-post-single figcaption { margin: 5px 0; font-style: italic; text-align: left; font-size: 14px; font-size: .875rem; background-color: #414042; } .wp-block-image figcaption { color: #f3f0dd; padding: 5px 10px; } figcaption>.photo-credit { float: none; margin: 0px; padding: 0px; clear: both; display: block; } .wp-block-image figcaption p{ padding: 5px 10px; } .entry .entry-content>*.alignfull figure .block-img-left img { width: 30%; float: right; } @media screen and (max-width: 800px) { .entry .entry-content>*.alignfull figure img { width: 100%; } .wp-block-image .alignright { float: right; margin-left: 0em; width: 100%; } .wp-block-image .alignleft { float: left; margin-right: 0em; width: 100%; } } .alignfull .block.title { text-align: center; } .alignfull .block.title h1 { font-size: 75px; } .alignfull .block.title h2{ font-size: 35px; } .alignfull .block.title h3 { font-size: 22px; } .alignfull .block h1 { margin: 0px auto 0px auto; font-family: eloquent-jf-pro, serif; font-size: 60px; font-weight: 400; line-height: 70px; padding: 40px 0px 0px 0px; } .alignfull .block h2{ margin: 0px auto 0px auto; font-size: 28px; font-weight: 400; padding: 0px 0px 20px 0px; } .alignfull .block h3 { margin: -15px auto 0px auto; font-size: 17px; font-weight: 200; line-height: auto; padding: 0px 0px 0px 0px; } .x-img { position: absolute; right:0; top: 0; width: 20%; z-index: 0; } @media screen and (max-width: 1100px) { .alignfull .block h1 { font-size: 50px; } .alignfull .block h2{ font-size: 22px; margin: -10px 0px 0px 0px; } .alignfull .block h3 { margin: -20px auto 0px auto; font-size: 16px; } } @media screen and (max-width: 890px) { .alignfull .block h1 { font-size: 40px; } .alignfull .block h2{ font-size: 18px; margin: -10px 0px 0px 0px; } .alignfull .block h3 { margin: -20px auto 0px auto; font-size: 14px; } } @media screen and (max-width: 800px) { .x-img {display: none;} .alignfull .block h1, .alignfull .block h2, .alignfull .block h3 { text-align: center; } .alignfull .block h2{ font-size: 22px; } .alignfull .block h3 { margin: -20px auto 0px auto; font-size: 14px; } .alignfull .block h1 { padding: 20px 0px 0px 0px; } .alignfull .block.title h1 { font-size: 60px; } .alignfull .block.title h2{ font-size: 30px; } .alignfull .block.title h3 { font-size: 16px; } } My First Home Brew UCSB Student Enters the Brewing World at BYOB By Bailey Emanuels The author and BYOB! co-owner Trent Hammel work on the blonde stout during brew day. To say that I was excited to brew my own beer would be an understatement. When I showed up to Santa Barbara’s very own BYOB! (Brew Your Own Beverage!) home-brewing and fermentation store, I was greeted by co-owner Trent Hammel, who was scooping fermented soybeans (that would soon be soy sauce) into a jar. I was immediately impressed, learning right away that fermentation is not just a process but a science. The more that I talked with Hammel, the more I realized that he may just be the Bobby Flay of fermentation.  As a 22-year-old student at UCSB, my experience with craft brews only dates back to the springtime of 2018, when I downloaded the app Untappd. Since then, I’ve recorded and rated every new beer I’ve tried, a tally of more than 200 unique brews. Trying both bad and excellent ones has helped me refine my palate; with some real credibility, I can now decipher what characteristics I like and which ones I don’t. But I never imagined that combining all that I did like into my own beer was something that was feasible for me.  That was until I wandered into BYOB! on a mission to create my most epic ale. Even if you, like me, come to the shop with minimal knowledge, the shop’s resident master fermenters, Hammel and co-owner Mike Kielborn — who own BYOB! with their wives, Rebecca Hammel and Aimee Kielborn ​— ​are so knowledgeable that you can learn along the way and have a great time doing so.  During our first conversation, I told them that I loved stouts, especially ones with notes of coffee, but wished that they weren’t as heavy and rich as they typically are. After some discussion, we decided on a golden stout with notes of cacao nibs and Vietnamese coffee, which we were also going to roast at the shop. The golden or blonde stout style is growing in popularity because of people like me, who enjoy the savory flavors but on a lighter frame.  The whole process seemed very daunting from afar, but rest assured: If I’m able to do it, anyone can. I arrived at the shop a week later to find a very simple recipe laid out for my soon-to-be-hopefully-epic beer. The whole process seemed very daunting from afar, but rest assured: If I’m able to do it, anyone can.  We started off by choosing and weighing our specialty grains ​— ​including flaked oats, for a strong mouthfeel ​— ​and pouring them into a grain bag to be steeped into a pot of water that held between 150 and 170 degrees. After 30 minutes, we took the bag out and were left with a brownish liquid they called a grain tea.  From there, we added golden light dehydrated malt extract, which is a powder made from malted barley, and brought the liquid, which then becomes known as wort (rhymes with “dirt”), to a boil. Then we added the hops, a bittering and preservative agent, on a strictly regimented schedule: the Styrian Golding for bittering were added with 45 minutes left in the 60-minute boiling process while the Fuggle hops (which bring stronger flavor and aroma) were tossed in with just 15 minutes remaining.  The next ingredient in beer is arguably the most important: yeast. We opted for the Safale S-04 English-style yeast, as it falls in line with the desired stout characteristics. But before we could add, or “pitch,” the yeast, we used a wort chiller to take that boiling liquid down to a lukewarm 70 degrees. Then we tossed in the vial of cloudy Saccharomyces and transferred the beer to a five-gallon fermenter. One of the things that Hammel and Kielborn stressed most about brewing your own beer was sanitation, sanitation, sanitation. Because brewing beer is essentially a series of molecular reactions, even a small microorganism can spoil an otherwise perfect, much-anticipated batch of beer. So washing and sanitizing all of the equipment before and after each process is critical to ensuring a happy brew when it’s drinking day.  That’s especially true when it comes time to bottle your beer, which is what we did a couple of weeks later. That’s when I checked back in to see how my beer was doing. Yeasty settlement had coagulated in the bottom of the five-gallon bucket, so we used a sanitized tube to siphon the beer out of the original bucket and into the next container.  This is the stage in which I tried perhaps my most adventurous beer to date: the flat and not-yet-finished variety. It tasted like a stout without the overly rich characteristics, and was very, very coffee intensive, which I was told would mellow out over the ensuing weeks of fermentation.  Home Brew Next, we measured the beer’s alcohol content. This is a formula that compares the beer’s density to that of water using a unit called gravity. We checked our notes on the original gravity level prior to the yeast being pitched, and then subtracted the final gravity and multiplied it by 131.25.  To ensure there will be carbonation, we added a bit of dextrose to the beer, which the remaining yeast will digest to produce a tiny bit more alcohol and plenty of bubbles. After we bottled and capped all five gallons of beer in dark bottles (clear bottles can produce off-taste), I stored them in a dark place that wasn’t too hot nor too cold to limit any possibilities of producing off-flavors. And now, quite possibly the most challenging part of this whole process: waiting another two weeks for the beer to be ready. For me, the best part of this whole process was learning how accessible home brewing is to anyone, and we did it all while sipping on some experimental brews and having my random questions answered. Going through the shop’s brewing class, which is offered regularly throughout the year, was critical for me to understand the scientific background and learn the very crucial steps that are not to be overlooked.  Craft beer can be expensive. When you’re like me, buying at least a six-pack a week to enjoy with friends, the costs add up quickly. But by teaching a woman to fish, in which you can bring the price down to mere cents per brew, she’ll be able to drink forever. BYOB! is located at 3445 State Street. Call 324-4690 or visit byobsb.com. UCSB’s First Beer Class Beer Writer Brian Yaeger Explains What to Expect in Beer 101 By Matt Kettmann Brian Yaeger saved students everywhere by convincing UCSB to let him teach a class about beer. Brian Yaeger is one of the country’s most respected beer writers, having penned such books as 2008’s Red, White, and Brew: An American Beer Odyssey and 2014’s Oregon Breweries. Most recently, the UCSB grad and Santa Barbara resident — who is currently researching a book about donuts and occasionally writes for this newspaper — convinced his alma mater to let him teach a class called Beer 101.  Open to the 21-and-over public through Gaucho REC (Recreation & Exercise Classes), the eight-week class starts for 70 students on April 9 and meets every Tuesday from 5:30 to 7:30 p.m. He’ll host guest speakers such as Firestone Walker’s master blender Jim Crooks, a nationally renowned expert, and will take the class on an in-depth tour of a brewery for the final evening.  When I asked about whether there’d be a final exam, Yaeger told me, “This isn’t a class to be tested in; it’s primarily a class to have your taste buds ​— ​and any antiquated perceptions of beer ​— ​challenged. When you come out a smarter beer drinker who better understands what beer is and which styles you prefer, that’s how you ace this class.” Of all colleges (!), why has UCSB never had a beer class?  Wine has been an elegant part of society for a few thousand years now, and even though beer’s history dates back 10,000 years, it’s only been since the American craft-beer renaissance that beer in America has transitioned into something to be explored, savored, and appreciated instead of just chugged. So while Gaucho REC has offered the wine-tasting course for decades, this just shows that beer is finally, truly catching up, even in places deemed “Wine Country” like Santa Barbara. I’m so glad Gaucho REC has added this course, because Gauchos and the wider community were ready for this for a while and I’m just pleased to finally be offering it now. What will you teach?  The first night will rush through the first 9,800 years of that beer history rather quickly. I plan on teaching the “modern” era of brewing, which largely begins once brewers understood yeast, which is to say, they went from the magic of fermentation to the science of fermentation. Merci, Louis Pasteur! The course is eight weeks, and in that two-month period, I’m going to take the students on a global tour of beer styles and really get into why these different styles developed where they did based on ingredients and climate (both geographical and sometimes political). Suffice it to say, they’ll truly drink their way around the world from Bavaria to Britain to Belgium to Santa Barbara. What’s your beer-related résumé?  Firstly, I’m a Gaucho and cut my teeth with on the microbrews that were available at Isla Vista’s bottle shops in the ’90s. I’ve been writing about craft beer for more than a dozen years at this point, and my travels have taken me to the world’s great beer regions to experience these styles at their sources. Along the way, I became a Cicerone (the beer world’s version of a sommelier), since beer education is my primary role, whether that’s through writing about it for a national audience or teaching it to students in the classroom. Of course, I’ve led my share of pub crawls, too, and that’s some serious hands/mouths-on education right there. Will students taste beers?  The best way to learn about beer is to drink beer. The hardest part about building the curriculum has been narrowing down the styles and brands to five beers per class. So bring some water and some pretzels or cheese ’n’ crackers, too, because, yes, beer tasting is part of the program. .pull-out { width: 30%; height: auto; position: relative; float: left; margin: 25px 20px 0px 20px; } .pull-out-x { width: 30%; height: auto; position: relative; float: right; margin: 25px 20px 0px 20px; } .pull-out h2, .pull-out-x h2 { font-family: eloquent-jf-pro, serif; font-size: 25px; font-weight: 400; font-style: italic; margin: 50px 20px 50px 20px; padding: 0px; text-align: center; } .pull-out em, .pull-out-x em { text-decoration: none; color: #be994b; font-size: 40px; padding: 0px 6px 0px 0px; line-height: 0px; } @media screen and (max-width: 800px) { .pull-out, .pull-out-x { width: 100%; margin: 10px 0px; padding: 0px 10px; } } When you come out a smarter beer drinker who better understands what beer is and which styles you prefer, that’s how you ace this class. Why is now the time for people to learn more about beer?  Over the last 40 years, and especially over the last 10 or so years, beer’s role has evolved from swill best suited to games like Beer Pong and Sloshball, as well as gulped down in stadiums and arenas, to a sophisticated beverage befitting white-tablecloth restaurants or more earnest contemplation at brewery tasting rooms. There was a low point in this country where nearly all the beer just “tasted like beer,” which is to say, dumbed- and watered-down industrial adjunct lager, but now its heritage and eclecticism is celebrated by brewers across the country and the world. This class is even for people who may think they don’t like beer, since those are the people I most enjoy introducing to new styles and showing them how wide-ranging the world of beer can be, but it’s also for the person who already knows they love exploring new beers, and getting this global perspective will flesh out how and why different beers look, smell, feel, and taste the way they do. What do you find most exciting about beer today?  Beers today can be delicate, bright, boisterous, playful, or challenging. What American craft brewers have shown the rest of the world, ever since the revolution began some 40 years ago but has just caught on starting around 15 years ago, is that beer can be made to be perfectly traditional or wildly creative, and there’s no right or wrong in either direction. Both are delicious when done well, but the last thing beer can be considered is restricted or confined. From culinary ingredients to breakthroughs in agricultural engineering that have led to a wealth of new hop varietals and yeast strains, there simply has never been a better time in the history of humankind to be a beer drinker. * { margin: 0px; } .listings { max-width: 1200px; margin: auto; padding: 0px auto 50px auto; } .alignfull .listings .intro { padding: 0px; } .alignfull .block .listings h1 { font-family: eloquent-jf-pro, serif; font-weight: 200; letter-spacing: 1px; font-size: 20px; line-height: 25px; padding: 0px 0px 5px 0px; margin: 0px 0px 15px 0px; border-bottom: 1px solid; } .entry .entry-content>*.alignfull .block .listings img { margin: 0px 0px 10px 0px; width: 100%; height: auto; } /* ---- grid ---- */ .grid { box-sizing: border-box; padding-top: 0px; } /* clearfix */ .grid:after { content: ''; display: block; clear: both; } /* ---- grid-item ---- */ .grid-sizer, .grid-item { width: 32%; padding: 0px; box-sizing: border-box; } .grid-item { height: 50px; float: left; background: none; margin-bottom: 0px; } .grid-item--quarter { width: 24.35%; } .grid-item--half { width: 32%; } .grid-item--full { width: 100%; } .grid-item--y { height: 80px; } .grid-item--height { height: 360px; } /* ---- grid-item intro ---- */ .grid-item .article {display: none;} /* ---- grid-item hover ---- */ .grid-item:hover { border-color: none; cursor: pointer; } /* ---- grid-item gigante ---- */ .grid-item .instruct-text { display: none; } .grid-item--gigante .article {display: block; padding-bottom: 30px;} .listings .grid-item--gigante { width: 64%; height: auto; margin-bottom: 0px; padding: 0px 0px; } .full-listings .grid-item--gigante { width: 48%; height: auto; } .grid-item--gigante .intro { display: none; } .grid-item--gigante h2 { font-weight: 800; font-style: normal; font-size: 16px; padding: 20px 0px 0px 0px; margin: 0px 0px 0px 0px; } .grid-item--gigante h3 { font-weight: 400; font-style: normal; font-size: 14px; padding: 10px 0px 40px 0px; } .grid-item--gigante p { margin-top: 0px; padding: 0px 0px 0px 0px; font-size: 15px; } .grid-item--gigante a { font-style: italic; font-size: 16px; color: #f3f0dd; } @media only screen and (max-width: 1200px) { .grid-item--z { height: 80px; } } @media only screen and (max-width: 850px) { .grid-sizer, .grid-item { width: 100%; } .grid-item--x { height: 80px; } .grid-item--z { height: 80px; } .grid-item--y { height: 80px; } .listings .grid-item--gigante { width: 100%; } } var $grid = $('.grid').masonry({ itemSelector: '.grid-item', columnWidth: '.grid-sizer', percentPosition: true, }); $grid.on( 'click', '.grid-item', function() { // change size of item via class $( this ).toggleClass('grid-item--gigante'); // trigger layout $grid.masonry(); // }); $grid.on( 'layoutComplete', function( event, laidOutItems ) { console.log( 'Masonry layout complete with ' + laidOutItems.length + ' items' ); }); // init Masonry var $grid = $('.grid').masonry({ // options... }); $('.grid').masonry({ gutter: 10 }); // layout Masonry after each image loads $grid.imagesLoaded().progress( function() { $grid.masonry('layout'); }); /*! * Masonry PACKAGED v4.2.1 * Cascading grid layout library * https://masonry.desandro.com * MIT License * by David DeSandro */ /** * Bridget makes jQuery widgets * v2.0.1 * MIT license */ /* jshint browser: true, strict: true, undef: true, unused: true */ ( function( window, factory ) { // universal module definition /*jshint strict: false */ /* globals define, module, require */ if ( typeof define == 'function' && define.amd ) { // AMD define( 'jquery-bridget/jquery-bridget',[ 'jquery' ], function( jQuery ) { return factory( window, jQuery ); }); } else if ( typeof module == 'object' && module.exports ) { // CommonJS module.exports = factory( window, require('jquery') ); } else { // browser global window.jQueryBridget = factory( window, window.jQuery ); } }( window, function factory( window, jQuery ) { 'use strict'; // ----- utils ----- // var arraySlice = Array.prototype.slice; // helper function for logging errors // $.error breaks jQuery chaining var console = window.console; var logError = typeof console == 'undefined' ? function() {} : function( message ) { console.error( message ); }; // ----- jQueryBridget ----- // function jQueryBridget( namespace, PluginClass, $ ) { $ = $ || jQuery || window.jQuery; if ( !$ ) { return; } // add option method -> $().plugin('option', {...}) if ( !PluginClass.prototype.option ) { // option setter PluginClass.prototype.option = function( opts ) { // bail out if not an object if ( !$.isPlainObject( opts ) ){ return; } this.options = $.extend( true, this.options, opts ); }; } // make jQuery plugin $.fn[ namespace ] = function( arg0 /*, arg1 */ ) { if ( typeof arg0 == 'string' ) { // method call $().plugin( 'methodName', { options } ) // shift arguments by 1 var args = arraySlice.call( arguments, 1 ); return methodCall( this, arg0, args ); } // just $().plugin({ options }) plainCall( this, arg0 ); return this; }; // $().plugin('methodName') function methodCall( $elems, methodName, args ) { var returnValue; var pluginMethodStr = '$().' + namespace + '("' + methodName + '")'; $elems.each( function( i, elem ) { // get instance var instance = $.data( elem, namespace ); if ( !instance ) { logError( namespace + ' not initialized. Cannot call methods, i.e. ' + pluginMethodStr ); return; } var method = instance[ methodName ]; if ( !method || methodName.charAt(0) == '_' ) { logError( pluginMethodStr + ' is not a valid method' ); return; } // apply method, get return value var value = method.apply( instance, args ); // set return value if value is returned, use only first value returnValue = returnValue === undefined ? value : returnValue; }); return returnValue !== undefined ? returnValue : $elems; } function plainCall( $elems, options ) { $elems.each( function( i, elem ) { var instance = $.data( elem, namespace ); if ( instance ) { // set options & init instance.option( options ); instance._init(); } else { // initialize new instance instance = new PluginClass( elem, options ); $.data( elem, namespace, instance ); } }); } updateJQuery( $ ); } // ----- updateJQuery ----- // // set $.bridget for v1 backwards compatibility function updateJQuery( $ ) { if ( !$ || ( $ && $.bridget ) ) { return; } $.bridget = jQueryBridget; } updateJQuery( jQuery || window.jQuery ); // ----- ----- // return jQueryBridget; })); /** * EvEmitter v1.1.0 * Lil' event emitter * MIT License */ /* jshint unused: true, undef: true, strict: true */ ( function( global, factory ) { // universal module definition /* jshint strict: false */ /* globals define, module, window */ if ( typeof define == 'function' && define.amd ) { // AMD - RequireJS define( 'ev-emitter/ev-emitter',factory ); } else if ( typeof module == 'object' && module.exports ) { // CommonJS - Browserify, Webpack module.exports = factory(); } else { // Browser globals global.EvEmitter = factory(); } }( typeof window != 'undefined' ? window : this, function() { function EvEmitter() {} var proto = EvEmitter.prototype; proto.on = function( eventName, listener ) { if ( !eventName || !listener ) { return; } // set events hash var events = this._events = this._events || {}; // set listeners array var listeners = events[ eventName ] = events[ eventName ] || []; // only add once if ( listeners.indexOf( listener ) == -1 ) { listeners.push( listener ); } return this; }; proto.once = function( eventName, listener ) { if ( !eventName || !listener ) { return; } // add event this.on( eventName, listener ); // set once flag // set onceEvents hash var onceEvents = this._onceEvents = this._onceEvents || {}; // set onceListeners object var onceListeners = onceEvents[ eventName ] = onceEvents[ eventName ] || {}; // set flag onceListeners[ listener ] = true; return this; }; proto.off = function( eventName, listener ) { var listeners = this._events && this._events[ eventName ]; if ( !listeners || !listeners.length ) { return; } var index = listeners.indexOf( listener ); if ( index != -1 ) { listeners.splice( index, 1 ); } return this; }; proto.emitEvent = function( eventName, args ) { var listeners = this._events && this._events[ eventName ]; if ( !listeners || !listeners.length ) { return; } // copy over to avoid interference if .off() in listener listeners = listeners.slice(0); args = args || []; // once stuff var onceListeners = this._onceEvents && this._onceEvents[ eventName ]; for ( var i=0; i < listeners.length; i++ ) { var listener = listeners[i] var isOnce = onceListeners && onceListeners[ listener ]; if ( isOnce ) { // remove listener // remove before trigger to prevent recursion this.off( eventName, listener ); // unset once flag delete onceListeners[ listener ]; } // trigger listener listener.apply( this, args ); } return this; }; proto.allOff = function() { delete this._events; delete this._onceEvents; }; return EvEmitter; })); /*! * getSize v2.0.2 * measure size of elements * MIT license */ /*jshint browser: true, strict: true, undef: true, unused: true */ /*global define: false, module: false, console: false */ ( function( window, factory ) { 'use strict'; if ( typeof define == 'function' && define.amd ) { // AMD define( 'get-size/get-size',[],function() { return factory(); }); } else if ( typeof module == 'object' && module.exports ) { // CommonJS module.exports = factory(); } else { // browser global window.getSize = factory(); } })( window, function factory() { 'use strict'; // -------------------------- helpers -------------------------- // // get a number from a string, not a percentage function getStyleSize( value ) { var num = parseFloat( value ); // not a percent like '100%', and a number var isValid = value.indexOf('%') == -1 && !isNaN( num ); return isValid && num; } function noop() {} var logError = typeof console == 'undefined' ? noop : function( message ) { console.error( message ); }; // -------------------------- measurements -------------------------- // var measurements = [ 'paddingLeft', 'paddingRight', 'paddingTop', 'paddingBottom', 'marginLeft', 'marginRight', 'marginTop', 'marginBottom', 'borderLeftWidth', 'borderRightWidth', 'borderTopWidth', 'borderBottomWidth' ]; var measurementsLength = measurements.length; function getZeroSize() { var size = { width: 0, height: 0, innerWidth: 0, innerHeight: 0, outerWidth: 0, outerHeight: 0 }; for ( var i=0; i < measurementsLength; i++ ) { var measurement = measurements[i]; size[ measurement ] = 0; } return size; } // -------------------------- getStyle -------------------------- // /** * getStyle, get style of element, check for Firefox bug * https://bugzilla.mozilla.org/show_bug.cgi?id=548397 */ function getStyle( elem ) { var style = getComputedStyle( elem ); if ( !style ) { logError( 'Style returned ' + style + '. Are you running this code in a hidden iframe on Firefox? ' + 'See http://bit.ly/getsizebug1' ); } return style; } // -------------------------- setup -------------------------- // var isSetup = false; var isBoxSizeOuter; /** * setup * check isBoxSizerOuter * do on first getSize() rather than on page load for Firefox bug */ function setup() { // setup once if ( isSetup ) { return; } isSetup = true; // -------------------------- box sizing -------------------------- // /** * WebKit measures the outer-width on style.width on border-box elems * IE & Firefox -webkit-transform function toDashedAll( str ) { return str.replace( /([A-Z])/g, function( $1 ) { return '-' + $1.toLowerCase(); }); } var transitionProps = 'opacity,' + toDashedAll( transformProperty ); proto.enableTransition = function(/* style */) { // HACK changing transitionProperty during a transition // will cause transition to jump if ( this.isTransitioning ) { return; } // make `transition: foo, bar, baz` from style object // HACK un-comment this when enableTransition can work // while a transition is happening // var transitionValues = []; // for ( var prop in style ) { // // dash-ify camelCased properties like WebkitTransition // prop = vendorProperties[ prop ] || prop; // transitionValues.push( toDashedAll( prop ) ); // } // munge number to millisecond, to match stagger var duration = this.layout.options.transitionDuration; duration = typeof duration == 'number' ? duration + 'ms' : duration; // enable transition styles this.css({ transitionProperty: transitionProps, transitionDuration: duration, transitionDelay: this.staggerDelay || 0 }); // listen for transition end event this.element.addEventListener( transitionEndEvent, this, false ); }; // ----- events ----- // proto.onwebkitTransitionEnd = function( event ) { this.ontransitionend( event ); }; proto.onotransitionend = function( event ) { this.ontransitionend( event ); }; // properties that I munge to make my life easier var dashedVendorProperties = { '-webkit-transform': 'transform' }; proto.ontransitionend = function( event ) { // disregard bubbled events from children if ( event.target !== this.element ) { return; } var _transition = this._transn; // get property name of transitioned property, convert to prefix-free var propertyName = dashedVendorProperties[ event.propertyName ] || event.propertyName; // remove property that has completed transitioning delete _transition.ingProperties[ propertyName ]; // check if any properties are still transitioning if ( isEmptyObj( _transition.ingProperties ) ) { // all properties have completed transitioning this.disableTransition(); } // clean style if ( propertyName in _transition.clean ) { // clean up style this.element.style[ event.propertyName ] = ''; delete _transition.clean[ propertyName ]; } // trigger onTransitionEnd callback if ( propertyName in _transition.onEnd ) { var onTransitionEnd = _transition.onEnd[ propertyName ]; onTransitionEnd.call( this ); delete _transition.onEnd[ propertyName ]; } this.emitEvent( 'transitionEnd', [ this ] ); }; proto.disableTransition = function() { this.removeTransitionStyles(); this.element.removeEventListener( transitionEndEvent, this, false ); this.isTransitioning = false; }; /** * removes style property from element * @param {Object} style **/ proto._removeStyles = function( style ) { // clean up transition styles var cleanStyle = {}; for ( var prop in style ) { cleanStyle[ prop ] = ''; } this.css( cleanStyle ); }; var cleanTransitionStyle = { transitionProperty: '', transitionDuration: '', transitionDelay: '' }; proto.removeTransitionStyles = function() { // remove transition this.css( cleanTransitionStyle ); }; // ----- stagger ----- // proto.stagger = function( delay ) { delay = isNaN( delay ) ? 0 : delay; this.staggerDelay = delay + 'ms'; }; // ----- show/hide/remove ----- // // remove element from DOM proto.removeElem = function() { this.element.parentNode.removeChild( this.element ); // remove display: none this.css({ display: '' }); this.emitEvent( 'remove', [ this ] ); }; proto.remove = function() { // just remove element if no transition support or no transition if ( !transitionProperty || !parseFloat( this.layout.options.transitionDuration ) ) { this.removeElem(); return; } // start transition this.once( 'transitionEnd', function() { this.removeElem(); }); this.hide(); }; proto.reveal = function() { delete this.isHidden; // remove display: none this.css({ display: '' }); var options = this.layout.options; var onTransitionEnd = {}; var transitionEndProperty = this.getHideRevealTransitionEndProperty('visibleStyle'); onTransitionEnd[ transitionEndProperty ] = this.onRevealTransitionEnd; this.transition({ from: options.hiddenStyle, to: options.visibleStyle, isCleaning: true, onTransitionEnd: onTransitionEnd }); }; proto.onRevealTransitionEnd = function() { // check if still visible // during transition, item may have been hidden if ( !this.isHidden ) { this.emitEvent('reveal'); } }; /** * get style property use for hide/reveal transition end * @param {String} styleProperty - hiddenStyle/visibleStyle * @returns {String} */ proto.getHideRevealTransitionEndProperty = function( styleProperty ) { var optionStyle = this.layout.options[ styleProperty ]; // use opacity if ( optionStyle.opacity ) { return 'opacity'; } // get first property for ( var prop in optionStyle ) { return prop; } }; proto.hide = function() { // set flag this.isHidden = true; // remove display: none this.css({ display: '' }); var options = this.layout.options; var onTransitionEnd = {}; var transitionEndProperty = this.getHideRevealTransitionEndProperty('hiddenStyle'); onTransitionEnd[ transitionEndProperty ] = this.onHideTransitionEnd; this.transition({ from: options.visibleStyle, to: options.hiddenStyle, // keep hidden stuff hidden isCleaning: true, onTransitionEnd: onTransitionEnd }); }; proto.onHideTransitionEnd = function() { // check if still hidden // during transition, item may have been un-hidden if ( this.isHidden ) { this.css({ display: 'none' }); this.emitEvent('hide'); } }; proto.destroy = function() { this.css({ position: '', left: '', right: '', top: '', bottom: '', transition: '', transform: '' }); }; return Item; })); /*! * Outlayer v2.1.0 * the brains and guts of a layout library * MIT license */ ( function( window, factory ) { 'use strict'; // universal module definition /* jshint strict: false */ /* globals define, module, require */ if ( typeof define == 'function' && define.amd ) { // AMD - RequireJS define( 'outlayer/outlayer',[ 'ev-emitter/ev-emitter', 'get-size/get-size', 'fizzy-ui-utils/utils', './item' ], function( EvEmitter, getSize, utils, Item ) { return factory( window, EvEmitter, getSize, utils, Item); } ); } else if ( typeof module == 'object' && module.exports ) { // CommonJS - Browserify, Webpack module.exports = factory( window, require('ev-emitter'), require('get-size'), require('fizzy-ui-utils'), require('./item') ); } else { // browser global window.Outlayer = factory( window, window.EvEmitter, window.getSize, window.fizzyUIUtils, window.Outlayer.Item ); } }( window, function factory( window, EvEmitter, getSize, utils, Item ) { 'use strict'; // ----- vars ----- // var console = window.console; var jQuery = window.jQuery; var noop = function() {}; // -------------------------- Outlayer -------------------------- // // globally unique identifiers var GUID = 0; // internal store of all Outlayer intances var instances = {}; /** * @param {Element, String} element * @param {Object} options * @constructor */ function Outlayer( element, options ) { var queryElement = utils.getQueryElement( element ); if ( !queryElement ) { if ( console ) { console.error( 'Bad element for ' + this.constructor.namespace + ': ' + ( queryElement || element ) ); } return; } this.element = queryElement; // add jQuery if ( jQuery ) { this.$element = jQuery( this.element ); } // options this.options = utils.extend( {}, this.constructor.defaults ); this.option( options ); // add id for Outlayer.getFromElement var id = ++GUID; this.element.outlayerGUID = id; // expando instances[ id ] = this; // associate via id // kick it off this._create(); var isInitLayout = this._getOption('initLayout'); if ( isInitLayout ) { this.layout(); } } // settings are for internal use only Outlayer.namespace = 'outlayer'; Outlayer.Item = Item; // default options Outlayer.defaults = { containerStyle: { position: 'relative' }, initLayout: true, originLeft: true, originTop: true, resize: true, resizeContainer: true, // item options transitionDuration: '0.4s', hiddenStyle: { opacity: 0, transform: 'scale(0.001)' }, visibleStyle: { opacity: 1, transform: 'scale(1)' } }; var proto = Outlayer.prototype; // inherit EvEmitter utils.extend( proto, EvEmitter.prototype ); /** * set options * @param {Object} opts */ proto.option = function( opts ) { utils.extend( this.options, opts ); }; /** * get backwards compatible option value, check old name */ proto._getOption = function( option ) { var oldOption = this.constructor.compatOptions[ option ]; return oldOption && this.options[ oldOption ] !== undefined ? this.options[ oldOption ] : this.options[ option ]; }; Outlayer.compatOptions = { // currentName: oldName initLayout: 'isInitLayout', horizontal: 'isHorizontal', layoutInstant: 'isLayoutInstant', originLeft: 'isOriginLeft', originTop: 'isOriginTop', resize: 'isResizeBound', resizeContainer: 'isResizingContainer' }; proto._create = function() { // get items from children this.reloadItems(); // elements that affect layout, but are not laid out this.stamps = []; this.stamp( this.options.stamp ); // set container style utils.extend( this.element.style, this.options.containerStyle ); // bind resize method var canBindResize = this._getOption('resize'); if ( canBindResize ) { this.bindResize(); } }; // goes through all children again and gets bricks in proper order proto.reloadItems = function() { // collection of item elements this.items = this._itemize( this.element.children ); }; /** * turn elements into Outlayer.Items to be used in layout * @param {Array or NodeList or HTMLElement} elems * @returns {Array} items - collection of new Outlayer Items */ proto._itemize = function( elems ) { var itemElems = this._filterFindItemElements( elems ); var Item = this.constructor.Item; // create new Outlayer Items for collection var items = []; for ( var i=0; i < itemElems.length; i++ ) { var elem = itemElems[i]; var item = new Item( elem, this ); items.push( item ); } return items; }; /** * get item elements to be used in layout * @param {Array or NodeList or HTMLElement} elems * @returns {Array} items - item elements */ proto._filterFindItemElements = function( elems ) { return utils.filterFindElements( elems, this.options.itemSelector ); }; /** * getter method for getting item elements * @returns {Array} elems - collection of item elements */ proto.getItemElements = function() { return this.items.map( function( item ) { return item.element; }); }; // ----- init & layout ----- // /** * lays out all items */ proto.layout = function() { this._resetLayout(); this._manageStamps(); // don't animate first layout var layoutInstant = this._getOption('layoutInstant'); var isInstant = layoutInstant !== undefined ? layoutInstant : !this._isLayoutInited; this.layoutItems( this.items, isInstant ); // flag for initalized this._isLayoutInited = true; }; // _init is alias for layout proto._init = proto.layout; /** * logic before any new layout */ proto._resetLayout = function() { this.getSize(); }; proto.getSize = function() { this.size = getSize( this.element ); }; /** * get measurement from option, for columnWidth, rowHeight, gutter * if option is String -> get element from selector string, & get size of element * if option is Element -> get size of element * else use option as a number * * @param {String} measurement * @param {String} size - width or height * @private */ proto._getMeasurement = function( measurement, size ) { var option = this.options[ measurement ]; var elem; if ( !option ) { // default to 0 this[ measurement ] = 0; } else { // use option as an element if ( typeof option == 'string' ) { elem = this.element.querySelector( option ); } else if ( option instanceof HTMLElement ) { elem = option; } // use size of element, if element this[ measurement ] = elem ? getSize( elem )[ size ] : option; } }; /** * layout a collection of item elements * @api public */ proto.layoutItems = function( items, isInstant ) { items = this._getItemsForLayout( items ); this._layoutItems( items, isInstant ); this._postLayout(); }; /** * get the items to be laid out * you may want to skip over some items * @param {Array} items * @returns {Array} items */ proto._getItemsForLayout = function( items ) { return items.filter( function( item ) { return !item.isIgnored; }); }; /** * layout items * @param {Array} items * @param {Boolean} isInstant */ proto._layoutItems = function( items, isInstant ) { this._emitCompleteOnItems( 'layout', items ); if ( !items || !items.length ) { // no items, emit event with empty array return; } var queue = []; items.forEach( function( item ) { // get x/y object from method var position = this._getItemLayoutPosition( item ); // enqueue position.item = item; position.isInstant = isInstant || item.isLayoutInstant; queue.push( position ); }, this ); this._processLayoutQueue( queue ); }; /** * get item layout position * @param {Outlayer.Item} item * @returns {Object} x and y position */ proto._getItemLayoutPosition = function( /* item */ ) { return { x: 0, y: 0 }; }; /** * iterate over array and position each item * Reason being - separating this logic prevents 'layout invalidation' * thx @paul_irish * @param {Array} queue */ proto._processLayoutQueue = function( queue ) { this.updateStagger(); queue.forEach( function( obj, i ) { this._positionItem( obj.item, obj.x, obj.y, obj.isInstant, i ); }, this ); }; // set stagger from option in milliseconds number proto.updateStagger = function() { var stagger = this.options.stagger; if ( stagger === null || stagger === undefined ) { this.stagger = 0; return; } this.stagger = getMilliseconds( stagger ); return this.stagger; }; /** * Sets position of item in DOM * @param {Outlayer.Item} item * @param {Number} x - horizontal position * @param {Number} y - vertical position * @param {Boolean} isInstant - disables transitions */ proto._positionItem = function( item, x, y, isInstant, i ) { if ( isInstant ) { // if not transition, just set CSS item.goTo( x, y ); } else { item.stagger( i * this.stagger ); item.moveTo( x, y ); } }; /** * Any logic you want to do after each layout, * i.e. size the container */ proto._postLayout = function() { this.resizeContainer(); }; proto.resizeContainer = function() { var isResizingContainer = this._getOption('resizeContainer'); if ( !isResizingContainer ) { return; } var size = this._getContainerSize(); if ( size ) { this._setContainerMeasure( size.width, true ); this._setContainerMeasure( size.height, false ); } }; /** * Sets width or height of container if returned * @returns {Object} size * @param {Number} width * @param {Number} height */ proto._getContainerSize = noop; /** * @param {Number} measure - size of width or height * @param {Boolean} isWidth */ proto._setContainerMeasure = function( measure, isWidth ) { if ( measure === undefined ) { return; } var elemSize = this.size; // add padding and border width if border box if ( elemSize.isBorderBox ) { measure += isWidth ? elemSize.paddingLeft + elemSize.paddingRight + elemSize.borderLeftWidth + elemSize.borderRightWidth : elemSize.paddingBottom + elemSize.paddingTop + elemSize.borderTopWidth + elemSize.borderBottomWidth; } measure = Math.max( measure, 0 ); this.element.style[ isWidth ? 'width' : 'height' ] = measure + 'px'; }; /** * emit eventComplete on a collection of items events * @param {String} eventName * @param {Array} items - Outlayer.Items */ proto._emitCompleteOnItems = function( eventName, items ) { var _this = this; function onComplete() { _this.dispatchEvent( eventName + 'Complete', null, [ items ] ); } var count = items.length; if ( !items || !count ) { onComplete(); return; } var doneCount = 0; function tick() { doneCount++; if ( doneCount == count ) { onComplete(); } } // bind callback items.forEach( function( item ) { item.once( eventName, tick ); }); }; /** * emits events via EvEmitter and jQuery events * @param {String} type - name of event * @param {Event} event - original event * @param {Array} args - extra arguments */ proto.dispatchEvent = function( type, event, args ) { // add original event to arguments var emitArgs = event ? [ event ].concat( args ) : args; this.emitEvent( type, emitArgs ); if ( jQuery ) { // set this.$element this.$element = this.$element || jQuery( this.element ); if ( event ) { // create jQuery event var $event = jQuery.Event( event ); $event.type = type; this.$element.trigger( $event, args ); } else { // just trigger with type if no event available this.$element.trigger( type, args ); } } }; // -------------------------- ignore & stamps -------------------------- // /** * keep item in collection, but do not lay it out * ignored items do not get skipped in layout * @param {Element} elem */ proto.ignore = function( elem ) { var item = this.getItem( elem ); if ( item ) { item.isIgnored = true; } }; /** * return item to layout collection * @param {Element} elem */ proto.unignore = function( elem ) { var item = this.getItem( elem ); if ( item ) { delete item.isIgnored; } }; /** * adds elements to stamps * @param {NodeList, Array, Element, or String} elems */ proto.stamp = function( elems ) { elems = this._find( elems ); if ( !elems ) { return; } this.stamps = this.stamps.concat( elems ); // ignore elems.forEach( this.ignore, this ); }; /** * removes elements to stamps * @param {NodeList, Array, or Element} elems */ proto.unstamp = function( elems ) { elems = this._find( elems ); if ( !elems ){ return; } elems.forEach( function( elem ) { // filter out removed stamp elements utils.removeFrom( this.stamps, elem ); this.unignore( elem ); }, this ); }; /** * finds child elements * @param {NodeList, Array, Element, or String} elems * @returns {Array} elems */ proto._find = function( elems ) { if ( !elems ) { return; } // if string, use argument as selector string if ( typeof elems == 'string' ) { elems = this.element.querySelectorAll( elems ); } elems = utils.makeArray( elems ); return elems; }; proto._manageStamps = function() { if ( !this.stamps || !this.stamps.length ) { return; } this._getBoundingRect(); this.stamps.forEach( this._manageStamp, this ); }; // update boundingLeft / Top proto._getBoundingRect = function() { // get bounding rect for container element var boundingRect = this.element.getBoundingClientRect(); var size = this.size; this._boundingRect = { left: boundingRect.left + size.paddingLeft + size.borderLeftWidth, top: boundingRect.top + size.paddingTop + size.borderTopWidth, right: boundingRect.right - ( size.paddingRight + size.borderRightWidth ), bottom: boundingRect.bottom - ( size.paddingBottom + size.borderBottomWidth ) }; }; /** * @param {Element} stamp **/ proto._manageStamp = noop; /** * get x/y position of element relative to container element * @param {Element} elem * @returns {Object} offset - has left, top, right, bottom */ proto._getElementOffset = function( elem ) { var boundingRect = elem.getBoundingClientRect(); var thisRect = this._boundingRect; var size = getSize( elem ); var offset = { left: boundingRect.left - thisRect.left - size.marginLeft, top: boundingRect.top - thisRect.top - size.marginTop, right: thisRect.right - boundingRect.right - size.marginRight, bottom: thisRect.bottom - boundingRect.bottom - size.marginBottom }; return offset; }; // -------------------------- resize -------------------------- // // enable event handlers for listeners // i.e. resize -> onresize proto.handleEvent = utils.handleEvent; /** * Bind layout to window resizing */ proto.bindResize = function() { window.addEventListener( 'resize', this ); this.isResizeBound = true; }; /** * Unbind layout to window resizing */ proto.unbindResize = function() { window.removeEventListener( 'resize', this ); this.isResizeBound = false; }; proto.onresize = function() { this.resize(); }; utils.debounceMethod( Outlayer, 'onresize', 100 ); proto.resize = function() { // don't trigger if size did not change // or if resize was unbound. See #9 if ( !this.isResizeBound || !this.needsResizeLayout() ) { return; } this.layout(); }; /** * check if layout is needed post layout * @returns Boolean */ proto.needsResizeLayout = function() { var size = getSize( this.element ); // check that this.size and size are there // IE8 triggers resize on body size change, so they might not be var hasSizes = this.size && size; return hasSizes && size.innerWidth !== this.size.innerWidth; }; // -------------------------- methods -------------------------- // /** * add items to Outlayer instance * @param {Array or NodeList or Element} elems * @returns {Array} items - Outlayer.Items **/ proto.addItems = function( elems ) { var items = this._itemize( elems ); // add items to collection if ( items.length ) { this.items = this.items.concat( items ); } return items; }; /** * Layout newly-appended item elements * @param {Array or NodeList or Element} elems */ proto.appended = function( elems ) { var items = this.addItems( elems ); if ( !items.length ) { return; } // layout and reveal just the new items this.layoutItems( items, true ); this.reveal( items ); }; /** * Layout prepended elements * @param {Array or NodeList or Element} elems */ proto.prepended = function( elems ) { var items = this._itemize( elems ); if ( !items.length ) { return; } // add items to beginning of collection var previousItems = this.items.slice(0); this.items = items.concat( previousItems ); // start new layout this._resetLayout(); this._manageStamps(); // layout new stuff without transition this.layoutItems( items, true ); this.reveal( items ); // layout previous items this.layoutItems( previousItems ); }; /** * reveal a collection of items * @param {Array of Outlayer.Items} items */ proto.reveal = function( items ) { this._emitCompleteOnItems( 'reveal', items ); if ( !items || !items.length ) { return; } var stagger = this.updateStagger(); items.forEach( function( item, i ) { item.stagger( i * stagger ); item.reveal(); }); }; /** * hide a collection of items * @param {Array of Outlayer.Items} items */ proto.hide = function( items ) { this._emitCompleteOnItems( 'hide', items ); if ( !items || !items.length ) { return; } var stagger = this.updateStagger(); items.forEach( function( item, i ) { item.stagger( i * stagger ); item.hide(); }); }; /** * reveal item elements * @param {Array}, {Element}, {NodeList} items */ proto.revealItemElements = function( elems ) { var items = this.getItems( elems ); this.reveal( items ); }; /** * hide item elements * @param {Array}, {Element}, {NodeList} items */ proto.hideItemElements = function( elems ) { var items = this.getItems( elems ); this.hide( items ); }; /** * get Outlayer.Item, given an Element * @param {Element} elem * @param {Function} callback * @returns {Outlayer.Item} item */ proto.getItem = function( elem ) { // loop through items to get the one that matches for ( var i=0; i < this.items.length; i++ ) { var item = this.items[i]; if ( item.element == elem ) { // return item return item; } } }; /** * get collection of Outlayer.Items, given Elements * @param {Array} elems * @returns {Array} items - Outlayer.Items */ proto.getItems = function( elems ) { elems = utils.makeArray( elems ); var items = []; elems.forEach( function( elem ) { var item = this.getItem( elem ); if ( item ) { items.push( item ); } }, this ); return items; }; /** * remove element(s) from instance and DOM * @param {Array or NodeList or Element} elems */ proto.remove = function( elems ) { var removeItems = this.getItems( elems ); this._emitCompleteOnItems( 'remove', removeItems ); // bail if no items to remove if ( !removeItems || !removeItems.length ) { return; } removeItems.forEach( function( item ) { item.remove(); // remove item from collection utils.removeFrom( this.items, item ); }, this ); }; // ----- destroy ----- // // remove and disable Outlayer instance proto.destroy = function() { // clean up dynamic styles var style = this.element.style; style.height = ''; style.position = ''; style.width = ''; // destroy items this.items.forEach( function( item ) { item.destroy(); }); this.unbindResize(); var id = this.element.outlayerGUID; delete instances[ id ]; // remove reference to instance by id delete this.element.outlayerGUID; // remove data for jQuery if ( jQuery ) { jQuery.removeData( this.element, this.constructor.namespace ); } }; // -------------------------- data -------------------------- // /** * get Outlayer instance from element * @param {Element} elem * @returns {Outlayer} */ Outlayer.data = function( elem ) { elem = utils.getQueryElement( elem ); var id = elem && elem.outlayerGUID; return id && instances[ id ]; }; // -------------------------- create Outlayer class -------------------------- // /** * create a layout class * @param {String} namespace */ Outlayer.create = function( namespace, options ) { // sub-class Outlayer var Layout = subclass( Outlayer ); // apply new options and compatOptions Layout.defaults = utils.extend( {}, Outlayer.defaults ); utils.extend( Layout.defaults, options ); Layout.compatOptions = utils.extend( {}, Outlayer.compatOptions ); Layout.namespace = namespace; Layout.data = Outlayer.data; // sub-class Item Layout.Item = subclass( Item ); // -------------------------- declarative -------------------------- // utils.htmlInit( Layout, namespace ); // -------------------------- jQuery bridge -------------------------- // // make into jQuery plugin if ( jQuery && jQuery.bridget ) { jQuery.bridget( namespace, Layout ); } return Layout; }; function subclass( Parent ) { function SubClass() { Parent.apply( this, arguments ); } SubClass.prototype = Object.create( Parent.prototype ); SubClass.prototype.constructor = SubClass; return SubClass; } // ----- helpers ----- // // how many milliseconds are in each unit var msUnits = { ms: 1, s: 1000 }; // munge time-like parameter into millisecond number // '0.4s' -> 40 function getMilliseconds( time ) { if ( typeof time == 'number' ) { return time; } var matches = time.match( /(^\d*\.?\d*)(\w*)/ ); var num = matches && matches[1]; var unit = matches && matches[2]; if ( !num.length ) { return 0; } num = parseFloat( num ); var mult = msUnits[ unit ] || 1; return num * mult; } // ----- fin ----- // // back in global Outlayer.Item = Item; return Outlayer; })); /*! * Masonry v4.2.1 * Cascading grid layout library * https://masonry.desandro.com * MIT License * by David DeSandro */ ( function( window, factory ) { // universal module definition /* jshint strict: false */ /*globals define, module, require */ if ( typeof define == 'function' && define.amd ) { // AMD define( [ 'outlayer/outlayer', 'get-size/get-size' ], factory ); } else if ( typeof module == 'object' && module.exports ) { // CommonJS module.exports = factory( require('outlayer'), require('get-size') ); } else { // browser global window.Masonry = factory( window.Outlayer, window.getSize ); } }( window, function factory( Outlayer, getSize ) { // -------------------------- masonryDefinition -------------------------- // // create an Outlayer layout class var Masonry = Outlayer.create('masonry'); // isFitWidth -> fitWidth Masonry.compatOptions.fitWidth = 'isFitWidth'; var proto = Masonry.prototype; proto._resetLayout = function() { this.getSize(); this._getMeasurement( 'columnWidth', 'outerWidth' ); this._getMeasurement( 'gutter', 'outerWidth' ); this.measureColumns(); // reset column Y this.colYs = []; for ( var i=0; i < this.cols; i++ ) { this.colYs.push( 0 ); } this.maxY = 0; this.horizontalColIndex = 0; }; proto.measureColumns = function() { this.getContainerWidth(); // if columnWidth is 0, default to outerWidth of first item if ( !this.columnWidth ) { var firstItem = this.items[0]; var firstItemElem = firstItem && firstItem.element; // columnWidth fall back to item of first element this.columnWidth = firstItemElem && getSize( firstItemElem ).outerWidth || // if first elem has no width, default to size of container this.containerWidth; } var columnWidth = this.columnWidth += this.gutter; // calculate columns var containerWidth = this.containerWidth + this.gutter; var cols = containerWidth / columnWidth; // fix rounding errors, typically with gutters var excess = columnWidth - containerWidth % columnWidth; // if overshoot is less than a pixel, round up, otherwise floor it var mathMethod = excess && excess < 1 ? 'round' : 'floor'; cols = Math[ mathMethod ]( cols ); this.cols = Math.max( cols, 1 ); }; proto.getContainerWidth = function() { // container is parent if fit width var isFitWidth = this._getOption('fitWidth'); var container = isFitWidth ? this.element.parentNode : this.element; // check that this.size and size are there // IE8 triggers resize on body size change, so they might not be var size = getSize( container ); this.containerWidth = size && size.innerWidth; }; proto._getItemLayoutPosition = function( item ) { item.getSize(); // how many columns does this brick span var remainder = item.size.outerWidth % this.columnWidth; var mathMethod = remainder && remainder < 1 ? 'round' : 'ceil'; // round if off by 1 pixel, otherwise use ceil var colSpan = Math[ mathMethod ]( item.size.outerWidth / this.columnWidth ); colSpan = Math.min( colSpan, this.cols ); // use horizontal or top column position var colPosMethod = this.options.horizontalOrder ? '_getHorizontalColPosition' : '_getTopColPosition'; var colPosition = this[ colPosMethod ]( colSpan, item ); // position the brick var position = { x: this.columnWidth * colPosition.col, y: colPosition.y }; // apply setHeight to necessary columns var setHeight = colPosition.y + item.size.outerHeight; var setMax = colSpan + colPosition.col; for ( var i = colPosition.col; i < setMax; i++ ) { this.colYs[i] = setHeight; } return position; }; proto._getTopColPosition = function( colSpan ) { var colGroup = this._getTopColGroup( colSpan ); // get the minimum Y value from the columns var minimumY = Math.min.apply( Math, colGroup ); return { col: colGroup.indexOf( minimumY ), y: minimumY, }; }; /** * @param {Number} colSpan - number of columns the element spans * @returns {Array} colGroup */ proto._getTopColGroup = function( colSpan ) { if ( colSpan < 2 ) { // if brick spans only one column, use all the column Ys return this.colYs; } var colGroup = []; // how many different places could this brick fit horizontally var groupCount = this.cols + 1 - colSpan; // for each group potential horizontal position for ( var i = 0; i < groupCount; i++ ) { colGroup[i] = this._getColGroupY( i, colSpan ); } return colGroup; }; proto._getColGroupY = function( col, colSpan ) { if ( colSpan < 2 ) { return this.colYs[ col ]; } // make an array of colY values for that one group var groupColYs = this.colYs.slice( col, col + colSpan ); // and get the max value of the array return Math.max.apply( Math, groupColYs ); }; // get column position based on horizontal index. #873 proto._getHorizontalColPosition = function( colSpan, item ) { var col = this.horizontalColIndex % this.cols; var isOver = colSpan > 1 && col + colSpan > this.cols; // shift to next row if item can't fit on current row col = isOver ? 0 : col; // don't let zero-size items take up space var hasSize = item.size.outerWidth && item.size.outerHeight; this.horizontalColIndex = hasSize ? col + colSpan : this.horizontalColIndex; return { col: col, y: this._getColGroupY( col, colSpan ), }; }; proto._manageStamp = function( stamp ) { var stampSize = getSize( stamp ); var offset = this._getElementOffset( stamp ); // get the columns that this stamp affects var isOriginLeft = this._getOption('originLeft'); var firstX = isOriginLeft ? offset.left : offset.right; var lastX = firstX + stampSize.outerWidth; var firstCol = Math.floor( firstX / this.columnWidth ); firstCol = Math.max( 0, firstCol ); var lastCol = Math.floor( lastX / this.columnWidth ); // lastCol should not go over if multiple of columnWidth #425 lastCol -= lastX % this.columnWidth ? 0 : 1; lastCol = Math.min( this.cols - 1, lastCol ); // set colYs to bottom of the stamp var isOriginTop = this._getOption('originTop'); var stampMaxY = ( isOriginTop ? offset.top : offset.bottom ) + stampSize.outerHeight; for ( var i = firstCol; i Santa Barbara County Brewery Guide 2019 A Round-Up of Our Region’s Breweries, Brewpubs, and Brewing Suppliers By Matt Kettmann All of Santa Barbara County’s breweries, brewpubs, and brewing supply stores in one convenient place — that’s what we’re presenting with our first-ever Santa Barbara County Brewery Guide. We reached out to (hopefully!) every company that fits this description from Santa Maria to Carpinteria, requested that they fill out a simple survey, and are publishing an edited version of their responses. In addition to the basics, we asked each place to name two of their flagship beers and to describe why they hold that spot in their lineup. (The two businesses that did not respond still have their contact information listed.) If we somehow missed you, we can add you to the online version of this guide. Simply email brew@independent.com. Apiary Cider, Mead & Hard Kombucha Apiary Cider, Mead & Hard Kombucha 4191 Carpinteria Ave., Ste. 10, Carpinteria; 684-6216; theapiary.co Founded: 2015 / Annual production: 150 barrels / Lineup: 15 at a time, mostly rotating Brewers: Tyler Paris, Nole Cossart, Rachna Hailey “We’re on a mission to transform incredible local ingredients into alcohol we can feel good about drinking,” said cofounder Cossart, who’s expanding in 2019. “We plan to release several batches in bottles that have been aging for a year or more, including a few single-variety, bourbon-barrel-aged, traditional honey wines.” Drink Your Flowers Hard Jun Kombucha: Made from Santa Barbara sage blossom honey and organic herbs/flowers (including green tea, rose, lavender, and hibiscus), this represents everything they love about honey, health, and fermentation. “We use honey from our hometown hills, collected by a beekeeper we know and trust,” said Cossart. “It’s fermented using our live-culture heirloom Jun Kombucha culture, which adds the benefits of probiotics to the already present vitamins and minerals of raw honey.” Crimson Gold Barrel Aged Cider: This is made from Cuyama Valley–grown organic Crimson Gold apples, a crab apple variety that packs a ton of flavor. “When fermented and barrel aged, it resembles a dry white wine with notes of stone fruit and jasmine flowers,” said Cossart, who believes this conveys the surprising bounty of this bioregion. Brass Bear Brewing and Bistro Brass Bear Brewingand Bistro 28 Anacapa St., Ste. E; 770-7651; brassbearbrewing.com Founded: 2016 / Annual production: 350 barrels / Brewers: Seth and Lindsay Anderson “Eat local, drink local, be local,” said Seth Anderson of Brass Bear in the Funk Zone, which serves its own beer, guest taps of wine, sparkling wine, and cider, as well as food like charcuterie boards, skewers, and toasted sandwiches. They also host murder-mystery food-and-beer-pairing dinners and stand-up comedy nights that are announced on Instagram. The name came from a backpacking trip through Glacier National Park, where they came face-to-face with a family of black bears. “The late-afternoon sun hit the bears just perfectly and turned them to a beautiful brass color,” said Anderson. “They glanced our way and, with a decisive grunt, carried on. We agreed over dinner that night that this would be the perfect name for our own business one day, to remind us to face our fears and keep on trekking!” Hopping Grizzly DIPA: This was their first beer on tap and is still the most popular, probably because the well-balanced double IPA packs its punch very well. Berry Patch Sour: This is what they recommend on a hot day, as the raspberries and blood oranges provide refreshing flavors and a brilliant color. The Brewhouse The Brewhouse 229 W. Montecito St.; 884-4664; sbbrewhouse.com Founded: 1998 / Annual production: 800 barrels / Lineup: Serving 19 beers on tap, with more than 50 styles made over the years. / Brewers: Pete Johnson and Casey Smith “We love beer,” said Johnson. “It’s always been our mission to brew the best possible beer while having fun doing it. One of the things I like best about this industry is the passion of the people involved. Maybe what sets us apart is consistency in vision. We’ve had the same head brewer for 20 years.” Coming soon are a red-wine-barrel-aged dubbel, a smoked hock in the rauchbier style, and the ever-popular Baseball Saison. Saint Barb’s Tripel: This Trappist-inspired Belgian ale has been brewed since the beginning, when no one else in Santa Barbara County was brewing Belgian styles. “Some people thought we were crazy,” said Johnson, “but the tripel quickly developed a fan base and has remained in our top five sellers all these years.” Motivation Destroyer IPA: The biggest sellers have always been IPAs, and the new version of this beer uses hops that weren’t available or didn’t even exist back in 1998. “My brewing style is deeply rooted in tradition, with great respect for the classics, but new ingredients and techniques continue to add new possibilities,” said Johnson. brewLAB brewLAB 4191-8 Carpinteria Ave.,Carpinteria; (507) 319-5665;brewlabcraft.com Founded: 2013, opened to public in 2014 / Annual production: 99 barrels / Lineup: Seven currently, but more than 470 recipes created! / Brewers: Steve Jarmie, Dave Mendoza, Cliff Gordon, and Peter Goldammer The artisanal “nano-brewery” is focused on creating small-batch beers on a 1.5-barrel system with an experimental approach. “Our project started in late 2012 by three home-brewing friends who all shared a passion for creating unique libations,” said Goldammer. “Everything from our bar, walk-in cooler, tap handles, patio, signage, beer menu, light fixtures, and the brewing system itself was custom designed and built by us on a shoe-string budget with very minimal investment and mostly salvaged materials. We’ve never allowed the money to drive the operations, philosophies, and holistic goals of our brewery, but simply wanted to create something different, brew the best beers possible, push the industry, and have fun doing it. More than anything, we still are extremely excited to serve our local community with a place that is enjoyable, unique, and entertaining, supplying a platform for local musicians and artists alike.” They’ve ordered a 10-barrel system and a canner, and are growing their barrel-aging program. Green Tea IPA & Gruits: Of their 470 recipes, brewLAB rarely creates the same thing twice. “Even when we attempt to do so, we are limited by our system coupled with the dynamism in the production of beer, which ultimately results in different profiles, “said Goldammer. “We enjoy celebrating this fact and openly discuss and engage with our patrons. If we had to choose a couple we bring back from time to time, I’d have to say our Green Tea IPA or one of our Gruits.” BYOB! Brew Your Own Beverage BYOB! Brew Your Own Beverage 3445 State St.; 324-4690; byobsb.com Founded: 2018 / Annual production: About five barrels combined per year, not for sale. This home-brewing supply store, which sells all sorts of devices for fermenting and beverage making, from kombucha kits to coffee roasters, was started by Aimee and Mike Kielborn and Rebecca and Trent Hammel. They all brew batches regularly. “We’re turning craft beverage fans into craft beverage creators at BYOB,” said Trent Hammel. “We don’t sell beer yet, but we have over 2,000 different home-brewing supplies!” They are launching a new website and will soon offer online ordering for delivery and pickup. Captain Fatty’s Brewery Captain Fatty’s Brewery 6489 Calle Real, Ste. D, Goleta; captainfattys.com Founded: 2013 / Annual production: 2,000 barrels / Number of beers: “Lots,” with one to two new beers per week. / Brewers: Preston Angell, Colin Honeybourne, and Jimmy Tran “We enjoy brewing new and fun beer styles for a wide audience to enjoy,” said co-owner/creative director Matt Minkus. “Our love of beer comes from its communal aspect — connecting with a friend or loved one over a unique and flavorful beer.” They recently opened a new taproom in Goleta and are partnering with Corazon Cocina to open a place in downtown Santa Barbara later this year. Kalliope: This Berliner-weisse-style ale is a mixed-fermentation beer with a tart and tropical complexity that’s bright and bold. It won a gold medal at the Great American Beer Festival in 2017 and was named Best Beer of California at the 2018 state fair. Blue IPA: The West Coast–style IPA has a firm bitterness that is true to style, perfectly balanced with a punchy bouquet of juicy hops. They also offer a rotating series of Hazy IPAs that showcase sought-after hop varieties. The Cruisery The Cruisery 501 State St.; 770-0270; thecruisery.com Founded: 2018, but owner Aron Ashland took over Santa Barbara Brewing Company, the oldest continuously operating brewery in town. / Annual production: 600 barrels / Lineup: More than 20 beers / Brewer: Dave “Zambo” Zamborski “Well-made classics and experimental beers along with some sorcery all wrapped up in an unforgettable experience,” is how Ashland describes The Cruisery’s goals. He’ll be hosting a grand opening party in April and releasing a Fruit Smoothie Ale soon. Hoppy @$ Fuck: “We don’t do any halfway,” said Ashland of this dank monster. Cruise Light: “Because that’s how we roll,” said Ashland, whose brewpub reflects Santa Barbara’s bicycling culture. Draughtsmen Aleworks Draughtsmen Aleworks Headquarters: 53 Santa Felicia Dr., Goleta; also pouring at Mosaic Locale, 1337 State St.; 387-2577; draughtsmenaleworks.com Founded: 2016, with Mosaic Locale opened in 2018 / Annual production: Fewer than 1,000 barrels / Lineup: 12-16 beers on tap / Brewers: Reno King, Scott Stefan, and Chris Van Meeuwen “Draughtsmen Aleworks is a lifestyle company dedicated to make, distribute, and serve some of our favorite classic beers and a handful of euphoric concoctions with a commitment to integrating social, economic, and environmental factors in our community into a unique business model built around sustainable business practices and philanthropic partnerships,” said cofounder Tami Snow, who runs the Good Karma Tap program, among other fundraising initiatives. “We have an indomitable spirit to brew [and] a love of the quirky and relaxed side of life and are proud to bring together a community with these core values and continually strive to do the right thing — one beer at a time.” They’ll expand into a patio space at Mosaic Locale this summer. Nama Biru: This Japanese rice lager was an immediate favorite. The name translates to “draft beer.” It is super clean and flavorful with a bit of floral. “It is a very simple beer yet refined,” said Snow. “We’d like to think it is a bit like us.” Glutenance SIPA: They offer a gluten-reduced beer series (99 percent gluten-reduced), including the Glutenance SIPA, Cougar Killer SPIA, or Cereal Killer Pale Ale. The Glutenance SIPA offers hints of apricot, mango, lemon, and nectarine. “We have found a large population of gluten-intolerant people who have missed the ability to drink beer,” said Snow. “But these gluten-reduced beers are now enjoyed by more gluten-loving patrons because they are so good!” Figueroa Mountain Brewing Co. Figueroa Mountain Brewing Co. 137 Anacapa St., Ste. F; 694-2252 x344; 45 Industrial Wy., Buellton; 694-2252 x110; 2363 Alamo Pintado Ave, Los Olivos; 694-2252 x343; figmtnbrew.com Founded: 2010 / Annual production: 27,000 barrels / Lineup: 40 different beers / Brewers: Kevin Ashford and Tim Harbage “We believe in quality and balance, in life and beer, and take pride in creating world-class, award-winning brews to be enjoyed in good company on your next adventure,” said cofounder Jaime Dietenhofer. “Our brewery’s roots run deep in the Central Coast of California, and our beers are inspired by the trails, sights, and people found in this expansive outdoor playground.” The brewery is owned by Dietehofer and his dad, Jim, who raised his family in the Santa Ynez Valley along with his wife, Judie. Headquartered in the Santa Ynez Valley, they have multiple tap room and brewing locations along the Central Coast, supported by a staff of 255 employees. Look out for 2019 releases of Tropical Magic Hazy IPA and regular releases of Locals Only collaborations, such as the August collab with Captain Fatty’s. They also host Lagerville in July and Figtoberfest in September. Davy Brown Ale: Named after a notorious explorer of our valley, this American brown ale features malt richness with notes of cocoa, balanced with subtle hoppy aromatics and bittering — just as the beer style calls for. This beer shows appreciation for classic styles and balanced beers, as well as the pride we have for our region, and has been named the best brown ale in America (and the world!). Point Conception IPA: This fresh, new West Coast IPA was added to the year-round lineup on February 1. It’s a bright beacon of vibrant and exciting hops with a pleasant, dry finish and a more modern style addition to Fig Mountain’s core selection. It’s named after Point Conception, the iconic geographical elbow of California’s coastline that defines the beginning of the Central Coast. This hallowed headland became a beacon of light on February 1, 1856, with the addition of one of California’s first lighthouses, and the brewery sees this new beer as a similarly bright and inspiring signal. Firestone Walker Brewing Co. Firestone Walker Brewing Co. Barrelworks tasting room: 620 McMurray Rd., Buellton; 697-4777; Headquarters: 1400 Ramada Dr., Paso Robles; 225-5911; firestonebeer.com Founded: 1996 / Annual production: 450,000 barrels / Lineup: About 30-40 different brands / Brewers: Matt Brynildson, Dustin Kral, and Jim Crooks Founded by Adam Firestone (aka the Bear) and David Walker (aka the Lion), Firestone Walker Brewing Company began as a small brewery with roots in wine country on California’s Central Coast. Now a regional brewery, their singular purpose remains to craft ever-better beer. “Passionately in pursuit of the perfect beer … and never satisfied,” they say. “Twenty-odd years ago we set out to change the world of beer, and, with several thousand friends, we did just that,” said Walker. “We now have a full-on rave happening in one of the oldest professions in the world; just keeping up is exciting.” DBA: The flagship Double Barrel Ale represents all that Firestone Walker holds dear: barrels, balance, and blending. The beer is partially fermented in the traditional “Union” style with linked 60-gallon oak barrels. It is then blended back with the same beer fermented in steel, leaving a beautifully balanced mild English Pale Ale. Luponic Distortion: This IPA is defined by a rotating hop series that changes every four months. “This allows us to drive unique ‘flavors through hops,’ experiment with unheard-of hopcultivars, and have immense fun in the process,” said Walker. “The beers are always incredibly drinkable and, with flavors called out ahead of time, a rich discovery of the palate.” Hollister Brewing Company Hollister Brewing Company 6980 Marketplace Dr., Goleta; 968-2810; hollisterbrewco.com Founded: 2006 by Rose family; new owner Tom Fuhrmann took over November 2018 / Annual production (in barrels): 900 / Lineup: 17 beers / Brewer: Ben Elson “We are a family-friendly environment using the highest quality ingredients in our award-winning beer,” said Fuhrmann, who’s proud to be one of the only brewpubs with a full menu and liquor license. “We make everything in the restaurant from scratch daily except the ketchup. When you come to Hollister Brewing Company, you are going to have phenomenal beer, great food, and a friendly staff experience that sets us apart.” They are now selling kegs and just began canning beers as well. Hippie Kicker IPA: This quintessential West Coast IPA is loaded with classic Pacific Northwest hops and full of citrusy, piney, and resinous flavors that make hop heads rejoice. Table 42 Red: This classic red ale is one of the few beers to be featured on the menu since 2006. It’s full of traditional and high-quality ingredients and is also used in the food, including the Red Ale Chili and Beer-Braised Brats. Institution Ale Co. Institution Ale Co. 516 State St.; 482-3777, institutionales.com Founded: 2013 / Annual production: Did not report. / Lineup: Five draft brands are distributed, plus a rotating tap list of beers in tasting room. / Brewers: Institution Ale Co. Brew Team “We are a 100 percent family-owned craft brewery focused on West Coast–style ales,” said co-owner Shaun Smith, who founded the brewery in Camarillo with his brother, Ryan, and dad, Roger. “Our Santa Barbara taproom offers a large rotating selection of 20 beers and freshly baked thin-crust pizzas and soft pretzels from our kitchen.” They also sell beer to-go in cans, growlers, and crowlers. Institution IPA & Restraint: The first is a West Coast IPA, and the second is a Maple Brown Ale. “They are two of our most popular beers and showcase the style of beers that we are known for,” said Smith. Island Brewing Company Island Brewing Company 5049 6th St., Carpinteria; 745-8272; islandbrewingcompany.com Founded: 2001 / Annual production: 2,100 barrels / Lineup: 20 beers / Brewers: Ryan Morrill and Treven Yothers “Island Brewing Company has been putting the pint in CarPINTeria and the surrounding areas for 18 years now,” said Mark Matthews, the creative director and son-in-law of founder Paul Wright. “We are an ocean-view brewery within walking distance of the beach, with a stable of solid beers across a wide range of beer styles, including the occasional barrel-aged beer on tap when the stars align.” Their beer spectrum runs from lagers and saisons to DIPAs and stouts, sold in cans, bottles, and kegs, and they regularly host live music, food trucks, fundraisers, and eclectic events like the Slow Bike Race. “Humanity’s best is often found at the intersection of craft beer and camaraderie,” said Matthews, who will be releasing their bourbon-barrel-aged Optimist double red ale for their 18th anniversary this summer. “The unbarreled version has just been tapped and is waiting for you!” Avocado Honey Ale: This signature beer uses honey from the avocado orchards that surround Carp. “No avocados are harmed while brewing this beer,” said Matthews. “The bees go into the avocado grove and make avocado honey, a darker, more molasses-like and sweeter type of honey. The whole process has sparked many conversations about people’s ideas of beer and the many things beer can be.” Paradise Pale Ale: This is the first beer that founder Paul Wright brewed, and the recipe has evolved to a slakable, medium-bodied wonder that’s gained a loyal following and is seeing new converts daily. It features a robust amount of Amarillo and Mosaic hops within a balanced malt profile, producing fruity, citrusy results. M.Special Brewing Company M.Special Brewing Company 6860 Cortona Dr., Goleta; 968-6500; mspecialbrewco.com Founded: 2016 / Annual production: 5,000 barrels / Lineup: 10-15 depending on season / Brewers: Josh Ellis, Max Baxter, Michael Alcantar, and John Trigg “Good Beer. Every Time.” is the M.Special mantra according to co-owner Chris Miller, who looks forward to the upcoming release of G-Town Grapefruit IPA, canned beers, perhaps another taproom, and expanded distribution in the year to come. M.Special American Lager: This is the flagship beer that the company started on, when their friends who became investors wondered why no one was making craft lagers. That’s because lagers are hard, but M.Special’s Josh Ellis rose to the challenge. Greatland IPA: Like many of their beers, the hoppy Greatland pays homage to Goleta, which is also known as The Good Land. Naughty Oak Brewing Company Naughty Oak Brewing Company 165 S. Broadway St., Ste. 102, Orcutt; 287-9663; naughtyoak.com Night Lizard Brewing Company Night Lizard Brewing Company 607 State St.; 770-2956; nightlizardbrew.com Founded: 2016 / Annual production: 400 barrels / Number of beers: 16 on tap / Brewers: Clayton Brackley and Chip Nasser “Night Lizard Brewing Company is committed to producing the highest quality craft beers using the freshest local ingredients, while inspiring and educating the public on current environmental challenges facing the Central Coast,” said Nasser, who just started an in-house yeast propagation program. “We have several plates out in fruit trees around the city, and we will be collecting/assessing the strains we captured in early April. We will then be brewing a local wild ale early summer this year with the wild yeast we harvested.” They are now canning beers in 32-ounce Crowlers, producing a “Terroir” series of French saison mixed with wine grapes and aged in oak, and readying their solera-style Grand Cru 2019 for the holidays. Experimental Taps: Try any of the experimental beers they have on tap. “They allow us to be creative, innovative, and relevant while using the freshest local seasonal ingredients available,” said Nasser. Pure Order Brewing Company Pure Order Brewing Company 410 N. Quarantina St.; 966-2881; pureorderbrewing.com Founded: 2014 / Annual production: 1,200 barrels / Lineup: Four flagship beers with rotating seasonal offerings / Brewers: James and David Burge “Our hope is to craft a beer that is the embodiment of everything that makes our small little beach town and its lifestyle among the most desired in the world,” said David Burge, who will be celebrating Pure Order’s fifth anniversary with a big bash on Saturday, April 13. Santa Barbara Common Ale: “This has become the beer that really defines our brewery,” said Burge. “It is unique and greatly inspired by the style employed by the godfathers of American craft beer up at Anchor Brewing Company.” Santa Barbara Lager: Burge is also very proud of this lighter beer “simply because it can be enjoyed in the temperate climate of Santa Barbara all year round.” Rincon Brewery Rincon Brewery 5065 Carpinteria Ave., Carpinteria; 4100 Telegraph Rd., Ventura; 684-6044; rinconbrewery.com Founded: 2014 / Annual production: 10,000 barrels / Lineup: More than 25 different beers, with 18 taps in Carp and 25 in Ventura / Brewer: Chas Cloud “Our inspiration originates from the beautiful Rincon Beach coastline to the fresh, thriving Carpinteria farmlands,” said co-founder Mark Hyatt, who recently opened his Ventura facility after two years of development. “With a strong commitment to preservation and restoration of our natural environment, we promise to bring you the freshest, most exceptional, handcrafted beers the Central Coast has to offer. Our vision is to create an environment at Rincon Brewery where friendships will be made, businesses will be shaped, and conversations will be cultivated.” Beached Hazy IPA: Currently the top seller, this beer is full of hops that provide amazing tropical fruit flavors. Santa Barbara Cider Company Santa Barbara Cider Company 325 Rutherford St., Ste. D, Goleta; 695-2457; sbcider.com Founded: 2017 / Annual production: did not report. / Lineup: 65 ciders rotating through 12 taps / Brewers: Ben Schroeder, Nik Shafer, Twilight Robin, and Kayla Pence “Our mission is to locally produce delicious hard ciders with simple and real ingredients to deliver a delicious and casual tasting experience,” said Robin, a co-owner with Shafer and Schroeder. “We source fresh-pressed juices (nothing from concentrate) and do not add artificial colors, flavors, or preservatives.” The ciders are totally gluten-free. They recently expanded their Old Town Goleta patio, added 40 new cider varieties, and will be on tap at the Santa Barbara Bowl this season. Great Lei & Deepen: These two ciders, flavored with pineapple and mulberry juice respectively, have been on tap since the company started pouring two years ago. Santa Maria Brewing Company Santa Maria Brewing Company 1451 Fairway Dr., Santa Maria; 922-2225; smbrew.com More locations in San Luis Obispo County, plus a new pub and distillery coming soon to Skyway Drive in Santa Maria. Smoke Mountain Brewery Smoke Mountain Brewery 6520 Casitas Pass Rd.; 804-7954; smokemtn.com Founded: 2015 / Annual production: 30-40 barrels / Lineup: 12-15 beers / Brewers: Kim Leonard and Edward, Darren, and Jill Siple Smoke Mountain is a boutique farm brewery located on top of Rincon Mountain, on the border of Ventura and Santa Barbara counties. “On our farm, we grow hops, barley, and an abundance of produce that we incorporate into our beers whenever possible,” said Jill Siple, whose team also runs Rincon Mountain Winery. “Each year, we increase our barley and hop production with the goal of being a self-sufficient farm brewery.” 2018 Estate Harvest Blend: This third-annual brew pairs wine grapes with beer. This year’s blend is an estate saison co-fermented with grenache grapes. Estate Fig Leaf: This full-estate pale ale features honey and fig leaves from Rincon Mountain as well as homegrown barley and hops. “Fig leaves provide interesting earthy notes of almond and coconut that pair beautifully with the honey collected from our bee boxes here on the mountain,” said Siple. Solvang Brewing Company Solvang Brewing Company 1547 Mission Dr, Solvang; 688-2337; 234 N. H St., Lompoc; (888) 481-2337; solvangbrewing.com Founded: 2010 /Annual production: did not report / Lineup: 12 beers / Brewers: Chris Baugh, Logan Preston, and Heath Renfrow “Proudly Brewed, Proudly Consumed, Enjoy Yourself!” is the motto of Solvang Brewing Company, whose ownership roots go back to 1911. “These six words express our pride, strength, presence, pleasure, and appreciation of this craft,” said Stephen Renfrow, who is looking forward to new packaging lines, improved storage, and upgraded distribution abilities in 2019. “We focus conscientiously and diligently on creating the most outstanding craft beers our consumers desire until we feel and they feel we have met or exceeded those expectations.” Blue Eyed Blonde Lager & Valhalla IPA: This European-style lager and West Coast-style IPA reflect the brewery’s desire to be a Northern European–themed brewery on California’s West Coast. “We try to create products that are reflective of these two regions and incorporate attributes of each region into the beer styles,” said Renfrow. Telegraph Brewing Company Telegraph Brewing Company 418 N. Salsipuedes St., 963-5018; telegraphbrewing.com Founded: 2006 / Annual production: 2,200 barrels / Lineup: 16 taps ranging from modern IPAs and classic Belgians to sour and wood-aged beers/ Brewer: Peter Baer Telegraph Brewing Company was founded by Brian Thompson, who sold to Epic Brewing Company in 2017, which operates breweries in Salt Lake City and Denver. “We make use of as many locally grown ingredients as we can,” said Darin McGregor, Epic’s VP of sales and marketing. “Our goal is to produce uniquely American beer styles that are imbued with a spirit of invention and creativity, but always with a nod toward history.” Coming up in 2019 are The Imperial Barrel-Aged Pastry Porter with Vanilla and Hazelnuts and the Double Dry-Hopped, Double New England-style IPA, a big, unfiltered IPA featuring huge, late-addition Citra, Amarillo, and Simcoe hops. Santa Barbara Mosaic IPA: This modern take on an IPA uses Citra and Mosaic hops and a unique blend of the West Coast and East Coast approaches to this style. Telegraph White Ale: This nod to an Old World Belgian–style white ale, with traditional spices, includes the modern twist of Californian chamomile. Third Window Brewing Company Third Window Brewing Company 406 E. Haley St., Ste. 3; 979-5090; thirdwindowbrewing.com Founded: 2016 / Annual production: 1,200 barrels / Lineup: 113 beers created so far / Brewers: Kristopher Parker, Eric Hansen, Nick Conn, and Alan Cain “We view each batch of beer as a vintage and are dedicated to the process of creating beer expressive of Santa Barbara,” said Parker. “We are friends dedicated to creating the greatest beer imaginable. We’re completing our third summer of méthode traditionnelle beers created in our koelschip and barn in the Santa Ynez Valley. We should start seeing many variants of bottled spontaneous beer this year.” Walkabout Imperial Stout: This stout is made with the brewery’s chocolate-producing neighbors, Twenty-Four Blackbirds, along with oranges foraged from Santa Barbara backyards. Vermont(ish) IPA: The relatively quick turn of these beers allows for rapid progression and many iterations. “We started naming all of the beers after fads and through the process developed a love for hops,” said Parker. Go figure! Topa Topa Brewing Company Topa Topa Brewing Company Tasting room: 120 Santa Barbara St.; Headquarters: 104 E. Thompson Blvd., Ventura; 628-9255; topatopa.beer Founded: 2015 / Annual production: 5,000 barrels / Lineup: Three are distributed, but ranges from 8 to 15 on tap / Brewers: Casey Harris, Justin Clemente, Jack Dill, Graham Strong, and Joseph Isaac “Craftsmanship, quality, and community spirit” is the mantra, said cofounder/CEO Jack Dyer and Heidi McElvaney. “Topa Topa Brewing Company combines craftsmanship with high-quality ingredients to produce the finest in craft beer, served in an environment that fosters community,” they explained. “In all aspects of our business, we strive to be as environmentally responsible as possible. We believe in the power of good vibes and great beers.” They are expanding production in 2019 with a new Ventura facility that will feature a larger tasting room and beer garden. Chief Peak IPA & Sespe Pilsner: Both of these beers call out features of the regional landscape that Topa Topa takes pride in and helps to protect through partnerships with environmental nonprofits. Valley Brewers Valley Brewers 515 4th Pl., Solvang; 691-9159; valleybrewers.com Founded: 2012; Owners: Chris Kelly and Sandy Harrison After starting a home-brew club, Kelly and Harrison opened this supply store “with a large selection for any zymurgist,” as well as cheese-making equipment. “We have many customers who have won medals, including the National Homebrewers Competition,” said Kelly. “And we have customers who have become pro brewers and opened their own breweries.” var $grid = $('.grid').masonry({ itemSelector: '.grid-item', columnWidth: '.grid-sizer', percentPosition: true }); $grid.on( 'click', '.grid-item', function() { // change size of item via class $( this ).toggleClass('grid-item--gigante'); // trigger layout $grid.masonry(); // }); $grid.on( 'layoutComplete', function( event, laidOutItems ) { console.log( 'Masonry layout complete with ' + laidOutItems.length + ' items' ); }); // init Masonry var $grid = $('.grid').masonry({ // options... }); $('.grid').masonry({ gutter: 10 }); // layout Masonry after each image loads $grid.imagesLoaded().progress( function() { $grid.masonry('layout'); });