Skip to Content
Pottery Barn
Pottery Barn Kids
Pottery Barn Teen
Williams Sonoma
Williams Sonoma Home
West Elm
Rejuvenation
GreenRow
Do Not Sell My Personal Information
x
My Account
Dropdown
Sign In
Create an Account
B2B Member Sign-In
Track Order
Key Rewards
Credit Card
Favorites
Track Order
Favorites
Cart
Mark and Graham
Back arrow
search
Click to search for products.
Navigation
Mark and Graham
Search
Account
Access your orders, manage rewards, save your store, and more.
Sign In
Create Account
Track Orders
Track & manage your orders
Key Rewards
Key Rewards
Earn rewards and enjoy exclusive benefits
Favorites
Save your favorite items
Gift Guide
Gift Cards
B2B Member Sign In
Cart
Back arrow
search
Click to search for products.
New
Bags
Accessories
Travel
Home
Entertaining
Outdoor
Sport
Baby + Kids
Wedding
Sale
bark & graham
.content-mfe .responsive-content .responsive-video-wrapper { padding-bottom: 46% !important; } @media screen and (max-width: 768px) { .content-mfe .responsive-content .responsive-devicetype-mobile .responsive-video-wrapper { padding-bottom: 143% !important; } }
.content-mfe .responsive-content .responsive-video-wrapper { padding-bottom: 45%; } @media screen and (max-width: 768px) { .content-mfe .responsive-content .responsive-devicetype-mobile .responsive-video-wrapper { padding-bottom: 139%; } }
.content-mfe .responsive-content .responsive-video-wrapper { padding-bottom: 45%; } @media screen and (max-width: 768px) { .content-mfe .responsive-content .responsive-devicetype-mobile .responsive-video-wrapper { padding-bottom: 139%; } }
h2.hp-h2-trending-products { color: #2d2d2d; padding: 0 0 1.25rem 0; font-size: 3.2vw; width: 100%; letter-spacing: 0.0625rem; font-weight: 500; }
#design-chat { height: 0 !important; }
Gift Guide
Bags
Accessories
Travel
Home
Entertaining
Pet
Baby + Kids
Wedding
Sale
#design-chat { height: 0 !important; } .mobile-video-hero .responsive-video-wrapper { padding-bottom: 149% !important; }
#design-chat { height: 0 !important; } .mobile-video-hero .responsive-video-wrapper { padding-bottom: 149% !important; }
#design-chat { height: 0 !important; } .mobile-video-hero .responsive-video-wrapper { padding-bottom: 149% !important; }
"\n mboxCreate(\"#mbox-490983428\",'RVI');\n\n "
"\nfunction getElmSelector() {\n const TAB_ELM_SELECTOR = \".hp-tabbed-list__tab\";\n const CONTENT_ELM_SELECTOR = \".hp-tabbed-content-container > *\";\n const ACTIVE_ELM_SELECTOR = \".tabbed-content-with-scroller .active\";\n\n return {TAB_ELM_SELECTOR, CONTENT_ELM_SELECTOR, ACTIVE_ELM_SELECTOR};\n}\n\nfunction selectAllElms(selector) {\n const elms = document.querySelectorAll(selector);\n return elms ? elms : [];\n}\n\nfunction activateTabAndContent(target, contentElements) {\n // find tab index of selected tab\n const selectedDataName = target.dataset.name;\n console.log(selectedDataName);\n const selector = getElmSelector().TAB_ELM_SELECTOR;\n const tabNameArray = getElmntsArray(selector).map((t) => t.dataset.name);\n\n const activeTabIndex = tabNameArray.indexOf(selectedDataName);\n\n target.classList.add(\"active\");\n setTimeout(function(){window.dispatchEvent(new Event(\"resize\"));}, 10);\n\n if (activeTabIndex > -1) {\n contentElements[activeTabIndex].classList.add(\"active\");\n console.log(\"tab index found\");\n } else {\n console.log(activeTabIndex);\n console.log(contentElements[activeTabIndex]);\n\n console.log(\"tab index not found\");\n resetActiveTab();\n }\n}\n\n// removes the \"active\" class from every element that has it within the .tabbed-content-with-scroller\nfunction removeAllActive() {\n // get all active elements and remove the active class\n const selector = getElmSelector().ACTIVE_ELM_SELECTOR;\n const activeElms = selectAllElms(selector);\n for (let elm of activeElms) {\n if (elm.classList.contains(\"active\")) elm.classList.remove(\"active\");\n }\n}\n\nfunction getElmntsArray(selector) {\n const nodes = selectAllElms(selector);\n return Array.prototype.slice.call(nodes);\n}\n\n// Tab Activation event handler\nfunction handleTabSelected(event) {\n removeAllActive();\n const selector = getElmSelector().CONTENT_ELM_SELECTOR;\n const contentElms = getElmntsArray(selector);\n activateTabAndContent(event.target, contentElms);\n}\n\n// removes the \"active\" class from every element that has it within the .tabbed-content-with-scroller\n// activates the first tab and its content by default\nfunction resetActiveTab() {\n removeAllActive();\n const tabSelector = getElmSelector().TAB_ELM_SELECTOR;\n const contentSelector = getElmSelector().CONTENT_ELM_SELECTOR;\n const tabs = getElmntsArray(tabSelector);\n const content = getElmntsArray(contentSelector);\n\n tabs[0].classList.add(\"active\");\n content[0].classList.add(\"active\");\n}\n\n// called when the component is mounted to register tab activation event\nfunction registerHPTabEvents() {\n const tabSelector = getElmSelector().TAB_ELM_SELECTOR;\n const tabElms = selectAllElms(tabSelector);\n for (let tab of tabElms) {\n tab.addEventListener(\"click\", handleTabSelected);\n }\n\n resetActiveTab();\n}\nregisterHPTabEvents();\n"
.content-mfe .responsive-content .responsive-video-wrapper { padding-bottom: 46% !important; } @media screen and (max-width: 768px) { .content-mfe .responsive-content .responsive-devicetype-mobile .responsive-video-wrapper { padding-bottom: 143% !important; } }
.content-mfe .responsive-content .responsive-video-wrapper { padding-bottom: 45%; } @media screen and (max-width: 768px) { .content-mfe .responsive-content .responsive-devicetype-mobile .responsive-video-wrapper { padding-bottom: 139%; } }
.content-mfe .responsive-content .responsive-video-wrapper { padding-bottom: 45%; } @media screen and (max-width: 768px) { .content-mfe .responsive-content .responsive-devicetype-mobile .responsive-video-wrapper { padding-bottom: 139%; } }
h2.hp-h2-trending-products { color: #2d2d2d; padding: 0 0 1.25rem 0; font-size: 3.2vw; width: 100%; letter-spacing: 0.0625rem; font-weight: 500; }
#design-chat { height: 0 !important; }
Gift Guide
Bags
Accessories
Travel
Home
Entertaining
Pet
Baby + Kids
Wedding
Sale
#design-chat { height: 0 !important; } .mobile-video-hero .responsive-video-wrapper { padding-bottom: 149% !important; }
#design-chat { height: 0 !important; } .mobile-video-hero .responsive-video-wrapper { padding-bottom: 149% !important; }
#design-chat { height: 0 !important; } .mobile-video-hero .responsive-video-wrapper { padding-bottom: 149% !important; }
"\n mboxCreate(\"#mbox-490983428\",'RVI');\n\n "
"\nfunction getElmSelector() {\n const TAB_ELM_SELECTOR = \".hp-tabbed-list__tab\";\n const CONTENT_ELM_SELECTOR = \".hp-tabbed-content-container > *\";\n const ACTIVE_ELM_SELECTOR = \".tabbed-content-with-scroller .active\";\n\n return {TAB_ELM_SELECTOR, CONTENT_ELM_SELECTOR, ACTIVE_ELM_SELECTOR};\n}\n\nfunction selectAllElms(selector) {\n const elms = document.querySelectorAll(selector);\n return elms ? elms : [];\n}\n\nfunction activateTabAndContent(target, contentElements) {\n // find tab index of selected tab\n const selectedDataName = target.dataset.name;\n console.log(selectedDataName);\n const selector = getElmSelector().TAB_ELM_SELECTOR;\n const tabNameArray = getElmntsArray(selector).map((t) => t.dataset.name);\n\n const activeTabIndex = tabNameArray.indexOf(selectedDataName);\n\n target.classList.add(\"active\");\n setTimeout(function(){window.dispatchEvent(new Event(\"resize\"));}, 10);\n\n if (activeTabIndex > -1) {\n contentElements[activeTabIndex].classList.add(\"active\");\n console.log(\"tab index found\");\n } else {\n console.log(activeTabIndex);\n console.log(contentElements[activeTabIndex]);\n\n console.log(\"tab index not found\");\n resetActiveTab();\n }\n}\n\n// removes the \"active\" class from every element that has it within the .tabbed-content-with-scroller\nfunction removeAllActive() {\n // get all active elements and remove the active class\n const selector = getElmSelector().ACTIVE_ELM_SELECTOR;\n const activeElms = selectAllElms(selector);\n for (let elm of activeElms) {\n if (elm.classList.contains(\"active\")) elm.classList.remove(\"active\");\n }\n}\n\nfunction getElmntsArray(selector) {\n const nodes = selectAllElms(selector);\n return Array.prototype.slice.call(nodes);\n}\n\n// Tab Activation event handler\nfunction handleTabSelected(event) {\n removeAllActive();\n const selector = getElmSelector().CONTENT_ELM_SELECTOR;\n const contentElms = getElmntsArray(selector);\n activateTabAndContent(event.target, contentElms);\n}\n\n// removes the \"active\" class from every element that has it within the .tabbed-content-with-scroller\n// activates the first tab and its content by default\nfunction resetActiveTab() {\n removeAllActive();\n const tabSelector = getElmSelector().TAB_ELM_SELECTOR;\n const contentSelector = getElmSelector().CONTENT_ELM_SELECTOR;\n const tabs = getElmntsArray(tabSelector);\n const content = getElmntsArray(contentSelector);\n\n tabs[0].classList.add(\"active\");\n content[0].classList.add(\"active\");\n}\n\n// called when the component is mounted to register tab activation event\nfunction registerHPTabEvents() {\n const tabSelector = getElmSelector().TAB_ELM_SELECTOR;\n const tabElms = selectAllElms(tabSelector);\n for (let tab of tabElms) {\n tab.addEventListener(\"click\", handleTabSelected);\n }\n\n resetActiveTab();\n}\nregisterHPTabEvents();\n"