1<!DOCTYPE html><!-- Last Published: Wed Sep 30 2026 16:17:40 GMT+0000 (Coordinated Universal Time) --><html data-wf-domain="harborview-finishworks.webflow.io" data-wf-page="6a0b1cc0aebf6873026de1d5" data-wf-site="682f3dbbd036f316ac014c2f" lang="en" data-wf-collection="6a0b1cbfaebf6873026de199" data-wf-item-slug="staircases"><head><meta charset="utf-8"/><link href="https://cdn.prod.website-files.com" rel="preconnect" crossorigin="anonymous"/><title>Custom Staircases | Harborview Finishworks</title><meta content="Custom staircase design and construction by Harborview Finishworks, serving New Hampshire and Southern Maine." name="description"/><meta content="Custom Staircases | Harborview Finishworks" property="og:title"/><meta content="Custom staircase design and construction by Harborview Finishworks, serving New Hampshire and Southern Maine." property="og:description"/><meta content="https://cdn.prod.website-files.com/685b255d3764c6b35d03a2ea/6a4c1a52ab1a03c02f1b63fd_20260522gp-66037.jpg" property="og:image"/><meta content="Custom Staircases | Harborview Finishworks" name="twitter:title"/><meta content="Custom staircase design and construction by Harborview Finishworks, serving New Hampshire and Southern Maine." name="twitter:description"/><meta content="https://cdn.prod.website-files.com/685b255d3764c6b35d03a2ea/6a4c1a52ab1a03c02f1b63fd_20260522gp-66037.jpg" name="twitter:image"/><meta property="og:type" content="website"/><meta content="summary_large_image" name="twitter:card"/><meta content="width=device-width, initial-scale=1" name="viewport"/><link href="https://cdn.prod.website-files.com/682f3dbbd036f316ac014c2f/css/harborview-finishworks.shared.5b50916ef.min.css" rel="stylesheet" type="text/css" integrity="sha384-W1CRbvTiItVPH8/fRzCDZMNfGTmNIgVnMODf2ZLK/kTAaQSF2JPZY1AsckTecQu3" crossorigin="anonymous"/><link href="https://fonts.googleapis.com" rel="preconnect"/><link href="https://fonts.gstatic.com" rel="preconnect" crossorigin="anonymous"/>
1<script src="https://ajax.googleapis.com/ajax/libs/webfont/1.6.26/webfont.js" type="text/javascript"></script>
1<script type="text/javascript">WebFont.load({ google: { families: ["Manrope:300,400,500,600,700","Noto Serif:300,400,500,600,700"] }});</script>
1<script type="text/javascript">!function(o,c){var n=c.documentElement,t=" w-mod-";n.className+=t+"js",("ontouchstart"in o||o.DocumentTouch&&c instanceof DocumentTouch)&&(n.className+=t+"touch")}(window,document);</script>
1<link href="https://cdn.prod.website-files.com/682f3dbbd036f316ac014c2f/6a021178b3e85f732f59d5b7_H-icomoon.png" rel="icon" type="image/png" sizes="32x32" media="(prefers-color-scheme: light)"/><link href="https://cdn.prod.website-files.com/682f3dbbd036f316ac014c2f/6a021178b3e85f732f59d5b7_H-icomoon.png" rel="icon" type="image/png" sizes="32x32" media="(prefers-color-scheme: dark)"/><link href="https://cdn.prod.website-files.com/682f3dbbd036f316ac014c2f/6a02117869fffd93dd155274_H-icomoon.png" rel="icon" type="image/png" sizes="48x48"/><link href="https://cdn.prod.website-files.com/682f3dbbd036f316ac014c2f/682f7a460204f5460f168485_webclip.png" rel="apple-touch-icon"/>
1<script type="application/ld+json"> 2{ 3 "@context": "https://schema.org", 4 "@type": "WebPage", 5 "name": "Staircases", 6 "description": "Custom-built staircases combining structural precision and design.", 7 "url": "/services/staircases", 8 "inLanguage": "en", 9 "dateModified": "2026-08-03T22:17:45.321Z", 10 "datePublished": "2026-08-03T22:17:45.321Z", 11 "about": { 12 "@type": "Service", 13 "name": "Staircases", 14 "description": "Custom-built staircases combining structural precision and design.", 15 "provider": { 16 "@type": "LocalBusiness", 17 "name": "Harborview Finishworks", 18 "telephone": "603-457-4620", 19 "email": "[email protected]", 20 "address": { 21 "@type": "PostalAddress", 22 "addressRegion": "NH", 23 "addressCountry": "US" 24 }, 25 "areaServed": [ 26 { 27 "@type": "City", 28 "name": "Portsmouth" 29 }, 30 { 31 "@type": "City", 32 "name": "Dover" 33 }, 34 { 35 "@type": "City", 36 "name": "Exeter" 37 }, 38 { 39 "@type": "City", 40 "name": "Hampton" 41 }, 42 { 43 "@type": "City", 44 "name": "Kittery" 45 }, 46 { 47 "@type": "City", 48 "name": "York" 49 } 50 ], 51 "sameAs": [ 52 "https://www.facebook.com/profile.php?id=61574990229449" 53 ] 54 }, 55 "image": "https://cdn.prod.website-files.com/685b255d3764c6b35d03a2ea/6a4c1a52ab1a03c02f1b63fd_20260522gp-66037.jpg" 56 }, 57 "mainEntity": { 58 "@type": "FAQPage", 59 "mainEntity": [ 60 { 61 "@type": "Question", 62 "name": "Do you offer finish carpentry across the Seacoast and Southern Maine?", 63 "acceptedAnswer": { 64 "@type": "Answer", 65 "text": "Yes. Harborview Finishworks provides custom finish carpentry â trim, crown molding, built-ins, wainscoting, and coffered ceilings â throughout the New Hampshire & Southern Maine Seacoast's (New Hampshire - Strafford & Rockingham Counties and beyond) (Main - York, Cumberland, and Southern Oxford Counties and beyond)." 66 } 67 }, 68 { 69 "@type": "Question", 70 "name": "What's the difference between custom finish carpentry and general carpentry?", 71 "acceptedAnswer": { 72 "@type": "Answer", 73 "text": "As finish carpenters, we simply focus on the finished product from start to finish. We anticipate as many details as possible to make sure that you love your finished product. Not all carpe
73ntry is the same caliber or quality. Knowledge of the history of carpentry is where we start so we can incorporate as many skill sets as required to meet design or dream ideas. We focus on probability not possibility. Where many will say things like 'no, that's not feasible' we ask 'how can we achieve this?' We love the challenge and creating wonder in our clients lives and spaces." 74 } 75 }, 76 { 77 "@type": "Question", 78 "name": "Can you match existing trim and molding in an older home?", 79 "acceptedAnswer": { 80 "@type": "Answer", 81 "text": "Yes â matching historic millwork is one of our specialties. We can outsource original trim profiles, casings, and built-ins. New work should blend seamlessly where it meets old. Much of our finish work is in pre-1940s homes across the Seacoast, where preserving character matters as much as craftsmanship." 82 } 83 }, 84 { 85 "@type": "Question", 86 "name": "What is high-end finish carpentry?", 87 "acceptedAnswer": { 88 "@type": "Answer", 89 "text": "High-end finish carpentry is the detailed woodwork that gives a home its character: custom trim and crown molding, built-ins, wainscoting and paneling, coffered ceilings, mantels, and cabinetry. Unlike rough framing, it's the visible, precision layer. Harborview Finishworks specializes in this work across the New Hampshire Seacoast and Southern Maine." 90 } 91 } 92 ] 93 } 94} 95</script>
95<!-- Keep this css code to improve the font quality--> 96<style> 97 * { 98 -webkit-font-smoothing: antialiased; 99 -moz-osx-font-smoothing: grayscale; 100 -o-font-smoothing: antialiased; 101} 102</style> 103 104<!-- Google tag (gtag.js) -->
vendor: 64 bytes, lines 104-105
104 105<script async src="https://www.googletagmanager.com/gtag/js?id=
105G-XEFSG1R6HS
vendor: 12 bytes, line 105
105"></script>
106<script> 107
vendor: 134 bytes, lines 107-111
107window.dataLayer = window.dataLayer || []; 108 function gtag(){dataLayer.push(arguments);} 109 gtag('js', new Date()); 110 111 gtag('config', '
111G-XEFSG1R6HS
vendor: 4 bytes, line 111
111');
112</script>
112 113
114<script src="https://app.termly.io/resource-blocker/e761061c-dbb7-4f54-92e5-bf343cd49d24?autoBlock=on"><a href="#" class="termly-display-preferences">Consent Preferences</a></script>
114 115 116<!-- === Harborview desktop nav: hover brackets + native dropdown on hover === --> 117<style> 118/* Hover brackets on top-level nav links */ 119.navbar_link{position:relative;} 120.navbar_link::before,.navbar_link::after{opacity:0;color:#B28B0A;font-weight:600;display:inline-block;transition:opacity .2s ease,transform .2s ease;} 121.navbar_link::before{content:"[";transform:translateX(8px);margin-right:2px;} 122.navbar_link::after{content:"]";transform:translateX(-8px);margin-left:2px;} 123.navbar_link:hover::before,.navbar_link:hover::after, 124.navbar_link.is-active::before,.navbar_link.is-active::after{opacity:1;transform:translateX(0);} 125/* Services toggle is a .navbar_link too â never bracket it (chevron only) */ 126.navbar_link.w-dropdown-toggle::before,.navbar_link.w-dropdown-toggle::after{content:none !important;} 127/* Hover brackets on dropdown category links */ 128.navbar_ddlink{position:relative;} 129.navbar_ddlink::before,.navbar_ddlink::after{color:#B28B0A;font-weight:600;opacity:0;display:inline-block;transition:opacity .2s ease,transform .2s ease;} 130.navbar_ddlink::before{content:"[";transform:translateX(6px);margin-right:.4ch;} 131.navbar_ddlink::after{content:"]";transform:translateX(-6px);margin-left:.4ch;} 132.navbar_ddlink:hover::before,.navbar_ddlink:hover::after{opacity:1;transform:translateX(0);} 133/* Dropdown links never carry an active state (dropdown closes on click) */ 134.navbar_ddlink.w--current::before,.navbar_ddlink.w--current::after, 135.navbar_ddlink.is-active::before,.navbar_ddlink.is-active::after{opacity:0 !important;} 136/* Dropdown links keep the navy color even on the current page (no blue active state) */ 137.navbar_ddlink,.navbar_ddlink.w--current,.navbar_ddlink.is-active{color:#0A2D4B !important;} 138/* Open the native Webflow dropdown on hover (desktop only, above the mobile breakpoint) */ 139@media (min-width:1041px){ 140 .navbar_link.w-dropdown-toggle{pointer-events:none;} 141 .w-dropdown:hover .navbar_ddlist.w-dropdown-list{display:block !important;opacity:1;visibility:visible;} 142} 143/* Testimonials slider dots: pearl outline when inactive, gold when active */ 144.slider_dot{border:1px solid #FFFDF4 !important;box-sizing:border-box;} 145.slider_dot.is-active{border:1px solid #B28B0A !important;background-color:#B28B0A !important;} 146/* Related-projects carousel dots: gold outline (light section), gold fill when active */ 147.related_dots{display:flex;justify-content:center;gap:.6rem;margin-top:1.75rem;} 148.related_dots .slider_dot{width:14px;height:14px;border-radius:50%;padding:0;cursor:pointer;background-color:transparent !important;border:1px solid #B28B0A !important;box-sizing:border-box;transition:background-color .2s ease;} 149.related_dots .slider_dot.is-active{background-color:#B28B0A !important;border:1px solid #B28B0A !important;} 150</style>
151<script> 152(function(){ 153 function ready(fn){if(document.readyState!=='loading'){fn();}else{document.addEventListener('DOMContentLoaded',fn);}} 154 ready(function(){ 155 /* Mark current page active on top-level nav links only (dropdown links need no active state) */ 156 var path=(location.pathname.replace(/\/+$/,'')||'/'); 157 document.querySelectorAll('.navbar_link:not(.w-dropdown-toggle)').forEach(function(a){ 158 var href=a.getAttribute&&a.getAttribute('href'); 159 if(!href||href.charAt(0)==='#')return; 160 var ap=href.replace(/^https?:\/\/[^/]+/,'').replace(/\/+$/,'')||'/'; 161 if(ap===path)a.classList.add('is-active'); 162 }); 163 /* Strip any active-state classes Webflow auto-adds to dropdown category links */ 164 document.querySelectorAll('.navbar_ddlink.w--current,.navbar_ddlink.is-active').forEach(function(a){ 165 a.classList.remove('w--current');a.classList.remove('is-active'); 166 }); 167 }); 168})(); 169</script>
169 170 171<!-- === Harborview buttons: ghost fill slide-up on hover === --> 172<style> 173.button > *:not(.button_fill) { position: relative; z-index: 1; } 174.button.is-ghost:hover .button_fill { transform: translateY(0); } 175/* On-dark ghost (Call Now): frosted 5px blur behind the button at rest */ 176.button.is-ghost.is-on-dark{-webkit-backdrop-filter:blur(5px);backdrop-filter:blur(5px);} 177</style> 178 179<!-- === Harborview hero: auto-cycling image slides behind the tabs === --> 180<style> 181.hero_component .hero_slides{position:absolute !important;inset:0 !important;z-index:1 !important;width:100%;height:100%;overflow:hidden;} 182.hero_component .hero_slides .hero-img{position:absolute !important;inset:0 !important;width:100% !important;height:100% !important;object-fit:cover !important;opacity:0 !important;transform:scale(1.02);transition:opacity 1s ease !important;z-index:1;} 183.hero_component .hero_slides .hero-img.is-active{opacity:1 !important;z-index:2;animation:hbvKenBurns 5.6s ease-out forwards;} 184@keyframes hbvKenBurns{from{transform:scale(1.02);}to{transform:scale(1.09);}} 185.hero_component .hero_scrim{z-index:3 !important;} 186.hero_component .hero_content,.hero_component .hero_tabs,.hero_component .hero_trust{z-index:4 !important;} 187</style> 188 189<!-- === Harborview mobile nav: take over at â¤1040px + drawer styling === --> 190<style> 191/* Remove the old duplicate custom burger + menu system entirely */ 192.navbar_burger{display:none !important;} 193/* Switch desktopâmobile nav at 1040px (design default is 991px) */ 194@media screen and (max-width:1040px){ 195 .navbar_component:not(.mobile){display:none !important;} 196 .navbar_component.mobile{display:flex !important;flex-flow:row;justify-content:space-between;align-items:center;width:100%;max-width:none;height:70px;min-height:0;margin-left:auto;margin-right:auto;padding-left:0;padding-right:0;inset:0% 0% auto;} 197 .nav_mobile-wrapper{display:flex;justify-content:space-between;align-items:center;width:100%;max-width:90vw;margin-left:auto;margin-right:auto;} 198 /* Uniform logo left margin on every page (design zeroes it only on the current page via .w--current) */ 199 .nav-logo,.nav-logo.w--current{margin-left:0 !important;} 200 .logo{width:100%;max-width:125px;} 201 .mobile-nav-button{display:flex !important;z-index:99;width:50px;height:50px;padding:.75rem;border-radius:.125rem;background-color:#b28b0a;
201-webkit-backdrop-filter:blur(7px);backdrop-filter:blur(7px);flex-flow:row;justify-content:center;align-items:stretch;position:static;} 202 .mobile-nav-button:hover{border:1px solid #b28b0a;background-color:#0a2d4b;transform:scale(1.05);} 203 /* Original right-side drawer: full-height, 85vw max width */ 204 .mobile-nav-menu{display:flex !important;position:absolute;z-index:11;inset:0% 0% 0% auto;height:100vh !important;width:100% !important;max-width:85vw !important;gap:0;border-left:1px solid #856606;background-color:#0a2d4b;-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);flex-flow:column;grid-template-columns:auto;grid-auto-flow:row;place-content:start center;align-items:flex-start;} 205 /* Drawer content: vertical layout (design's base rules lay these out horizontally at >=992px) */ 206 .mobile-nav-content{z-index:5;gap:0;flex-flow:column !important;justify-content:center;align-items:center;width:100%;display:flex !important;position:relative;} 207 .mobile-nav-menu .nav-link-wrap{z-index:2;column-gap:1.25rem;row-gap:1.25rem;flex-flow:column !important;flex:0 0 auto;grid-template-columns:auto !important;grid-auto-flow:row !important;place-content:start center;align-items:stretch;width:100% !important;padding-left:1.5rem;padding-right:1.5rem;display:flex !important;} 208 /* Top-level links: text vertically centered but left-aligned, equal padding so divider sits equidistant */ 209 .mobile-nav-menu .nav-link.mobile-nav{align-items:flex-start !important;justify-content:center !important;padding-top:14px !important;padding-bottom:14px !important;} 210 /* Larger nav-link text to match the Services heading (design's desktop links are tiny) */ 211 .mobile-nav-menu .nav-mobile-text{font-size:24px !important;line-height:1.2;} 212 /* Keep Services category labels on one line (prevents Home Renovations wrapping and creating a gap) */ 213 .mobile-nav-menu .mobile-services-panel .nav-mobile-text{white-space:nowrap !important;} 214 /* Services accordion trigger: match the other top-level links, caret on the right */ 215 .mobile-nav-menu .mobile-services-dropdown{padding-top:0 !important;padding-bottom:0 !important;} 216 .mobile-nav-menu .services-dropdown-trigger{display:flex !important;justify-content:space-between !important;align-items:center !important;width:100% !important;padding:14px 12px 14px 0 !important;cursor:pointer;} 217 .mobile-nav-menu .services-dropdown-trigger .text-size-large{font-size:24px !important;line-height:1.2 !important;letter-spacing:1px !important;color:#FFFDF4 !important;text-transform:uppercase !important;} 218 .mobile-nav-menu .services-dropdown-chevron{width:10px !important;height:10px !important;border:0 !important;border-right:2px solid #FFFDF4 !important;border-bottom:2px solid #FFFDF4 !important;transform:rotate(45deg);transition:transform .25s ease,border-color .2s ease;flex:0 0 auto;margin-right:.35rem;margin-bottom:4px;background:none !important;} 219 .mobile-nav-menu .mobile-services-dropdown.is-open .services-dropdown-chevron{transform:rotate(225deg) !important;margin-bottom:0;margin-top:4px;} 220 .mobile-services-panel{padding-left:1rem;max-height:0;opacity:0;overflow:hidden;transition:max-height .3s ease,opacity .3s ease,margin-top .3s ease;} 221 .mobile-nav-menu .mobile-services-dropdown.is-open .mobile-services-panel{max-height:16rem !important;opacity:1 !important;margin-top:.75rem !important;overflow:visible !important;} 222 /* Dividers between top-level items */ 223 .mobile-nav-menu .nav-link-wrap > .nav-link.mobile-nav, 224 .mobile-nav-menu .nav-link-wrap > .mobile-services-dropdown{border-bottom:1px solid rgba(255,253,244,.18);} 225 /* Gold hover on links + service categories */ 226 .mobile-nav-menu .nav-link.mobile-nav:hover, 227 .mobile-nav-menu .services-dropdown-trigger:hover .text-size-large{color:#B28B0A !important;} 228 .mobile-nav-menu .services-dropdown-trigger:hover .services-dropdown-chevron{border-color:#B28B0A !important;} 229 /* Drawer CTA buttons match the site's standard buttons, full width + larger tap target (kept centered) */ 230 .mobile-nav-menu .nav-link-wrap .button.is-ghost.mobile-nav{width:100% !important;min-width:0 !important;justify-content:center;border:1px solid #B28B0A !important;border-radius:2px !important;padding:1rem 1rem !important;overflow:hidden;} 231 .mobile-nav-menu .button.is-ghost.mobile-nav .btn_ghost-text_first{color:#FFFDF4 !important;text-transform:uppercase;letter-spacing:.03em;font-weight:500;position:relative;z-index:1;}
232 /* Request Estimate = solid gold (like Get Estimate) */ 233 .mobile-nav-menu a.button.is-ghost.mobile-nav[href="/untitled"]{background-color:#B28B0A !important;} 234 /* Call Now = transparent + gold border (like Call Now) */ 235 .mobile-nav-menu a.button.is-ghost.mobile-nav[href^="tel:"]{background-color:transparent !important;} 236} 237/* Phones: drawer link + Services label + button text size */ 238@media screen and (max-width:767px){ 239 .mobile-nav-menu .nav-mobile-text{font-size:1.25rem !important;} 240 .mobile-nav-menu .services-dropdown-trigger .text-size-large{font-size:1.25rem !important;} 241 .mobile-nav-menu .button.is-ghost.mobile-nav .btn_ghost-text_first{font-size:1.25rem !important;} 242} 243/* Hero subtitle wider on tablet/phone */ 244@media screen and (max-width:768px){ 245 .text-large.hero_subtitle{max-width:90vw !important;} 246} 247</style> 248 249<!-- === Harborview responsive (matches design breakpoints) === --> 250<style> 251@media (max-width:991px){ 252 .section-header,.about_grid,.faq_grid,.service-row_component,.estimate_split,.testimonials_grid,.why_grid{grid-template-columns:1fr;gap:2rem;} 253 .section-header{text-align:center;} 254 .section-header>div{align-items:center;} 255 .section-header .section-eyebrow{justify-content:center;} 256 .services_lead{margin-left:0;margin-right:0;text-align:left;max-width:none;} 257 .about_body{align-items:center;} 258 .about_body .section-eyebrow{justify-content:center;} 259 .about_title,.about_body .heading-h2{text-align:center;} 260 .about_body .button{align-self:center;} 261 .testimonials_intro,.why_intro{align-items:center;text-align:center;} 262 .why_intro .section-eyebrow,.testimonials_intro .section-eyebrow{justify-content:center;} 263 .testimonials_lead{text-align:left;} 264 /* Why Harborview intro heading (about page uses .why_grid .heading-wrapper) centers on tablet/mobile */ 265 .why_grid .heading-wrapper{align-items:center;text-align:center;} 266 .why_grid .heading-wrapper .heading-h2,.why_grid .heading-wrapper .section-eyebrow{text-align:center;} 267 .services_grid,.work_grid,.values_grid,.why-cards_grid,.feature-grid{grid-template-columns:1fr 1fr;} 268 .service-row_component.is-reversed .service-row_media{order:0;} 269 .faq_intro{position:static;align-items:center;text-align:center;} 270 .faq_intro .text-body{text-align:left;} 271 .why_intro{position:static;} 272 .footer_top{gap:2.5rem;} 273 .footer_menus{gap:3rem;} 274 .footer_bottom{grid-template-columns:1fr;justify-items:center;text-align:center;gap:1rem;} 275 .footer_legal,.footer_copy,.footer_credit{justify-self:center;} 276} 277@media (max-width:760px){ 278 .section_layout{padding:4rem 0;} 279 .section-header{text-align:center;} 280 .section-header>div{align-items:center;} 281 .services_lead{margin-left:0;margin-right:0;text-align:left;} 282 .hero_component .heading-display{font-size:3rem;} 283 .about_grid{text-align:center;} 284 .about_body{align-items:center;} 285 .about_body p{text-align:left;} 286 .footer_top{flex-direction:column;} 287 .footer_menus{gap:2.5rem;} 288 .footer_logo img{height:120px;} 289 .compare_component{aspect-ratio:4/3;} 290} 291@media (max-width:560px){ 292 .services_grid,.work_grid,.values_grid,.form_row,.feature-grid,.why-cards_grid,.areas_grid,.estimate_component .form_row,.estimate_component .form_row.is-three{grid-template-columns:1fr;} 293 .about_stats{grid-template-columns:1fr 1fr;} 294 .footer_contacts{flex-direction:column;gap:1.5rem;} 295 .footer_menus{flex-direction:column;gap:2rem;} 296} 297@media (max-width:430px){ 298 .cta_content .hero_actions,.hero_content .hero_actions{flex-direction:column;align-items:stretch;width:100%;max-width:22rem;margin-left:auto;margin-right:auto;} 299 .cta_content .hero_actions .button,.hero_content .hero_actions .button{width:100%;flex:none;} 300 .about_stats{grid-template-columns:1fr 1fr;} 301 .about_stats .stat_number{font-size:2.75rem;} 302 .service-included_list{grid-template-columns:1fr;gap:0.85rem;} 303 .service-included_list li{justify-content:center;} 304 .service-included_label{text-align:center;} 305 .footer_top{align-items:center;text-align:center;} 306 .footer_brand{align-items:center;} 307 .footer_logo img{margin:0 auto;} 308 .footer_contacts,.footer_col{align-items:center;text-align:center;} 309 .footer_menus{align-items:center;} 310 .footer_social{justify-content:center;} 311} 312</style> 313</head><body><div class="page-wrapper"><header class="navbar_component"><div class="navbar_inner"><a aria-label="Harborview Finishworks Home" href="/" class="navbar_brand w-inline-block"><img alt="Harborview Finishworks logo" src="https://cdn.prod.website-files.com/682f3dbbd036f316ac014c2f/6a4abbfb7d3b027f52fb7bc5_Harborview-Logo-Half.svg" class="navbar_logo"/></a><nav class="navbar_menu"><div data-delay="0" data-hover="false" class="w-dropdown"><div class="navbar_link w-dropdown-toggle"><div class="navbar_ddlabel">Services</div><div class="navbar_ddicon w-icon-dropdown-toggle"></div></div><nav class="navbar_ddlist w-dropdown-list"><a href="/services/staircases" aria-current="page" class="navbar_ddlink w-dropdown-link w--current">Staircases</a><a href="/services/high-end-finishes" class="navbar_ddlink w-dropdown-link">
313High-End Finishes</a><a href="/services/home-commercial-renovations" class="navbar_ddlink w-dropdown-link">Home & Commercial</a><a href="/services/custom-projects" class="navbar_ddlink">Custom Projects</a></nav></div><a href="/about" class="navbar_link">About</a><a href="#our-work" class="navbar_link">Our Work</a><a href="#testimonials" class="navbar_link">Testimonials</a></nav><div class="navbar_button-group"><a href="tel:6034574620" class="button is-ghost is-on-dark"><span aria-hidden="true" class="button_fill"></span><span class="button_label">Call Now</span></a><a href="/request-estimate" class="button is-ghost"><span aria-hidden="true" class="button_fill"></span><span class="button_label">Get Estimate</span></a></div><a type="button" aria-label="Menu" href="#" class="navbar_burger w-button"><span></span><span></span><span></span></a></div><div class="code-embed-5 w-embed w-script"><style> 314/* ===== Nav link colors: pearl on load, navy once scrolled ===== */ 315/* !important is required here only because old inline colors + the design's 316 variable-based link colors would otherwise win. */ 317.navbar_component:not(.is-scrolled) .navbar_menu .navbar_link, 318.navbar_component:not(.is-scrolled) .navbar_menu .navbar_link *:not(.navbar_ddicon){color:#FFFDF4 !important;} 319.navbar_component.is-scrolled .navbar_menu .navbar_link, 320.navbar_component.is-scrolled .navbar_menu .navbar_link *:not(.navbar_ddicon){color:#0D2436 !important;} 321 322/* ===== Nav background: pearl once scrolled ===== */ 323.navbar_component{transition:background-color .3s ease,box-shadow .3s ease;} 324.navbar_component.is-scrolled{background-color:#FFFDF4;box-shadow:0 1px 0 rgba(8,36,60,0.08);} 325 326/* ===== Base paragraph size ===== */ 327p{font-size:1rem;} 328 329/* ===== Service-areas cards: keep description flush-left with the title ===== 330 The paragraph was left-aligned but text-align-last centered it, pushing the 331 visible text ~38px right of the heading. Pin it hard-left. */ 332.areas_col{align-items:flex-start;text-align:left;} 333.areas_col .areas_title,.areas_col p,.areas_col .text-size-medium{text-align:left;text-align-last:left;} 334 335/* ===== Recent Work carousel: 1 image per slide on tablet & smaller ===== 336 The design goes 2-up via aspect-ratio:4/3, which doesn't resolve on iOS Safari inside 337 the flex track -> images collapse to slivers/thumbnails on iPad. iPad landscape runs at 338 1024-1194px (desktop nav still shows), so the fix must reach up to ~1200px. Below that, 339 show ONE image per slide at full width with an EXPLICIT height (not aspect-ratio) so it 340 resolves consistently on every device. */ 341@media screen and (max-width:1200px){ 342 .related_track{aspect-ratio:auto !important;align-items:stretch !important;height:auto !important;flex-wrap:nowrap;} 343 .related_slide{flex:0 0 100% !important;width:100% !important;aspect-ratio:auto !important;height:60vw !important;min-height:320px !important;max-height:560px !important;overflow:hidden;} 344 .related_image{width:100% !important;height:100% !important;min-height:100% !important;object-fit:cover !important;display:block !important;} 345} 346@media screen and (max-width:479px){ 347 .related_slide{height:72vw !important;min-height:240px !important;} 348} 349 350/* ===== Hero Ken Burns: match the 5s slide interval with continuous motion ===== 351 The head CSS animates the zoom over 5.6s with ease-out, but slides switch every 5s 352 â so the zoom decelerates to a near-stop and gets cut off, which reads as a "pause" 353 before the crossfade. Matching duration to the interval and using steady motion 354 removes the stall. !important is needed to beat the existing head rule's !important. */ 355.hero_component .hero_slides .hero-img.is-active{animation:hbvKenBurns 5s linear forwards !important;} 356 357/* ===== Anchor targets clear the fixed nav (80px) when jumped to ===== */ 358#our-work,#testimonials,#services,#faq{scroll-margin-top:96px;} 359 360/* ===== Services We Cover list: left-aligned on mobile (design centers it) ===== */ 361@media (max-width:991px){ 362 .service-included_component{align-items:flex-start;text-align:left;} 363 .service-included_list{align-items:flex-start;} 364 .service-included_list li{justify-content:flex-start;text-align:left;} 365 .service-included_label{text-align:left;} 366} 367 368/* ===== Call Now button: invert when scrolled ===== */ 369/* On the dark hero it's pearl text / gold border. On the pearl bg the label goes 370 gold so it reads. On hover the gold fill rises and the label flips to pearl â 371 a visible inversion on the white nav (a pearl fill would be invisible there). */ 372.navbar_component.is-scrolled .button.is-on-dark{border-color:#B28B0A !important;} 373.navbar_component.is-scrolled .button.is-on-dark .button_label{color:#B28B0A !important;} 374.navbar_component.is-scrolled .button.is-on-dark .button_fill{background-color:#B28B0A !important;} 375.navbar_component.is-scrolled .button.is-ghost.is-on-dark:hover .button_label{color:#FFFDF4 !important;} 376 377/* ===== Services dropdown chevron: gold, flips vertically on hover ===== */ 378.navbar_component .navbar_ddicon{color:#B28B0A !important;transition:transform .25s ease;} 379.navbar_component .w-dropdown:hover .navbar_ddicon{transform:scaleY(-1);} 380/* Center the dropdown panel under the Services toggle */ 381.navbar_component .navbar_ddlist.w-dropdown-list{left:50%;right:auto;transform:translateX(-50%);} 382</style>
383<script> 384(function(){ 385 function ready(fn){if(document.readyState!=='loading'){fn();}else{document.addEventListener('DOMContentLoaded',fn);}} 386 ready(function(){ 387 388 /* ===== Nav: clear stale inline colors, then toggle is-scrolled on scroll ===== */ 389 var navs=document.querySelectorAll('.navbar_component'); 390 if(navs.length){ 391 /* Old scripts left inline color values stuck on the links; remove them so the CSS can drive the color */ 392 navs.forEach(function(n){ 393 n.querySelectorAll('.navbar_link, .navbar_link *').forEach(function(el){ 394 if(el.style && el.style.color) el.style.removeProperty('color'); 395 }); 396 }); 397 var onScroll=function(){ 398 var s=window.scrollY>40; 399 navs.forEach(function(n){n.classList.toggle('is-scrolled',s);}); 400 }; 401 onScroll(); 402 window.addEventListener('scroll',onScroll,{passive:true}); 403 } 404 405 /* ===== Section links: on non-home pages, send #our-work / #testimonials to the index ===== */ 406 var isHome=(location.pathname.replace(/\/+$/,'')||'/')==='/'; 407 if(!isHome){ 408 document.querySelectorAll('a[href="#our-work"], a[href="#testimonials"]').forEach(function(a){ 409 a.setAttribute('href','/'+a.getAttribute('href')); 410 }); 411 } 412 413 /* ===== Hero: auto-cycle tabs + images + progress fill ===== */ 414 var HOLD=5000; /* ms per slide */ 415 var tabs=[].slice.call(document.querySelectorAll('.hero_tab')); 416 var imgs=[].slice.call(document.querySelectorAll('.hero_slides .hero-img')); 417 var track=document.querySelector('.hero_track'); 418 var fill=document.querySelector('.hero_track-fill'); 419 var n=Math.max(tabs.length,imgs.length); 420 if(n>1){ 421 var idx=0,timer=null; 422 imgs.forEach(function(im){im.style.transition='opacity .9s ease';}); 423 if(fill)fill.style.transition='none'; 424 function seg(){return track?track.getBoundingClientRect().width/n:0;} 425 function paint(i){ 426 idx=(i+n)%n;
427 tabs.forEach(function(t,k){t.classList.toggle('is-active',k===idx);}); 428 imgs.forEach(function(im,k){im.classList.toggle('is-active',k===idx);}); 429 if(fill&&track){ 430 var w=seg(); 431 fill.style.transition='none';fill.style.left=(idx*w)+'px';fill.style.width='0px'; 432 void fill.offsetWidth; 433 fill.style.transition='width '+(HOLD/1000)+'s linear';fill.style.width=w+'px'; 434 } 435 } 436 function next(){paint(idx+1);} 437 function start(){stop();timer=setInterval(next,HOLD);} 438 function stop(){if(timer){clearInterval(timer);timer=null;}} 439 tabs.forEach(function(t,k){t.addEventListener('click',function(e){e.preventDefault();paint(k);start();});}); 440 var hero=document.querySelector('.hero_component'); 441 if(hero){hero.addEventListener('mouseenter',stop);hero.addEventListener('mouseleave',start);} 442 window.addEventListener('resize',function(){if(fill&&track){var w=seg();fill.style.transition='none';fill.style.left=(idx*w)+'px';fill.style.width=w+'px';}}); 443 paint(0); 444 start(); 445 } 446 447 /* ===== Before/After compare slider ===== */ 448 document.querySelectorAll('.compare_component').forEach(function(c){ 449 var after=c.querySelector('.compare_after'); 450 var line=c.querySelector('.compare_line'); 451 if(!after||!line)return; 452 var beforeTag=c.querySelector('.compare_tag.is-left'); 453 var afterTag=c.querySelector('.compare_tag.is-right'); 454 if(beforeTag)beforeTag.style.transition='opacity .25s ease'; 455 if(afterTag)afterTag.style.transition='opacity .25s ease'; 456 c.style.touchAction='none'; /* let us handle horizontal drags without the page scrolling */ 457 c.style.cursor='ew-resize'; 458 459 var dragging=false; 460 function setPos(clientX){ 461 var r=c.getBoundingClientRect(); 462 var p=Math.max(0,Math.min(1,(clientX-r.left)/r.width)); 463 after.style.clipPath='inset(0 0 0 '+(p*100)+'%)'; 464 line.style.left=(p*100)+'%'; 465 /* Hide the label that's more than half-covered: 466 slider left of center -> "after" image covers the left -> hide Before tag; 467 slider right of center -> "before" image covers the right -> hide After tag. */ 468 if(beforeTag)beforeTag.style.opacity = p < 0.5 ? '0' : '1'; 469 if(afterTag)afterTag.style.opacity = p > 0.5 ? '0' : '1'; 470 } 471
472 /* Pointer events cover mouse click-drag AND touch in modern browsers */ 473 c.addEventListener('pointerdown',function(e){ 474 dragging=true; 475 c.setPointerCapture&&c.setPointerCapture(e.pointerId); 476 setPos(e.clientX); 477 e.preventDefault(); 478 }); 479 c.addEventListener('pointermove',function(e){ if(dragging)setPos(e.clientX); }); 480 c.addEventListener('pointerup',function(){ dragging=false; }); 481 c.addEventListener('pointercancel',function(){ dragging=false; }); 482 483 /* Touch fallback for older browsers that lack pointer events */ 484 if(!window.PointerEvent){ 485 c.addEventListener('touchstart',function(e){ if(e.touches[0])setPos(e.touches[0].clientX); },{passive:true}); 486 c.addEventListener('touchmove',function(e){ if(e.touches[0])setPos(e.touches[0].clientX); },{passive:true}); 487 } 488 }); 489 490 }); 491})(); 492</script>
492</div></header><nav aria-label="mobile navigation" data-w-id="f2cde79e-1a1c-856a-2704-9806ce0f5cd1" class="navbar_component mobile navigation"><div class="nav_mobile-wrapper"><a href="/" data-w-id="f2cde79e-1a1c-856a-2704-9806ce0f5cd3" class="nav-logo w-nav-brand"><img loading="lazy" src="https://cdn.prod.website-files.com/682f3dbbd036f316ac014c2f/686c171a47b5e835c8fa3740_bd0b8ce38d9f87a5e0a77acc64d79102_Logo-Nav-Arch.webp" alt="navbar Harborview logo" sizes="(max-width: 1500px) 100vw, 1500px" srcset="https://cdn.prod.website-files.com/682f3dbbd036f316ac014c2f/686c171a47b5e835c8fa3740_bd0b8ce38d9f87a5e0a77acc64d79102_Logo-Nav-Arch-p-500.webp 500w, https://cdn.prod.website-files.com/682f3dbbd036f316ac014c2f/686c171a47b5e835c8fa3740_bd0b8ce38d9f87a5e0a77acc64d79102_Logo-Nav-Arch-p-800.webp 800w, https://cdn.prod.website-files.com/682f3dbbd036f316ac014c2f/686c171a47b5e835c8fa3740_bd0b8ce38d9f87a5e0a77acc64d79102_Logo-Nav-Arch-p-1080.webp 1080w, https://cdn.prod.website-files.com/682f3dbbd036f316ac014c2f/686c171a47b5e835c8fa3740_bd0b8ce38d9f87a5e0a77acc64d79102_Logo-Nav-Arch.webp 1500w" class="logo"/></a><div data-w-id="f2cde79e-1a1c-856a-2704-9806ce0f5cd5" class="mobile-nav-button"><div data-is-ix2-target="1" class="nav-hamburger-lottie" data-w-id="f2cde79e-1a1c-856a-2704-9806ce0f5cd6" data-animation-type="lottie" data-src="https://cdn.prod.website-files.com/66c652ed15b6b5d87b5fbae1/66da69fe05e97230c9b0f225_lottieflow-menu-nav-07-ffffff-easey.json" data-loop="0" data-direction="1" data-autoplay="0" data-renderer="svg" data-default-duration="2.4791666666666665" data-duration="0" data-loading="eager" data-ix2-initial-state="0"></div></div><div class="mobile-nav-menu"><div class="mobile-nav-content"><div class="mobile-nav-code w-embed w-script"><style> 493@media screen and (max-width:1040px){ 494 /* Drawer hidden off-screen by default across the whole mobile-nav range. 495 (The design only hides it up to 991px, but the mobile nav shows up to 1040px, 496 so 992â1040px was left open by default.) A plain rule â no !important â so 497 Webflow's native open interaction (inline transform) still slides it in. */ 498 .mobile-nav-menu{transform:translate(100%);} 499 500 /* Services accordion links stack vertically */ 501 .mobile-services-panel{display:flex;flex-direction:column;align-items:flex-start;gap:.5rem;} 502 .mobile-services-panel .nav-link.mobile-nav{display:block;width:100%;} 503 504 /* CTA buttons: full width of the drawer column, copy on one line */ 505 .mobile-nav-menu .nav-link-wrap .button.is-ghost.mobile-nav{width:100%;max-width:none;} 506 .mobile-nav-menu .button.is-ghost.mobile-nav .btn_ghost-text_first{white-space:nowrap;} 507 508 /* Services accordion panel animation */ 509 .mobile-services-panel{ 510 max-height:0; 511 overflow:hidden; 512 opacity:0; 513 margin-top:0; 514 transition:max-height .4s cubic-bezier(.4,0,.2,1), 515 opacity .4s cubic-bezier(.4,0,.2,1), 516 margin-top .4s cubic-bezier(.4,0,.2,1); 517 } 518 .mobile-services-dropdown.is-open .mobile-services-panel{ 519 max-height:16rem; 520 opacity:1; 521 margin-top:.75rem; 522 } 523 .mobile-services-dropdown.is-open .services-dropdown-chevron{ 524 transform:rotate(225deg); 525 margin-top:4px; 526 } 527} 528</style>
529<script> 530document.addEventListener('DOMContentLoaded',function(){ 531 /* Drawer open/close (hamburger + X) and the slide are handled natively by Webflow. 532 Two small custom pieces: the Services accordion, and close-on-click-outside 533 (Webflow ships no overlay, so it otherwise only closes via the button). */ 534 var dd=document.querySelector('.mobile-services-dropdown'); 535 var trigger=document.querySelector('.services-dropdown-trigger'); 536 if(dd&&trigger){ 537 trigger.addEventListener('click',function(e){ 538 e.preventDefault(); 539 e.stopPropagation(); 540 dd.classList.toggle('is-open'); 541 }); 542 } 543 544 var menu=document.querySelector('.mobile-nav-menu'); 545 var btn=document.querySelector('.mobile-nav-button'); 546 if(menu&&btn){ 547 function isOpen(){ 548 try{var m=new WebKitCSSMatrix(getComputedStyle(menu).transform); 549 return m.m41 < menu.getBoundingClientRect().width*0.5;} 550 catch(e){return false;} 551 } 552 /* Clicking anywhere outside the drawer or hamburger closes it â by firing the 553 button's own click so Webflow's interaction stays in sync. */ 554 document.addEventListener('pointerdown',function(e){ 555 if(!isOpen())return; 556 if(menu.contains(e.target)||btn.contains(e.target))return; 557 btn.click(); 558 },true); 559 560 /* Tapping a link closes the drawer too. Needed for same-page anchors 561 (/#our-work, /#testimonials) which scroll without reloading the page. */ 562 menu.querySelectorAll('a').forEach(function(a){ 563 a.addEventListener('click',function(){ 564 if(isOpen())btn.click(); 565 }); 566 }); 567 } 568}); 569</script>
569</div><div class="nav-link-wrap"><a href="/about" class="nav-link mobile-nav w-inline-block"><div class="nav-mobile-text">About Us</div></a><div class="mobile-services-dropdown"><div class="services-dropdown-trigger left"><div class="text-size-large light uppercase">Services</div><div class="services-dropdown-chevron"></div></div><div class="mobile-services-panel"><a href="/services/high-end-finishes" class="nav-link mobile-nav w-inline-block"><div class="nav-mobile-text">High-End Finishes</div></a><a href="/services/staircases" aria-current="page" class="nav-link mobile-nav w-inline-block w--current"><div class="nav-mobile-text">Staircases</div></a><a href="/services/home-commercial-renovations" class="nav-link mobile-nav w-inline-block"><div class="nav-mobile-text">Home & Commercial</div></a><a href="/services/custom-projects" class="nav-link mobile-nav w-inline-block"><div class="nav-mobile-text">Custom Projects</div></a></div></div><a href="/#our-work" class="nav-link mobile-nav w-inline-block"><div class="nav-mobile-text">Our Work</div></a><a href="/#testimonials" class="nav-link mobile-nav w-inline-block"><div class="nav-mobile-text">Testimonials</div></a><a href="mailto:[email protected]?subject=Harborview%20General%20Inquiry" class="nav-link mobile-nav w-inline-block"><div class="nav-mobile-text">Contact Us</div></a><a href="/request-estimate" class="button is-ghost mobile-nav w-inline-block"><div class="btn_ghost-text_first">Request Estimate</div><div class="btn_ghost-bg"></div></a><a href="tel:603-457-4620" class="button is-ghost mobile-nav w-inline-block"><div class="btn_ghost-text_first">Call Now</div><div class="btn_ghost-bg"></div></a></div></div></div></div></nav><div class="global-styles"><div class="style-overrides w-embed"><style> 570 571/* Ensure all elements inherit the color from its parent */ 572 573a, 574.w-input, 575.w-select, 576.w-tab-link, 577.w-nav-link, 578.w-nav-brand, 579.w-dropdown-btn, 580.w-dropdown-toggle, 581.w-slider-arrow-left, 582.w-slider-arrow-right, 583.w-dropdown-link { 584 text-decoration: inherit; 585} 586 587/* Focus state style for keyboard navigation for the focusable elements */ 588*[tabindex]:focus-visible, 589 input[type="file"]:focus-visible { 590 outline: 0.125rem solid #4d65ff; 591 outline-offset: 0.125rem; 592} 593 594/* Get rid of top margin on first element in any rich text element */ 595.w-richtext > :not(div):first-child, .w-richtext > div:first-child > :first-child { 596 margin-top: 0 !important; 597} 598 599/* Get rid of bottom margin on last element in any rich text element */ 600.w-richtext>:last-child, .w-richtext ol li:last-child, .w-richtext ul li:last-child { 601 margin-bottom: 0 !important; 602} 603 604/* Prevent all click and hover interaction with an element */ 605.pointer-events-off { 606 pointer-events: none; 607} 608 609/* Enables all click and hover interaction with an element */ 610.pointer-events-on { 611 pointer-events: auto; 612} 613 614/* Create a class of .div-square which maintains a 1:1 dimension of a div */ 615.div-square::after { 616 content: ""; 617 display: block; 618 padding-bottom: 100%; 619} 620 621/* Make sure containers never lose their center alignment */ 622.container-medium,.container-small, .container-large { 623 margin-right: auto !important; 624 margin-left: auto !important; 625} 626 627 628/* Apply "..." after 3 lines of text */ 629.text-style-3lines { 630 display: -webkit-box; 631 overflow: hidden; 632 -webkit-line-clamp: 3; 633 -webkit-box-orient: vertical; 634} 635 636/* Apply "..." after 2 lines of text */ 637.text-style-2lines { 638 display: -webkit-box; 639 overflow: hidden; 640 -webkit-line-clamp: 2; 641 -webkit-box-orient: vertical; 642} 643 644/* Adds inline flex display */ 645.display-inlineflex { 646 display: inline-flex; 647} 648 649/* These classes are never overwritten */ 650.hide { 651 display: none !important; 652} 653 654/* Remove default Webflow chevron from form select */ 655select{ 656 -webkit-appearance:none; 657} 658 659 660@media screen and (max-width: 991px) { 661 .hide, .hide-tablet { 662 display: none !important; 663 } 664} 665 @media screen and (max-width: 767px) { 666 .hide-mobile-landscape{ 667 display: none !important; 668 } 669} 670 @media screen and (max-width: 479px) { 671 .hide-mobile{ 672 display: none !important; 673 } 674} 675 676.margin-0 { 677 margin: 0px !important; 678} 679 680.padding-0 { 681 padding: 0px !important; 682} 683 684.spacing-clean { 685padding: 0px !important; 686margin: 0px !important; 687} 688 689.margin-top { 690 margin-right: 0px !important; 691 margin-bottom: 0px !important; 692 margin-left: 0px !important; 693} 694 695.padding-top { 696 padding-right: 0px !important; 697 padding-bottom: 0px !important; 698 padding-left: 0px !important; 699} 700 701.margin-right { 702 margin-top: 0px !important; 703 margin-bottom: 0px !important; 704 margin-left: 0px !important; 705} 706 707.padding-right { 708 padding-top: 0px !important; 709 padding-bottom: 0px !important; 710 padding-left: 0px !important; 711} 712 713.margin-bottom { 714 margin-top: 0px !important; 715 margin-right: 0px !important; 716 margin-left: 0px !important; 717} 718 719.padding-bottom { 720 padding-top: 0px !important; 721 padding-right: 0px !important; 722 padding-left: 0px !important; 723} 724 725.margin-left { 726 margin-top: 0px !important; 727 margin-right: 0px !important; 728 margin-bottom: 0px !important; 729} 730 731.padding-left { 732 padding-top: 0px !important; 733 padding-right: 0px !important; 734 padding-bottom: 0px !important; 735} 736 737.margin-horizontal { 738 margin-top: 0px !important; 739 margin-bottom: 0px !important; 740} 741 742.padding-horizontal { 743 padding-top: 0px !important; 744 padding-bottom: 0px !important; 745} 746 747.margin-vertical { 748 margin-right: 0px !important; 749 margin-left: 0px !important; 750} 751 752.padding-vertical { 753 padding-right: 0px !important; 754 padding-left: 0px !important; 755} 756 757/* Apply "..." at 100% width */ 758.truncate-width { 759 width: 100%; 760 white-space: nowrap; 761 overflow: hidden; 762 text-overflow: ellipsis; 763} 764/* Removes native scrollbar */ 765.no-scrollbar {
766 -ms-overflow-style: none; 767 overflow: -moz-scrollbars-none; 768} 769 770.no-scrollbar::-webkit-scrollbar { 771 display: none; 772} 773 774@media (max-width: 1290px) and (min-width: 992px) { 775 .header-style-h1.light { 776 font-size: clamp(3.8rem, 3vw, 4.5rem); 777 } 778} 779 780@media (max-width: 1250px) and (min-width: 992px) { 781 .services-cards-wrapper { 782 grid-template-columns: 1fr 1fr; 783 } 784} 785 786.preloader, 787.preloader_bg { 788 opacity: 1; /* visible by default */ 789 transition: opacity 0.3s ease; 790} 791 792/* This hides preloader and background instantly if localStorage flag exists */ 793html[data-preloader-shown="true"] .preloader, 794html[data-preloader-shown="true"] .preloader_bg { 795 opacity: 0 !important; 796 pointer-events: none; 797 visibility: hidden; 798 display: none !important; 799} 800</style></div><div class="fonts w-embed"></div><div class="color-schemes w-embed"><style> 801.color-scheme-1 {} 802 803 .color-scheme-2 { 804 --color-scheme-1--text: var(--color-scheme-2--text); 805 --color-scheme-1--background: var(--color-scheme-2--background); 806 --color-scheme-1--foreground: var(--color-scheme-2--foreground); 807 --color-scheme-1--border: var(--color-scheme-2--border); 808 --color-scheme-1--accent: var(--color-scheme-2--accent); 809 } 810 811.w-slider-dot { 812 background-color: var(--color-scheme-1--text); 813 opacity: 0.20; 814} 815 816.w-slider-dot.w-active { 817 background-color: var(--color-scheme-1--text); 818 opacity: 1; 819} 820 821/* Override .w-slider-nav-invert styles */ 822.w-slider-nav-invert .w-slider-dot { 823 background-color: var(--color-scheme-1--text) !important; 824 opacity: 0.20 !important; 825} 826 827.w-slider-nav-invert .w-slider-dot.w-active { 828 background-color: var(--color-scheme-1--text) !important; 829 opacity: 1 !important; 830} 831 832</style></div></div><section class="page-banner_component"><img src="https://cdn.prod.website-files.com/685b255d3764c6b35d03a2ea/6a4c1a52ab1a03c02f1b63fd_20260522gp-66037.jpg" alt="" sizes="100vw" srcset="https://cdn.prod.website-files.com/685b255d3764c6b35d03a2ea/6a4c1a52ab1a03c02f1b63fd_20260522gp-66037-p-500.jpg 500w, https://cdn.prod.website-files.com/685b255d3764c6b35d03a2ea/6a4c1a52ab1a03c02f1b63fd_20260522gp-66037-p-800.jpg 800w, https://cdn.prod.website-files.com/685b255d3764c6b35d03a2ea/6a4c1a52ab1a03c02f1b63fd_20260522gp-66037-p-1080.jpg 1080w, https://cdn.prod.website-files.com/685b255d3764c6b35d03a2ea/6a4c1a52ab1a03c02f1b63fd_20260522gp-66037-p-1600.jpg 1600w, https://cdn.prod.website-files.com/685b255d3764c6b35d03a2ea/6a4c1a52ab1a03c02f1b63fd_20260522gp-66037-p-2000.jpg 2000w, https://cdn.prod.website-files.com/685b255d3764c6b35d03a2ea/6a4c1a52ab1a03c02f1b63fd_20260522gp-66037.jpg 3000w" class="page-banner_bg"/><div class="container-large"><div class="page-banner_content"><div class="section-eyebrow is-on-dark"><span class="section-eyebrow_bracket">[</span>Our Services<span class="section-eyebrow_bracket">]</span></div><h1 class="heading-display text-on-dark hero_title">Staircases</h1><span aria-hidden="true" class="page-banner_rule"></span><p class="text-large text-on-dark page-banner_tag">Custom-built staircases combining structural precision and design.</p></div></div></section><section class="section_layout aboutpage_component"><div class="container-large"><div class="section-header is-center"><div class="section-eyebrow"><span class="section-eyebrow_bracket">[</span>Project Highlight<span class="section-eyebrow_bracket">]</span></div><h2 class="heading-h2">See the Transformation</h2></div><div class="compare_component"><img src="https://cdn.prod.website-files.com/685b255d3764c6b35d03a2ea/6a710ffe6d06b5c8ef95405c_before-staircase.jpeg" alt="Before" sizes="100vw" srcset="https://cdn.prod.website-files.com/685b255d3764c6b35d03a2ea/6a710ffe6d06b5c8ef95405c_before-staircase-p-500.jpeg 500w, https://cdn.prod.website-files.com/685b255d3764c6b35d03a2ea/6a710ffe6d06b5c8ef95405c_before-staircase-p-800.jpeg 800w, https://cdn.prod.website-files.com/685b255d3764c6b35d03a2ea/6a710ffe6d06b5c8ef95405c_before-staircase-p-1080.jpeg 1080w, https://cdn.prod.website-files.com/685b255d3764c6b35d03a2ea/6a710ffe6d06b5c8ef95405c_before-staircase.jpeg 1536w" class="compare_img compare_before"/><div class="compare_after"><img src="https://cdn.prod.website-files.com/685b255d3764c6b35d03a2ea/6a711001b11951743eb361ff_after-staircase.jpeg" alt="After" sizes="100vw" srcset="https://cdn.prod.website-files.com/685b255d3764c6b35d03a2ea/6a711001b11951743eb361ff_after-staircase-p-500.jpeg 500w, https://cdn.prod.website-files.com/685b255d3764c6b35d03a2ea/6a711001b11951743eb361ff_after-staircase-p-800.jpeg 800w, https://cdn.prod.website-files.com/685b255d3764c6b35d03a2ea/6a711001b11951743eb361ff_after-staircase-p-1080.jpeg 1080w, https://cdn.prod.website-files.com/685b255d3764c6b35d03a2ea/6a711001b11951743eb361ff_after-staircase-p-1600.jpeg 1600w, https://cdn.prod.website-files.com/685b255d3764c6b35d03a2ea/6a711001b11951743eb361ff_after-staircase-p-2000.jpeg 2000w, https://cdn.prod.website-files.com/685b255d3764c6b35d03a2ea/6a711001b11951743eb361ff_after-staircase.jpeg 3024w" class="compare_img compare_afterimg"/></div><span class="compare_tag is-left">Before</span><span class="compare_tag is-right">After</span><div class="compare_line"><span class="compare_handle"><svg viewBox="0 0 24 24" fill="none" stroke="#FFFDF4" stroke-width="3" stroke-linecap="round" stroke-linejoin="round" width="11" height="11" aria-hidden="true"><polyline points="15 18 9 12 15 6"></polyline></svg><svg viewBox="0 0 24 24" fill="none" stroke="#FFFDF4" stroke-width="3" stroke-linecap="round" stroke-linejoin="round" width="11" height="11" aria-hidden="true"><polyline points="9 18 15 12 9 6"></polyline></svg></span></div></div></div></section><section id="related-projects" aria-label="Related projects" class="section_layout related_component"><div class="container-large"><div class="section-header"><div class="header-wrap"><div class="section-eyebrow"><span class="section-eyebrow_bracket">[</span>Recent Work<span class="section-eyebrow_bracket">]</span></div><h2 class="heading-style-h2">Related Staircase Projects</h2></div><p class="text-size-medium">A look at past staircase projects we've completed across the Seacoast and Southern Maine.</p></div><div class="container-large"><a type="button" aria-label="Previous project image" href="#" class="related_arrow is-prev w-button"><svg stroke-linejoin="round" stroke-linecap="round" stroke-width="2.5" stroke="currentColor" fill="none" viewBox="0 0 24 24" class="related_arrow-icon hv-related_chevron"><polyline points="15 18 9 12 15 6"></polyline></svg></a><div class="related_component w-dyn-list">
832<script type="text/x-wf-template" id="wf-template-ee002a64-5619-bca4-3b58-5094ce15ae3d">%3Cdiv%20role%3D%22listitem%22%20class%3D%22related_slide%20w-dyn-item%20w-dyn-repeater-item%22%3E%3Cimg%20src%3D%22https%3A%2F%2Fcdn.prod.website-files.com%2F685b255d3764c6b35d03a2ea%2F6a4c1af0f7670b0ea7cd29bd_32.jpg%22%20loading%3D%22lazy%22%20alt%3D%22Staircases%22%20sizes%3D%22100vw%22%20srcset%3D%22https%3A%2F%2Fcdn.prod.website-files.com%2F685b255d3764c6b35d03a2ea%2F6a4c1af0f7670b0ea7cd29bd_32-p-500.jpg%20500w%2C%20https%3A%2F%2Fcdn.prod.website-files.com%2F685b255d3764c6b35d03a2ea%2F6a4c1af0f7670b0ea7cd29bd_32.jpg%20800w%22%20class%3D%22related_image%22%2F%3E%3C%2Fdiv%3E</script>
832<div role="list" class="related_track w-dyn-items"><div role="listitem" class="related_slide w-dyn-item w-dyn-repeater-item"><img src="https://cdn.prod.website-files.com/685b255d3764c6b35d03a2ea/6a4c1af0f7670b0ea7cd29bd_32.jpg" loading="lazy" alt="Staircases" sizes="100vw" srcset="https://cdn.prod.website-files.com/685b255d3764c6b35d03a2ea/6a4c1af0f7670b0ea7cd29bd_32-p-500.jpg 500w, https://cdn.prod.website-files.com/685b255d3764c6b35d03a2ea/6a4c1af0f7670b0ea7cd29bd_32.jpg 800w" class="related_image"/></div><div role="listitem" class="related_slide w-dyn-item w-dyn-repeater-item"><img src="https://cdn.prod.website-files.com/685b255d3764c6b35d03a2ea/6a4c1b4224800f4eb6347f69_20260522gp-66038.jpg" loading="lazy" alt="Staircases" sizes="100vw" srcset="https://cdn.prod.website-files.com/685b255d3764c6b35d03a2ea/6a4c1b4224800f4eb6347f69_20260522gp-66038-p-500.jpg 500w, https://cdn.prod.website-files.com/685b255d3764c6b35d03a2ea/6a4c1b4224800f4eb6347f69_20260522gp-66038-p-800.jpg 800w, https://cdn.prod.website-files.com/685b255d3764c6b35d03a2ea/6a4c1b4224800f4eb6347f69_20260522gp-66038-p-1080.jpg 1080w, https://cdn.prod.website-files.com/685b255d3764c6b35d03a2ea/6a4c1b4224800f4eb6347f69_20260522gp-66038-p-1600.jpg 1600w, https://cdn.prod.website-files.com/685b255d3764c6b35d03a2ea/6a4c1b4224800f4eb6347f69_20260522gp-66038.jpg 2000w" class="related_image"/></div><div role="listitem" class="related_slide w-dyn-item w-dyn-repeater-item"><img src="https://cdn.prod.website-files.com/685b255d3764c6b35d03a2ea/6a4c1b4800e5f767e2534c19_20260522gp-66043.jpg" loading="lazy" alt="Staircases" sizes="100vw" srcset="https://cdn.prod.website-files.com/685b255d3764c6b35d03a2ea/6a4c1b4800e5f767e2534c19_20260522gp-66043-p-500.jpg 500w, https://cdn.prod.website-files.com/685b255d3764c6b35d03a2ea/6a4c1b4800e5f767e2534c19_20260522gp-66043-p-800.jpg 800w, https://cdn.prod.website-files.com/685b255d3764c6b35d03a2ea/6a4c1b4800e5f767e2534c19_20260522gp-66043-p-1080.jpg 1080w, https://cdn.prod.website-files.com/685b255d3764c6b35d03a2ea/6a4c1b4800e5f767e2534c19_20260522gp-66043-p-1600.jpg 1600w, https://cdn.prod.website-files.com/685b255d3764c6b35d03a2ea/6a4c1b4800e5f767e2534c19_20260522gp-66043-p-2000.jpg 2000w, https://cdn.prod.website-files.com/685b255d3764c6b35d03a2ea/6a4c1b4800e5f767e2534c19_20260522gp-66043.jpg 3000w" class="related_image"/></div><div role="listitem" class="related_slide w-dyn-item w-dyn-repeater-item"><img src="https://cdn.prod.website-files.com/685b255d3764c6b35d03a2ea/6a4c1b0a3803b73f3633b932_20260522gp-66042.jpg" loading="lazy" alt="Staircases" sizes="100vw" srcset="https://cdn.prod.website-files.com/685b255d3764c6b35d03a2ea/6a4c1b0a3803b73f3633b932_20260522gp-66042-p-500.jpg 500w, https://cdn.prod.website-files.com/685b255d3764c6b35d03a2ea/6a4c1b0a3803b73f3633b932_20260522gp-66042-p-800.jpg 800w, https://cdn.prod.website-files.com/685b255d3764c6b35d03a2ea/6a4c1b0a3803b73f3633b932_20260522gp-66042-p-1080.jpg 1080w, https://cdn.prod.website-files.com/685b255d3764c6b35d03a2ea/6a4c1b0a3803b73f3633b932_20260522gp-66042-p-1600.jpg 1600w, https://cdn.prod.website-files.com/685b255d3764c6b35d03a2ea/6a4c1b0a3803b73f3633b932_20260522gp-66042-p-2000.jpg 2000w, https://cdn.prod.website-files.com/685b255d3764c6b35d03a2ea/6a4c1b0a3803b73f3633b932_20260522gp-66042.jpg 3000w" class="related_image"/></div></div><div class="w-dyn-hide w-dyn-empty"><div>No items found.</div></div></div><a type="button" aria-label="Next project image" href="#" class="related_arrow is-next w-button"><svg stroke-linejoin="round" stroke-linecap="round" stroke-width="2.5" stroke="currentColor" fill="none" viewBox="0 0 24 24" class="related_arrow-icon hv-related_chevron"><polyline points="9 18 15 12 9 6"></polyline></svg></a></div></div><div class="w-embed w-script">
832<script> 833(function(){ 834 /* Dot styling (in case the design's .slider_dot CSS was removed with the old slider) */ 835 if(!document.getElementById('hbv-dot-style')){ 836 var st=document.createElement('style'); 837 st.id='hbv-dot-style'; 838 st.textContent= 839 '.related_dots .slider_dot{width:12px;height:12px;border-radius:50%;padding:0;'+ 840 'border:2px solid #B28B0A;background:transparent;cursor:pointer;transition:background .2s ease;}'+ 841 '.related_dots .slider_dot.is-active{background:#B28B0A;}'; 842 document.head.appendChild(st); 843 } 844})(); 845(function(){ 846 function ready(fn){ 847 if(document.readyState!=='loading')fn(); 848 else document.addEventListener('DOMContentLoaded',fn); 849 } 850 ready(function(){ 851 var root=document.querySelector('#related-projects, .related_component'); 852 if(!root)return; 853 var track=root.querySelector('.related_track'); 854 var viewport=track?track.parentElement:null; /* the .w-dyn-list wrapper (clips overflow) */ 855 var slides=track?[].slice.call(track.querySelectorAll('.related_slide')):[]; 856 if(!track||!viewport||slides.length===0)return; 857 858 var prevBtn=root.querySelector('.related_arrow.is-prev'); 859 var nextBtn=root.querySelector('.related_arrow.is-next'); 860 var dotsWrap=root.querySelector('.related_dots'); 861 862 /* The design's markup no longer includes a dots container, so create one if 863 it's missing. Place it just after the carousel row (the container that holds 864 the arrows + track), centered, matching where the dots used to sit. */ 865 if(!dotsWrap){ 866 dotsWrap=document.createElement('div'); 867 dotsWrap.className='related_dots'; 868 dotsWrap.style.display='flex'; 869 dotsWrap.style.justifyContent='center'; 870 dotsWrap.style.alignItems='center'; 871 dotsWrap.style.gap='12px'; 872 dotsWrap.style.marginTop='24px'; 873 var row=(track.closest('.container-large'))||viewport.parentElement; 874 if(row&&row.parentElement)row.parentElement.insertBefore(dotsWrap,row.nextSibling); 875 else root.appendChild(dotsWrap); 876 } 877 878 /* make sure the viewport clips and the track can be transformed */ 879 viewport.style.overflow='hidden'; 880 track.style.willChange='transform'; 881 track.style.transition='transform .5s cubic-bezier(.4,0,.2,1)'; 882 883 var index=0; /* current step (0-based) */ 884 var perView=1; /* how many slides are visible at once */ 885 var steps=1; /* number of stop positions */ 886 887 function gap(){ 888 var g=parseFloat(getComputedStyle(track).columnGap||getComputedStyle(track).gap||'0'); 889 return isNaN(g)?0:g; 890 } 891 function slideSpan(){ 892 /* width of one slide plus the gap between slides */ 893 return slides[0].getBoundingClientRect().width+gap(); 894 } 895 function computePerView(){ 896 var vp=viewport.getBoundingClientRect().width; 897 var sw=slides[0].getBoundingClientRect().width; 898 if(sw<=0)return 1; 899 /* how many whole slides fit in the viewport */ 900 var n=Math.round((vp+gap())/(sw+gap())); 901 return Math.max(1,Math.min(n,slides.length)); 902 } 903 904 function buildDots(){ 905 if(!dotsWrap)return; 906 dotsWrap.innerHTML=''; 907 for(var i=0;i<steps;i++){ 908 var d=document.createElement('button'); 909 d.type='button'; 910 d.className='slider_dot'+(i===index?' is-active':''); 911 d.setAttribute('aria-label','Go to slide '+(i+1)); 912 (function(i){d.addEventListener('click',function(){go(i);});})(i); 913 dotsWrap.appendChild(d); 914 } 915 } 916 function syncDots(){ 917 if(!dotsWrap)return; 918 var ds=dotsWrap.querySelectorAll('.slider_dot'); 919 for(var i=0;i<ds.length;i++){ 920 if(i===index)ds[i].classList.add('is-active'); 921 else ds[i].classList.remove('is-active'); 922 } 923 } 924 function paint(){ 925 var x=index*perView*slideSpan(); 926 /* don't overscroll past the last slide */ 927 var maxX=Math.max(0,track.scrollWidth-viewport.getBoundingClientRect().width); 928 if(x>maxX)x=maxX; 929 track.style.transform='translateX('+(-x)+'px)'; 930 syncDots(); 931 if(prevBtn)prevBtn.style.opacity=index<=0?'0.4':'1'; 932 if(nextBtn)nextBtn.style.opacity=index>=steps-1?'0.4':'1'; 933 } 934 function go(i){ 935 index=Math.max(0,Math.min(i,steps-1));
936 paint(); 937 } 938 function next(){ go(index>=steps-1?0:index+1); } /* wraps to start */ 939 function prev(){ go(index<=0?steps-1:index-1); } /* wraps to end */ 940 941 function recalc(){ 942 perView=computePerView(); 943 steps=Math.max(1,Math.ceil(slides.length/perView)); 944 if(index>steps-1)index=steps-1; 945 buildDots(); 946 paint(); 947 } 948 949 if(nextBtn)nextBtn.addEventListener('click',function(e){e.preventDefault();next();}); 950 if(prevBtn)prevBtn.addEventListener('click',function(e){e.preventDefault();prev();}); 951 952 /* touch swipe */ 953 var startX=null; 954 viewport.addEventListener('touchstart',function(e){startX=e.touches[0].clientX;},{passive:true}); 955 viewport.addEventListener('touchend',function(e){ 956 if(startX===null)return; 957 var dx=e.changedTouches[0].clientX-startX; 958 if(Math.abs(dx)>40){ dx<0?next():prev(); } 959 startX=null; 960 },{passive:true}); 961 962 /* recompute on resize (orientation change, breakpoint crossings) */ 963 var rt; 964 window.addEventListener('resize',function(){ 965 clearTimeout(rt); 966 rt=setTimeout(recalc,150); 967 }); 968 969 /* images may change slide height as they load; recalc when they do */ 970 [].slice.call(track.querySelectorAll('img')).forEach(function(im){ 971 if(!im.complete)im.addEventListener('load',recalc,{once:true}); 972 }); 973 974 recalc(); 975 }); 976})(); 977</script>
977</div></section><section class="section_layout expect_component"><div class="container-large"><div class="about_grid"><div class="about_media"><img src="https://cdn.prod.website-files.com/685b255d3764c6b35d03a2ea/6a4c1a52ab1a03c02f1b63fd_20260522gp-66037.jpg" alt="Service work by Harborview Finishworks" sizes="100vw" srcset="https://cdn.prod.website-files.com/685b255d3764c6b35d03a2ea/6a4c1a52ab1a03c02f1b63fd_20260522gp-66037-p-500.jpg 500w, https://cdn.prod.website-files.com/685b255d3764c6b35d03a2ea/6a4c1a52ab1a03c02f1b63fd_20260522gp-66037-p-800.jpg 800w, https://cdn.prod.website-files.com/685b255d3764c6b35d03a2ea/6a4c1a52ab1a03c02f1b63fd_20260522gp-66037-p-1080.jpg 1080w, https://cdn.prod.website-files.com/685b255d3764c6b35d03a2ea/6a4c1a52ab1a03c02f1b63fd_20260522gp-66037-p-1600.jpg 1600w, https://cdn.prod.website-files.com/685b255d3764c6b35d03a2ea/6a4c1a52ab1a03c02f1b63fd_20260522gp-66037-p-2000.jpg 2000w, https://cdn.prod.website-files.com/685b255d3764c6b35d03a2ea/6a4c1a52ab1a03c02f1b63fd_20260522gp-66037.jpg 3000w" class="about_image"/></div><div class="about_body"><div class="section-eyebrow is-on-dark"><span class="section-eyebrow_bracket">[</span>What to Expect<span class="section-eyebrow_bracket">]</span></div><h2 class="heading-h2 text-on-dark">Staircases</h2><div class="text-size-medium light w-richtext"><p>Whether bold or classic, our custom staircases are built to fit your space perfectlyâadding both function and character.</p></div><div class="service-included_component"><span class="service-included_label">Services We Cover</span><div class="service-included_list w-richtext"><ul role="list"><li>Custom Stair Design &Â Builds</li><li>Open-Riser &Â Floating Stairs</li><li>Railings &Â Balustrades</li><li>Newel Posts &Â Handrails</li></ul></div></div><a href="/request-estimate" class="button is-ghost"><span aria-hidden="true" class="button_fill"></span><span class="button_label">Get Estimate</span></a></div></div></div></section><section class="faq_section"><div class="container-large"><div class="padding-section-large"><div class="faq_component"><div class="w-layout-grid faq_content"><div class="faq_content-left"><div class="margin-bottom margin-small"><div data-w-id="e31e7534-6ddf-a36a-fc44-f6da27eeb331" style="opacity:0" class="section-eyebrow left"><span class="bold-bracket"><strong>[</strong></span> FAQs <span class="bold-bracket"><strong>]</strong></span></div><h2 class="heading-style-h2">Common Project Questions</h2></div><p class="text-size-medium">Common questions about our custom projects work. Curious about something else? Reach outâwe're happy to help.</p></div><div class="faq_list"><div class="w-layout-grid faq_list-grid"><div class="code-embed-3 w-embed w-script"><style> 978 /* ===== FAQ accordion ===== */ 979 .faq_question { 980 cursor: pointer; 981 } 982 983 /* Collapsed by default */ 984 .faq_answer { 985 display: grid; 986 grid-template-rows: 0fr; 987 /* Closing: ease-in-out feels natural when collapsing */ 988 transition: grid-template-rows 0.8s cubic-bezier(0.4, 0, 0.2, 1), 989 opacity 0.6s cubic-bezier(0.4, 0, 0.2, 1); 990 overflow: hidden; 991 opacity: 0; 992 will-change: grid-template-rows; 993 height: 0px; 994 } 995 996 .faq_answer > * { 997 min-height: 0; 998 } 999 1000 /* Open state â slightly longer + different easing for the "expand" feel */ 1001 .faq_accordion.is-open .faq_answer { 1002 grid-template-rows: 1fr; 1003 opacity: 1; 1004 /* Opening: ease-out-expo settles gently instead of stopping abruptly */ 1005 transition: grid-template-rows 0.65s cubic-bezier(0.16, 1, 0.3, 1), 1006 opacity 0.5s ease 0.1s; 1007 height: 100%; 1008 } 1009 1010 /* Icon rotation when open */ 1011 .faq_icon-wrapper { 1012 transition: transform 0.5s cubic-bezier(0.16, 1, 0.3, 1); 1013 } 1014 .faq_accordion.is-open .faq_icon-wrapper { 1015 transform: rotate(45deg); 1016 } 1017</style> 1018
1019<script> 1020 document.addEventListener('DOMContentLoaded', () => { 1021 const items = document.querySelectorAll('.faq_accordion'); 1022 1023 items.forEach(item => { 1024 const question = item.querySelector('.faq_question'); 1025 if (!question) return; 1026 1027 question.addEventListener('click', () => { 1028 const isOpen = item.classList.contains('is-open'); 1029 1030 // Close all items 1031 items.forEach(other => other.classList.remove('is-open')); 1032 1033 // If the clicked one wasn't already open, open it 1034 if (!isOpen) { 1035 item.classList.add('is-open'); 1036 } 1037 }); 1038 }); 1039 }); 1040</script>
1040</div><div class="w-dyn-list"><div role="list" class="collection-list-2 w-dyn-items"><div role="listitem" class="w-dyn-item"><div class="faq_accordion"><div class="faq_question"><div class="text-size-medium text-weight-bold">Do you build custom staircases throughout the New Hampshire Seacoast and Southern Maine?</div><div class="faq_icon-wrapper"><div class="icon-embed-small w-embed"><svg width="100%" height="100%" viewBox="0 0 32 32" fill="none" xmlns="http://www.w3.org/2000/svg"> 1041<path d="M25.3333 15.667V16.3336C25.3333 16.7018 25.0349 17.0003 24.6667 17.0003H17V24.667C17 25.0351 16.7015 25.3336 16.3333 25.3336H15.6667C15.2985 25.3336 15 25.0351 15 24.667V17.0003H7.3333C6.96511 17.0003 6.66663 16.7018 6.66663 16.3336V15.667C6.66663 15.2988 6.96511 15.0003 7.3333 15.0003H15V7.33365C15 6.96546 15.2985 6.66699 15.6667 6.66699H16.3333C16.7015 6.66699 17 6.96546 17 7.33365V15.0003H24.6667C25.0349 15.0003 25.3333 15.2988 25.3333 15.667Z" fill="currentColor"/> 1042</svg></div></div></div><div class="faq_answer"><div class="margin-small"><div class="w-richtext"><p>Yes. Harborview Finishworks designs and installs custom staircases across the New Hampshire & Southern Maine Seacoastâs (New Hampshire - Strafford & Rockingham Counties and beyond) (Main - York, Cumberland, and Southern Oxford Counties and beyond).</p></div></div></div></div></div><div role="listitem" class="w-dyn-item"><div class="faq_accordion"><div class="faq_question"><div class="text-size-medium text-weight-bold">Can you replace or update an existing staircase without rebuilding the whole thing?</div><div class="faq_icon-wrapper"><div class="icon-embed-small w-embed"><svg width="100%" height="100%" viewBox="0 0 32 32" fill="none" xmlns="http://www.w3.org/2000/svg"> 1043<path d="M25.3333 15.667V16.3336C25.3333 16.7018 25.0349 17.0003 24.6667 17.0003H17V24.667C17 25.0351 16.7015 25.3336 16.3333 25.3336H15.6667C15.2985 25.3336 15 25.0351 15 24.667V17.0003H7.3333C6.96511 17.0003 6.66663 16.7018 6.66663 16.3336V15.667C6.66663 15.2988 6.96511 15.0003 7.3333 15.0003H15V7.33365C15 6.96546 15.2985 6.66699 15.6667 6.66699H16.3333C16.7015 6.66699 17 6.96546 17 7.33365V15.0003H24.6667C25.0349 15.0003 25.3333 15.2988 25.3333 15.667Z" fill="currentColor"/> 1044</svg></div></div></div><div class="faq_answer"><div class="margin-small"><div class="w-richtext"><p>Yes. In many homes we refinish or reface existing stairs â new treads, updated railings, or a fresh species â without a full structural rebuild. If the existing framing is sound, a facelift can transform the look. We'll assess the structure and tell you honestly whether a refit or a full rebuild makes more sense.</p></div></div></div></div></div><div role="listitem" class="w-dyn-item"><div class="faq_accordion"><div class="faq_question"><div class="text-size-medium text-weight-bold">What wood species and railing styles do you offer?</div><div class="faq_icon-wrapper"><div class="icon-embed-small w-embed"><svg width="100%" height="100%" viewBox="0 0 32 32" fill="none" xmlns="http://www.w3.org/2000/svg"> 1045<path d="M25.3333 15.667V16.3336C25.3333 16.7018 25.0349 17.0003 24.6667 17.0003H17V24.667C17 25.0351 16.7015 25.3336 16.3333 25.3336H15.6667C15.2985 25.3336 15 25.0351 15 24.667V17.0003H7.3333C6.96511 17.0003 6.66663 16.7018 6.66663 16.3336V15.667C6.66663 15.2988 6.96511 15.0003 7.3333 15.0003H15V7.33365C15 6.96546 15.2985 6.66699 15.6667 6.66699H16.3333C16.7015 6.66699 17 6.96546 17 7.33365V15.0003H24.6667C25.0349 15.0003 25.3333 15.2988 25.3333 15.667Z" fill="currentColor"/> 1046</svg></div></div></div><div class="faq_answer"><div class="margin-small"><div class="w-richtext"><p>We build staircases in oak, maple, cherry, walnut, or any other hardwood you prefer, with railing options ranging from traditional turned balusters to modern metal, cable, and glass systems. We also match existing millwork in older homes, so a new stair reads as original. We'll walk you through species, stain, and railing options during design.</p></div></div></div></div></div><div role="listitem" class="w-dyn-item"><div class="faq_accordion"><div class="faq_question"><div class="text-size-medium text-weight-bold">How long does it take to build and install a custom staircase?</div><div class="faq_icon-wrapper"><div class="icon-embed-small w-embed">
1046<svg width="100%" height="100%" viewBox="0 0 32 32" fill="none" xmlns="http://www.w3.org/2000/svg"> 1047<path d="M25.3333 15.667V16.3336C25.3333 16.7018 25.0349 17.0003 24.6667 17.0003H17V24.667C17 25.0351 16.7015 25.3336 16.3333 25.3336H15.6667C15.2985 25.3336 15 25.0351 15 24.667V17.0003H7.3333C6.96511 17.0003 6.66663 16.7018 6.66663 16.3336V15.667C6.66663 15.2988 6.96511 15.0003 7.3333 15.0003H15V7.33365C15 6.96546 15.2985 6.66699 15.6667 6.66699H16.3333C16.7015 6.66699 17 6.96546 17 7.33365V15.0003H24.6667C25.0349 15.0003 25.3333 15.2988 25.3333 15.667Z" fill="currentColor"/> 1048</svg></div></div></div><div class="faq_answer"><div class="margin-small"><div class="w-richtext"><p>Most basic staircases take 2â6 weeks cumulatively, from design approval to installation: design and measurement (1â2 weeks), fabrication of treads, risers, and railings in our shop (2â4 weeks for basic designs, 6-10 weeks for large scale ornamental designs), and on-site installation can vary greatly between basic and ornamental designs. Curved or floating staircases and hardwoods with long lead times will extend the timeline.</p></div></div></div></div></div></div></div></div></div></div></div></div></div></section><section class="cta_component"><div class="cta_scrim"></div><div class="container-large"><div class="cta_content"><h2 class="heading-h2 text-on-dark">Ready to Build Something Lasting?</h2><p class="text-large hero_subtitle">Let's talk about your project. Every great result starts with a conversation and a clear, honest plan.</p><div class="hero_actions cta"><a href="/request-estimate" class="button is-ghost"><span aria-hidden="true" class="button_fill"></span><span class="button_label">Request Estimate</span></a><a href="tel:6034574620" target="_blank" class="button is-ghost is-on-dark"><span aria-hidden="true" class="button_fill"></span><span class="button_label">Call Now</span></a></div></div></div></section><footer class="footer_section"><div class="code-embed-7 w-embed w-script">
1048<script type="application/ld+json"> 1049{ 1050 "@context": "https://schema.org", 1051 "@type": "HomeAndConstructionBusiness", 1052 "name": "Harborview Finishworks", 1053 "image": "https://harborviewfinishworks.com/[your-logo-url].png", 1054 "url": "https://harborviewfinishworks.com", 1055 "telephone": "+1-603-457-4620", 1056 "priceRange": "$$$", 1057 "address": { 1058 "@type": "PostalAddress", 1059 "addressRegion": "NH", 1060 "addressCountry": "US" 1061 }, 1062 "areaServed": [ 1063 { "@type": "State", "name": "New Hampshire" }, 1064 { "@type": "State", "name": "Maine" }, 1065 { "@type": "City", "name": "Portsmouth", "addressRegion": "NH" }, 1066 { "@type": "City", "name": "Dover", "addressRegion": "NH" }, 1067 { "@type": "City", "name": "Exeter", "addressRegion": "NH" }, 1068 { "@type": "City", "name": "Hampton", "addressRegion": "NH" }, 1069 { "@type": "City", "name": "Kittery", "addressRegion": "ME" }, 1070 { "@type": "City", "name": "York", "addressRegion": "ME" } 1071 ], 1072 "sameAs": [ 1073 "https://www.facebook.com/[your-facebook-handle]" 1074 ], 1075 "makesOffer": [ 1076 { "@type": "Offer", "itemOffered": { "@type": "Service", "name": "Custom Staircases" } }, 1077 { "@type": "Offer", "itemOffered": { "@type": "Service", "name": "High-End Finishes" } }, 1078 { "@type": "Offer", "itemOffered": { "@type": "Service", "name": "Home Renovations" } }, 1079 { "@type": "Offer", "itemOffered": { "@type": "Service", "name": "Custom Projects" } } 1080 ] 1081} 1082</script>
1082</div><div class="container-large"><div class="padding-vertical padding-xxlarge"><div class="padding-bottom padding-xxlarge"><div class="w-layout-grid footer_top-wrapper"><div id="w-node-e8e58a38-f0d8-22fa-2656-ef83ee18ba2f-ee18ba2a" class="footer_left-wrapper"><div id="w-node-b1fce3b8-7a2a-6bee-154d-d34e7eea0bb4-ee18ba2a" class="footer_icon"><a href="/" aria-label="Harborview Finishworks Home" id="w-node-e8e58a38-f0d8-22fa-2656-ef83ee18ba30-ee18ba2a" class="footer_logo-link w-nav-brand"><img loading="lazy" src="https://cdn.prod.website-files.com/682f3dbbd036f316ac014c2f/686c2b3bca187a10c63a84c1_ac15d60d11de8ed5d26f82fa6fb59239_harborview-logo.webp" alt="harborview logo" sizes="(max-width: 479px) 43vw, (max-width: 767px) 48vw, (max-width: 991px) 49vw, (max-width: 3200px) 50vw, 1600px" srcset="https://cdn.prod.website-files.com/682f3dbbd036f316ac014c2f/686c2b3bca187a10c63a84c1_ac15d60d11de8ed5d26f82fa6fb59239_harborview-logo-p-500.webp 500w, https://cdn.prod.website-files.com/682f3dbbd036f316ac014c2f/686c2b3bca187a10c63a84c1_ac15d60d11de8ed5d26f82fa6fb59239_harborview-logo-p-800.webp 800w, https://cdn.prod.website-files.com/682f3dbbd036f316ac014c2f/686c2b3bca187a10c63a84c1_ac15d60d11de8ed5d26f82fa6fb59239_harborview-logo-p-1080.webp 1080w, https://cdn.prod.website-files.com/682f3dbbd036f316ac014c2f/686c2b3bca187a10c63a84c1_ac15d60d11de8ed5d26f82fa6fb59239_harborview-logo.webp 1600w" class="footer_logo"/></a></div><div class="text-size-small footer-copy">Proudly serving New Hampshire Seacoast and Southern Maine: Including Portsmouth, Dover, Exeter, Hampton, Kittery, and York.</div><div class="footer_left-socials"><div id="w-node-e8e58a38-f0d8-22fa-2656-ef83ee18ba33-ee18ba2a" class="w-layout-grid footer_social-list"><div class="text-size-small light">Follow Us:</div><a href="https://www.facebook.com/profile.php?id=61574990229449" target="_blank" class="footer_social-link w-inline-block"><div class="icon-embed-xsmall w-embed"><svg width="100%" height="100%" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"> 1083<path d="M22 12.0611C22 6.50451 17.5229 2 12 2C6.47715 2 2 6.50451 2 12.0611C2 17.0828 5.65684 21.2452 10.4375 22V14.9694H7.89844V12.0611H10.4375V9.84452C10.4375 7.32296 11.9305 5.93012 14.2146 5.93012C15.3088 5.93012 16.4531 6.12663 16.4531 6.12663V8.60261H15.1922C13.95 8.60261 13.5625 9.37822 13.5625 10.1739V12.0611H16.3359L15.8926 14.9694H13.5625V22C18.3432 21.2452 22 17.083 22 12.0611Z" fill="CurrentColor"/> 1084</svg> 1085 1086<style> 1087/* Footer social link hover â icon + text turn pearl */ 1088.footer_social-link { 1089 transition: color 0.3s ease; 1090} 1091 1092.footer_social-link:hover .social-text, 1093.footer_social-link:hover { 1094 color: var(--_primitives---colors--pearl); 1095} 1096 1097/* Icon: works if the embedded SVG uses fill="currentColor" */ 1098.footer_social-link .icon-embed-xsmall svg { 1099 transition: fill 0.3s ease, color 0.3s ease; 1100} 1101.footer_social-link:hover .icon-embed-xsmall svg { 1102 color: var(--_primitives---colors--pearl); 1103} 1104 1105/* Fallback: force the SVG fill directly in case it has a hardcoded color */ 1106.footer_social-link:hover .icon-embed-xsmall svg, 1107.footer_social-link:hover .icon-embed-xsmall svg path { 1108 fill: var(--_primitives---colors--pearl); 1109} 1110</style></div><div class="social-text">facebook</div></a></div><div class="w-layout-grid footer_social-list"><div class="text-size-small light">contact us:</div><a href="tel:603-457-4620" class="footer_link">(603) 457-4620</a></div></div></div><div id="w-node-e8e58a38-f0d8-22fa-2656-ef83ee18ba3f-ee18ba2a" class="w-layout-grid footer_menu-wrapper"><div id="w-node-e8e58a38-f0d8-22fa-2656-ef83ee18ba40-ee18ba2a" class="footer_link-list"><div class="text-size-small light">COMPANY</div><a href="/about" class="footer_link">about</a><a href="https://harborview-finishworks.webflow.io/#our-work" class="footer_link">our work</a><a href="https://harborview-finishworks.webflow.io/#testimonials" class="footer_link">testimonials</a><a href="https://www.harborviewfinishworks.com/request-estimate" class="footer_link">request estimate</a></div><div id="w-node-e8e58a38-f0d8-22fa-2656-ef83ee18ba4b-ee18ba2a" class="footer_link-list"><div class="text-size-small light">Services</div><a href="/services/staircases" aria-current="page" class="footer_link w--current">staircases</a><a href="/services/high-end-finishes" class="footer_link">high-end finishes</a><a href="/services/home-commercial-renovations" class="footer_link">Home & Commercial</a><a href="/services/custom-projects" class="footer_link">custom projects</a></div></div></div></div><div class="padding-top padding-medium"><div class="divider-horizontal"></div><div class="footer_bottom-wrapper"><div id="w-node-e8e58a38-f0d8-22fa-2656-ef83ee18ba59-ee18ba2a" class="w-layout-grid footer_legal-list right"><a aria-label="outbound link privacy policy" href="https://app.termly.io/policy-viewer/policy.html?policyUUID=fd5030e4-dda4-4fe7-a85b-9cf684867d4f" target="_blank" class="footer_legal-link">Privacy Policy</a><a aria-label="outbound link terms of service" href="https://app.termly.io/policy-viewer/policy.html?policyUUID=7e0ea259-00e9-4584-a732-827b348b77d1" target="_blank" class="footer_legal-link">Terms of Service</a></div><div class="footer_credit-text">© 2026 Harborview Finishworks. All rights reserved.</div><div id="w-node-e8e58a38-f0d8-22fa-2656-ef83ee18ba60-ee18ba2a" class="footer_credit-text center">Designed &
1110Â Built By <a href="https://www.modment.studio" aria-label="outbound link to modment.studio" target="_blank" class="footer_legal-link">Modment</a></div></div></div></div></div></footer></div>
1110<script src="https://d3e54v103j8qbb.cloudfront.net/js/jquery-3.5.1.min.dc5e7f18c8.js?site=682f3dbbd036f316ac014c2f" type="text/javascript" integrity="sha256-9/aliU8dGd2tb6OSsuzixeV4y/faTqgFtohetphbbj0=" crossorigin="anonymous"></script>
1110<script src="https://cdn.prod.website-files.com/682f3dbbd036f316ac014c2f/js/harborview-finishworks.ee5a26e5.f4eedde365bb8a6b.js" type="text/javascript" integrity="sha384-abOHnXN8Wsui80HVzTdGpKvaRhze/O0QacQoJoXUoSLVcMbWukzNZGOkkeQXCS7T" crossorigin="anonymous"></script>
1110<script src="https://cdn.prod.website-files.com/gsap/3.15.0/gsap.min.js" type="text/javascript"></script>
1110<script src="https://cdn.prod.website-files.com/gsap/3.15.0/SplitText.min.js" type="text/javascript"></script>
1110<script src="https://cdn.prod.website-files.com/gsap/3.15.0/ScrambleTextPlugin.min.js" type="text/javascript"></script>
1110<script src="https://cdn.prod.website-files.com/gsap/3.15.0/TextPlugin.min.js" type="text/javascript"></script>
1110<script src="https://cdn.prod.website-files.com/gsap/3.15.0/ScrollTrigger.min.js" type="text/javascript"></script>
1110<script type="text/javascript">gsap.registerPlugin(SplitText,ScrambleTextPlugin,TextPlugin,ScrollTrigger);</script>
1110<style> 1111.navbar_component{background-color:rgba(0,0,0,0);-webkit-backdrop-filter:blur(5px);backdrop-filter:blur(5px);transition:background-color .3s ease,backdrop-filter .3s ease,box-shadow .3s ease;} 1112.navbar_component.is-scrolled{background-color:#FFFDF4 !important;box-shadow:0 1px 0 rgba(8,36,60,0.08);} 1113.navbar_component.is-scrolled .navbar_menu .navbar_link{color:#0D2436 !important;} 1114.hbv-drawer-backdrop{position:fixed;inset:0;background:rgba(8,20,32,.5);opacity:0;visibility:hidden;transition:opacity .35s ease;z-index:10;} 1115.hbv-drawer-backdrop.is-open{opacity:1;visibility:visible;} 1116.slider_arrow{font-size:0 !important;} 1117</style>
1118<script type="application/ld+json"> 1119{ 1120 "@context": "https://schema.org", 1121 "@type": "HomeAndConstructionBusiness", 1122 "name": "Harborview Finishworks", 1123 "url": "https://harborviewfinishworks.com", 1124 "telephone": "+1-603-457-4620", 1125 "priceRange": "$$$", 1126 "description": "High-end finish carpentry, remodeling, and custom builds serving the New Hampshire Seacoast and Southern Maine.", 1127 "areaServed": [ 1128 { "@type": "State", "name": "New Hampshire" }, 1129 { "@type": "State", "name": "Maine" }, 1130 { "@type": "Place", "name": "New Hampshire Seacoast" }, 1131 { "@type": "Place", "name": "Southern Maine" } 1132 ], 1133 "makesOffer": [ 1134 { "@type": "Offer", "itemOffered": { "@type": "Service", "name": "Custom Staircases" } }, 1135 { "@type": "Offer", "itemOffered": { "@type": "Service", "name": "High-End Finishes" } }, 1136 { "@type": "Offer", "itemOffered": { "@type": "Service", "name": "Home Renovations" } }, 1137 { "@type": "Offer", "itemOffered": { "@type": "Service", "name": "Custom Projects" } } 1138 ] 1139} 1140</script>
1140</body></html>
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.