PageSourceSearch

https://harborview-finishworks.webflow.io/services/staircases

html harborview-finishworks.webflow.io collected 2026-10-03 13:08:21 UTC 81,680 bytes, 1,140 lines download raw bytes

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 &amp; 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 &amp; 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&#x27;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 &amp; Builds</li><li>Open-Riser &amp; Floating Stairs</li><li>Railings &amp; Balustrades</li><li>Newel Posts &amp; 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&#x27;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 &amp; Southern Maine Seacoast’s (New Hampshire - Strafford &amp; 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&#x27;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&#x27;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&#x27;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 &amp; 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 &amp;
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.