diff --git a/.github/copilot-instructions.md b/.github/copilot-instructions.md index 542224c..8fe860d 100644 --- a/.github/copilot-instructions.md +++ b/.github/copilot-instructions.md @@ -3,15 +3,15 @@ This is a small static-ish website whose source lives at the repository root. Keep suggestions focused, minimal, and specific to the existing patterns. - Entry / what to edit - - `index.php` is the site's entry point (contains the HTML structure, nav, hero, and sections). Edit content/structure here. - - `css/` contains SCSS source and compiled CSS. `css/main.scss` imports partials from `css/components/` (e.g. `_nav.scss`, `_slide.scss`). - - `js/main.js` is the single client-side script — it controls the hamburger/nav, slides, and a light client-side prompt-based auth. + - `index.html` is the site's single page (nav, hero, sections, HOA board table, contact, footer). Edit content/structure here. + - `css/main.css` is the **served** stylesheet and is edited directly. `css/main.scss` + `css/components/` partials (`_nav.scss`, `_hero.scss`, `_sections.scss`, `_gallery.scss`, `_board.scss`) are the SCSS source, kept in sync by hand. No build tooling is present locally; if you have Dart Sass, compile with `sass css/main.scss css/main.css`. + - `js/main.js` is the single client-side script — it controls the hamburger/nav, smooth-scroll, and the photo galleries (array-based fade carousel with arrows, dots, autoplay, and swipe). - Architecture & patterns (observable) - No framework/tooling files found (no package.json, build scripts). The project is organized as plain HTML/CSS/JS served from `index.php`. - SCSS pattern: variables at top of `main.scss` (colors, breakpoints), mixins for fonts (`Libre`, `Lato`), and partials under `css/components/` imported by `main.scss`. - JS pattern: single-file imperative DOM manipulation (`document.getElementById`, `querySelector`, event handlers). Use `const`/`let`, short arrow functions and maintain global-scope structure similar to `js/main.js`. - - Static assets: images in `img/` follow numeric patterns (e.g. `vineyard-0.jpg`, `house-0.jpg`) used by slide logic in `main.js`. + - Static assets: optimized photos live in `img/gallery/` (referenced explicitly in `index.html`); the hero video is `img/hero.mp4` / `img/hero-mobile.mp4` with `img/hero-poster.jpg`. - Development / preview notes (inferred) - No CI or build discovered. To preview locally you can serve the folder with a simple server. A safe, minimal option: run `php -S localhost:8000` from the project root and open `http://localhost:8000/`. @@ -19,8 +19,7 @@ This is a small static-ish website whose source lives at the repository root. Ke - Conventions and gotchas to follow when changing code - Keep CSS partials modular. Add new component styles under `css/components/` and import them in `css/main.scss` rather than editing compiled `css/main.css` directly. - - JS uses simple DOM IDs/classes; prefer selecting elements by the same IDs/classes and follow the existing event-handler pattern (assign functions to `onclick`, small helpers like `toggleNav`, `openNav`, `closeNav`). - - The project contains a client-side “light auth” in `js/main.js` that checks literal passwords (`'12345'`, `'abcde'`). Treat this as insecure; if asked to modify auth, recommend server-side changes and note security concerns. + - JS uses simple DOM IDs/classes; prefer selecting elements by the same IDs/classes and follow the existing event-handler pattern (small helpers like `toggleNav`, `closeNav`, `scrollToTarget`, and the `.gallery` initializer). - When merging or editing `.github/copilot-instructions.md` - Preserve any human-authored guidance already present. If adding new items, keep them concise and cite files (e.g. `index.php`, `css/main.scss`, `css/components/_nav.scss`, `js/main.js`). diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..4f3e2e1 --- /dev/null +++ b/.gitignore @@ -0,0 +1,9 @@ +# macOS +.DS_Store +**/.DS_Store + +# Local preview / tooling +.claude/ + +# SCSS build artifacts +css/*.css.map diff --git a/README.md b/README.md index fc69ff3..065ab8b 100644 --- a/README.md +++ b/README.md @@ -1,9 +1,43 @@ # pine-creek-hoa -Pine Creek website +Public marketing website for the **Pine Creek** community in Kannapolis, NC. -This is the next generation Public Website for the Pine Creek Community in Kannapolis, NC +It is a fully static site (HTML/CSS/JS) designed to be hosted at no cost on +**Cloudflare Pages**, and is responsive for desktop, tablet, and mobile. -It is designed to be static in nature to host at no cost using cloudflare pages, and responsive in design to support clients on desktop, mobile, and tablet. +## Structure -Current Shell Includes overall design language and placeholder graphics. \ No newline at end of file +- `index.html` — the entire single-page site (nav, hero, sections, HOA board, contact, footer). +- `css/main.css` — compiled, **served** stylesheet. Edited directly (no build tooling required). +- `css/main.scss` + `css/components/*` — SCSS source, kept in sync with `main.css`. +- `js/main.js` — mobile nav, smooth-scroll, and the photo galleries. +- `img/` — images and the hero video (`hero.mp4`, `hero-mobile.mp4`, `hero-poster.jpg`), + optimized estate/vineyard photos in `img/gallery/`, and `community-map.jpg`. + +## Local preview + +Any static file server works, e.g.: + +```sh +# Python +python3 -m http.server 8080 +# or Docker (nginx) +docker run --rm -p 8080:80 -v "$PWD":/usr/share/nginx/html:ro nginx:alpine +``` + +Then open http://localhost:8080/ + +## Editing styles + +`css/main.css` is what the browser loads, so changes can be made there directly. +If you have the Dart Sass CLI installed and prefer the SCSS source, recompile with: + +```sh +sass css/main.scss css/main.css +``` + +## Updating the HOA board + +The board roster lives in a `` inside the +`#home-owners` section of `index.html`. Replace the placeholder name/email cells +with the real values (5 members: Name, Position, Email). diff --git a/apple-touch-icon.png b/apple-touch-icon.png new file mode 100644 index 0000000..6aa32d8 Binary files /dev/null and b/apple-touch-icon.png differ diff --git a/css/components/_board.scss b/css/components/_board.scss new file mode 100644 index 0000000..b58b1a9 --- /dev/null +++ b/css/components/_board.scss @@ -0,0 +1,78 @@ +// HOA board roster table (stacks into cards on mobile) +.board-heading { + text-align: center; + font-size: 24px; + margin: 40px 0 24px; +} + +.board-table { + width: 100%; + max-width: 900px; + margin: 0 auto; + border-collapse: collapse; + background: $white; + border-radius: 6px; + overflow: hidden; + box-shadow: 0 12px 30px -18px rgba(0, 0, 0, 0.4); + + thead th { + background: $black; + color: $white; + @include Libre; + font-weight: 700; + text-align: left; + padding: 16px 22px; + font-size: 14px; + letter-spacing: 0.5px; + } + + tbody td { + padding: 16px 22px; + border-top: 1px solid rgba(0, 0, 0, 0.08); + vertical-align: middle; + } + + tbody tr:nth-child(even) { background: $cream; } + tbody tr:hover { background: rgba(171, 153, 109, 0.12); } + + td a { color: darken($gold, 10%); text-decoration: none; } + td a:hover { text-decoration: underline; } + td[data-label="Position"] { @include Libre; } + + // Stacked cards on phones + @media (max-width: $xs-break) { + box-shadow: none; + + thead { display: none; } + &, tbody, tr, td { display: block; width: 100%; } + + tbody tr { + margin-bottom: 16px; + border: 1px solid rgba(171, 153, 109, 0.3); + border-radius: 6px; + overflow: hidden; + box-shadow: 0 8px 20px -14px rgba(0, 0, 0, 0.4); + + &:nth-child(even) { background: $white; } + } + + tbody td { + border-top: none; + padding: 10px 18px; + + &:first-child { padding-top: 16px; font-weight: 700; font-size: 17px; } + &:last-child { padding-bottom: 16px; } + + &::before { + content: attr(data-label); + display: block; + text-transform: uppercase; + letter-spacing: 1px; + font-size: 10px; + color: $gold; + margin-bottom: 2px; + } + &:first-child::before { content: ""; margin: 0; } + } + } +} diff --git a/css/components/_features.scss b/css/components/_features.scss new file mode 100644 index 0000000..33840ef --- /dev/null +++ b/css/components/_features.scss @@ -0,0 +1,178 @@ +// Availability note, Google map embed, homeowner documents, lightbox + +.availability-note { + border-left: 3px solid $gold; + padding: 4px 0 4px 16px; + margin: 22px 0; + color: $gray; + font-style: italic; + + a { color: darken($gold, 10%); font-weight: 700; } +} + +// Google map embed (Kannapolis) +.map-embed { + margin-top: 40px; + position: relative; + width: 100%; + padding-top: 42%; + border-radius: 6px; + overflow: hidden; + box-shadow: 0 18px 40px -18px rgba(0, 0, 0, 0.4); + border: 1px solid rgba(171, 153, 109, 0.3); + + iframe { + position: absolute; + inset: 0; + width: 100%; + height: 100%; + border: 0; + } + + @media (max-width: $s-break) { padding-top: 75%; } +} + +// Homeowner documents +.doc-grid { + display: grid; + grid-template-columns: repeat(2, 1fr); + gap: 18px; + max-width: 900px; + margin: 28px auto 0; + + @media (max-width: $s-break) { grid-template-columns: 1fr; } +} + +.doc-card { + display: flex; + align-items: center; + gap: 16px; + padding: 18px 20px; + background: $white; + border: 1px solid rgba(171, 153, 109, 0.35); + border-radius: 6px; + text-decoration: none; + color: $black; + box-shadow: 0 10px 24px -18px rgba(0, 0, 0, 0.4); + transition: transform 0.18s, box-shadow 0.18s, border-color 0.18s; + + &:hover { + transform: translateY(-3px); + box-shadow: 0 16px 30px -16px rgba(0, 0, 0, 0.45); + border-color: $gold; + text-decoration: none; + color: $black; + } +} + +.doc-icon { + flex: 0 0 auto; + width: 46px; + height: 46px; + display: flex; + align-items: center; + justify-content: center; + border-radius: 50%; + background: rgba(171, 153, 109, 0.14); + color: darken($gold, 10%); + + svg { width: 24px; height: 24px; } +} + +.doc-text { display: flex; flex-direction: column; } +.doc-title { @include Libre; font-size: 16px; line-height: 1.3; margin-bottom: 3px; } +.doc-meta { font-size: 12.5px; color: $gray; } +.doc-note { + text-align: center; + color: $gray; + margin-top: 24px; + font-size: 15px; + + a { color: darken($gold, 10%); font-weight: 700; } +} + +// Lightbox +.gallery-track.zoomable { cursor: zoom-in; } + +.lightbox { + position: fixed; + inset: 0; + z-index: 1000; + display: flex; + align-items: center; + justify-content: center; + background: rgba(20, 18, 18, 0.92); + padding: 24px; + + &[hidden] { display: none; } + + &-figure { + margin: 0; + max-width: 92vw; + max-height: 88vh; + display: flex; + flex-direction: column; + align-items: center; + } + + &-img { + max-width: 92vw; + max-height: 80vh; + object-fit: contain; + border-radius: 4px; + box-shadow: 0 24px 60px rgba(0, 0, 0, 0.6); + cursor: pointer; + } + + &-caption { + color: rgba(255, 255, 255, 0.85); + font-size: 13px; + margin-top: 12px; + text-align: center; + max-width: 700px; + } + + &-close, + &-arrow { + position: absolute; + border: none; + background: rgba(255, 255, 255, 0.12); + color: $white; + cursor: pointer; + display: flex; + align-items: center; + justify-content: center; + border-radius: 50%; + transition: background 0.2s; + + &:hover { background: rgba(255, 255, 255, 0.28); } + } + + &-close { + top: 18px; + right: 18px; + width: 48px; + height: 48px; + + svg { width: 26px; height: 26px; } + } + + &-arrow { + top: 50%; + transform: translateY(-50%); + width: 54px; + height: 54px; + + svg { width: 28px; height: 28px; } + + &.prev { left: 20px; } + &.next { right: 20px; } + + @media (max-width: $xs-break) { + width: 44px; + height: 44px; + &.prev { left: 8px; } + &.next { right: 8px; } + } + } +} diff --git a/css/components/_gallery.scss b/css/components/_gallery.scss new file mode 100644 index 0000000..12d5f18 --- /dev/null +++ b/css/components/_gallery.scss @@ -0,0 +1,78 @@ +// Image gallery / carousel +.gallery { + position: relative; + border-radius: 6px; + overflow: hidden; + box-shadow: 0 18px 40px -18px rgba(0, 0, 0, 0.45); + + &-track { + position: relative; + width: 100%; + height: 460px; + + @media (max-width: $m-break) { height: 360px; } + @media (max-width: $xs-break) { height: 260px; } + } + + &-img { + position: absolute; + inset: 0; + width: 100%; + height: 100%; + object-fit: cover; + opacity: 0; + transition: opacity 0.6s ease; + + &.is-active { opacity: 1; } + } + + &-arrow { + position: absolute; + top: 50%; + transform: translateY(-50%); + width: 44px; + height: 44px; + border: none; + border-radius: 50%; + background: rgba(255, 255, 255, 0.85); + color: $black; + cursor: pointer; + display: flex; + align-items: center; + justify-content: center; + z-index: 3; + transition: background 0.2s, transform 0.15s; + + &:hover { background: $white; } + &:active { transform: translateY(-50%) scale(0.92); } + + svg { width: 22px; height: 22px; } + + &.prev { left: 14px; } + &.next { right: 14px; } + } + + &-dots { + position: absolute; + bottom: 14px; + left: 0; + right: 0; + display: flex; + justify-content: center; + gap: 8px; + z-index: 3; + } + + &-dot { + width: 9px; + height: 9px; + border-radius: 50%; + border: none; + padding: 0; + background: rgba(255, 255, 255, 0.55); + cursor: pointer; + transition: background 0.2s, transform 0.2s; + + &.is-active { background: $gold; transform: scale(1.25); } + } +} diff --git a/css/components/_hero.scss b/css/components/_hero.scss new file mode 100644 index 0000000..83ff17a --- /dev/null +++ b/css/components/_hero.scss @@ -0,0 +1,85 @@ +// Full-bleed video hero +.hero { + position: relative; + height: calc(100vh - 92px); + min-height: 480px; + max-height: 820px; + overflow: hidden; + display: flex; + align-items: center; + justify-content: center; + text-align: center; + + @media (max-width: $m-break) { height: calc(100vh - 72px); } + + &-video { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + object-fit: cover; + z-index: 0; + } + + &-overlay { + position: absolute; + inset: 0; + background: linear-gradient(180deg, rgba(35, 31, 32, 0.35) 0%, rgba(35, 31, 32, 0.15) 40%, rgba(35, 31, 32, 0.6) 100%); + z-index: 1; + } + + &-content { + position: relative; + z-index: 2; + color: $white; + padding: 0 20px; + } + + &-eyebrow { + @include Libre; + text-transform: uppercase; + letter-spacing: 5px; + font-size: 13px; + margin-bottom: 12px; + color: #f2e9d6; + } + + &-title { + font-size: 84px; + margin: 0 0 14px; + line-height: 1; + text-shadow: 0 2px 24px rgba(0, 0, 0, 0.4); + + @media (max-width: $s-break) { font-size: 52px; } + } + + &-sub { + @include Libre; + font-size: 20px; + margin-bottom: 28px; + text-shadow: 0 1px 10px rgba(0, 0, 0, 0.5); + + @media (max-width: $s-break) { font-size: 16px; } + } + + &-btn { font-size: 15px; padding: 0.7rem 2rem; } + + &-scroll { + position: absolute; + bottom: 24px; + left: 50%; + transform: translateX(-50%); + z-index: 2; + color: $white; + opacity: 0.85; + animation: heroBounce 2s infinite; + + svg { width: 34px; height: 34px; } + } +} + +@keyframes heroBounce { + 0%, 100% { transform: translate(-50%, 0); } + 50% { transform: translate(-50%, 8px); } +} diff --git a/css/components/_nav.scss b/css/components/_nav.scss index 24eeaea..1d4b900 100644 --- a/css/components/_nav.scss +++ b/css/components/_nav.scss @@ -4,11 +4,17 @@ nav.main-nav { border-bottom-right-radius: 100% 64px; box-shadow: 0 4px 5px 0px rgba(0,0,0,.16); display: flex; - padding: 16px 0 32px; + padding: 12px 0 28px; position: fixed; width: 100%; - z-index: 1; - + z-index: 20; + transition: box-shadow .25s, padding .25s; + + &.scrolled { + padding: 8px 0 20px; + box-shadow: 0 6px 14px 0px rgba(0,0,0,.18); + } + .mobile-nav { align-items: center; display: flex; @@ -50,7 +56,7 @@ nav.main-nav { &:hover { &> div { - background-color: $gray; + background-color: $gold; } } @@ -67,6 +73,7 @@ nav.main-nav { & div:nth-child(2) { transform: translate(-17px); width: 40px; + opacity: 0; } & div:last-child { bottom: 1px; @@ -108,7 +115,7 @@ nav.main-nav { a { @include Libre; - + color: $black; display: inline-block; font-size: 11px; @@ -117,10 +124,13 @@ nav.main-nav { text-decoration: none; text-transform: uppercase; width: 100%; - + transition: color .2s; + + &:hover { color: $gold; } + @media (max-width: $m-break) { - font-size: 14px; - padding-bottom: 16px; + font-size: 16px; + padding-bottom: 22px; width: 50%; } } @@ -148,7 +158,9 @@ nav.main-nav { &.main-nav--logo { a { img { - margin: 0 8px; + margin: 0 14px; + height: 52px; + width: auto; } } diff --git a/css/components/_sections.scss b/css/components/_sections.scss new file mode 100644 index 0000000..3886e2c --- /dev/null +++ b/css/components/_sections.scss @@ -0,0 +1,99 @@ +// Section layout, headings, feature images, map, contact, footer + +.section { + padding-top: 72px; + padding-bottom: 72px; + + @media (max-width: $s-break) { padding-top: 48px; padding-bottom: 48px; } +} + +.eyebrow { + display: inline-block; + @include Libre; + text-transform: uppercase; + letter-spacing: 3px; + font-size: 12px; + color: $gold; + margin-bottom: 10px; + + &.light { color: #d8c9a3; } +} + +.section-title { + font-size: 36px; + margin: 0 0 16px; + line-height: 1.2; + + @media (max-width: $s-break) { font-size: 28px; } +} + +.section-subtitle { + color: $gray; + font-style: italic; + margin-bottom: 20px; +} + +.section-lead { + max-width: 780px; + margin: 0 auto 8px; + color: $gray; + font-size: 17px; +} + +.section-divider { + border: 0; + border-top: 1px solid rgba(171, 153, 109, 0.35); + margin: 0; +} + +.feature-img { + width: 100%; + height: 440px; + object-fit: cover; + border-radius: 6px; + box-shadow: 0 18px 40px -18px rgba(0, 0, 0, 0.45); + + @media (max-width: $s-break) { height: 280px; } +} + +// Community map +.map-frame { + border-radius: 6px; + overflow: hidden; + box-shadow: 0 18px 40px -18px rgba(0, 0, 0, 0.4); + border: 1px solid rgba(171, 153, 109, 0.3); + max-width: 900px; + margin: 0 auto; +} +.map-img { display: block; width: 100%; } + +// Contact +.contact-section { + background: $black; + color: $white; + + .section-title { color: $white; } + .section-lead { color: #cfcabd; } +} +.contact-btn { + margin-top: 18px; + background: $gold; + border-color: $gold; + color: $white; + @include Libre; + padding: 0.7rem 2rem; + + &:hover { background: darken($gold, 10%); border-color: darken($gold, 10%); color: $white; } +} + +// Footer +.site-footer { + background: $cream; + text-align: center; + padding: 44px 0; + border-top: 1px solid rgba(171, 153, 109, 0.3); + + .footer-logo { height: 70px; margin-bottom: 14px; } + .footer-tagline { @include Libre; color: $gray; margin-bottom: 6px; } + .footer-copy { color: $light-gray; font-size: 13px; margin: 0; } +} diff --git a/css/components/_slide.scss b/css/components/_slide.scss deleted file mode 100644 index 7e918bc..0000000 --- a/css/components/_slide.scss +++ /dev/null @@ -1,89 +0,0 @@ -.slides { - position: relative; - - &.vineyard { - min-height: 300px; - img { - height: 300px; - } - } - - &.house { - min-height: 400px; - img { - height: 400px; - } - } - - - - img { - border-radius: 5px; - object-fit: cover; - opacity: 1; - transition: .15s; - width: 100%; - - &::selection { - background: rgba(255,255,255,0); - } - - &.out { - opacity: 0; - } - } - - .slides-arrow { - align-items: center; - background: $white; - border-radius: 5px; - cursor: pointer; - display: flex; - height: 50px; - justify-content: center; - left: -25px; - opacity: 1; - position: absolute; - right: auto; - top: 50%; - transform: translateY(-50%); - transition: .15s; - width: 50px; - - &.out { - opacity: 0; - pointer-events: none; - } - - svg { - background-color: $light-gray; - border-radius: 3px; - color: $white; - height: 32px; - padding: 4px; - pointer-events: none; - transition: .1s; - width: 32px; - } - - &:last-child { - left: auto; - right: -25px; - } - - &:hover { - svg { - background-color: darken($light-gray, 5%); - border-radius: 4px; - transform: scale(1.15); - } - } - - &:active { - svg { - background-color: darken($light-gray, 10%); - transform: scale(1.1); - } - } - } - } \ No newline at end of file diff --git a/css/main.css b/css/main.css index 9dbe87f..7cf77f4 100644 --- a/css/main.css +++ b/css/main.css @@ -1,58 +1,85 @@ +/* ============================================================ + Pine Creek — main stylesheet + Palette: gold #AB996D · black #231F20 · gray #585858 + light-gray #bebebe · cream #F7F4EE · white #fff + Fonts: Libre Baskerville (headings) · Lato (body) + NOTE: css/main.scss is the source. No build tooling is present + locally, so this compiled file is edited directly and kept in + sync with the SCSS by hand. + ============================================================ */ + +:root { + --gold: #AB996D; + --gold-dark: #8a7a52; + --black: #231F20; + --gray: #585858; + --light-gray: #bebebe; + --cream: #F7F4EE; + --white: #ffffff; +} + +* { box-sizing: border-box; } + +body { + font-family: "Lato", sans-serif; + background-color: var(--white); + color: var(--black); + margin: 0; + overflow-x: hidden; + line-height: 1.65; +} + +html { scroll-behavior: smooth; } + +p, a, li, span, div, td, th { font-family: "Lato", sans-serif; } +h1, h2, h3, h4, h5, h6 { font-family: "Libre Baskerville", serif; } + +img { max-width: 100%; } + +/* ---------- Buttons ---------- */ .btn { font-family: "Libre Baskerville", serif; font-size: 14px; + letter-spacing: 0.3px; + padding: 0.55rem 1.5rem; + border-radius: 2px; } +.btn + .btn { margin-left: 0.5rem; } .btn-primary { - background-color: #AB996D; - border-color: #AB996D; + background-color: var(--gold); + border-color: var(--gold); } .btn-primary:hover { - background-color: #917f54; - border-color: #917f54; + background-color: var(--gold-dark); + border-color: var(--gold-dark); } -.btn-primary:active, .btn-primary:focus, .btn-primary:not(:disabled):not(.disabled):active, .btn-primary:not(:disabled):not(.disabled):active:focus { +.btn-primary:active, .btn-primary:focus, +.btn-primary:not(:disabled):not(.disabled):active, +.btn-primary:not(:disabled):not(.disabled):active:focus { background-color: #81714a; border-color: #81714a; box-shadow: 0 0 0 0.2rem rgba(129, 113, 74, 0.5); } -body { - font-family: "Lato", sans-serif; - background-color: #ffffff; - color: #231F20; - margin: 0; - overflow-x: hidden; -} - -p, a, li, span, div { - font-family: "Lato", sans-serif; -} - -h1, h2, h3, h4, h5, h6 { - font-family: "Libre Baskerville", serif; -} - -.page-content { - padding: 110px 0 0 0; - position: relative; - top: -32px; -} -.page-content .hero-text h1 { - font-size: 64px; - margin-top: 0; -} - +/* ============================================================ + NAVIGATION + ============================================================ */ nav.main-nav { - background: #ffffff; + background: var(--white); border-bottom-left-radius: 100% 64px; border-bottom-right-radius: 100% 64px; box-shadow: 0 4px 5px 0px rgba(0, 0, 0, 0.16); display: flex; - padding: 16px 0 32px; + padding: 12px 0 28px; position: fixed; width: 100%; - z-index: 1; + z-index: 20; + transition: box-shadow 0.25s, padding 0.25s; +} +nav.main-nav.scrolled { + padding: 8px 0 20px; + box-shadow: 0 6px 14px 0px rgba(0, 0, 0, 0.18); } nav.main-nav .mobile-nav { align-items: center; @@ -61,15 +88,11 @@ nav.main-nav .mobile-nav { } nav.main-nav .mobile-nav .mobile-nav--logo { display: none; - max-width: 100px; -} -nav.main-nav .mobile-nav .mobile-nav--logo img { - width: 100%; + max-width: 96px; } +nav.main-nav .mobile-nav .mobile-nav--logo img { width: 100%; } @media (max-width: 991px) { - nav.main-nav .mobile-nav .mobile-nav--logo { - display: block; - } + nav.main-nav .mobile-nav .mobile-nav--logo { display: block; } } nav.main-nav .mobile-nav .hamburger { cursor: pointer; @@ -80,37 +103,26 @@ nav.main-nav .mobile-nav .hamburger { z-index: 1; } nav.main-nav .mobile-nav .hamburger > div { - background-color: #231F20; + background-color: var(--black); border-radius: 2px; - height: 5px; + height: 4px; margin-bottom: 5px; transition: 0.25s; width: 30px; } -nav.main-nav .mobile-nav .hamburger > div:last-child { - margin-bottom: 0; -} -nav.main-nav .mobile-nav .hamburger:hover > div { - background-color: #585858; -} +nav.main-nav .mobile-nav .hamburger > div:last-child { margin-bottom: 0; } +nav.main-nav .mobile-nav .hamburger:hover > div { background-color: var(--gold); } @media (max-width: 991px) { - nav.main-nav .mobile-nav .hamburger { - display: block; - } + nav.main-nav .mobile-nav .hamburger { display: block; } } nav.main-nav .mobile-nav .hamburger.in div:first-child { - position: relative; - top: 1px; - transform: rotate(45deg); + position: relative; top: 1px; transform: rotate(45deg); } nav.main-nav .mobile-nav .hamburger.in div:nth-child(2) { - transform: translate(-17px); - width: 40px; + transform: translate(-17px); width: 40px; opacity: 0; } nav.main-nav .mobile-nav .hamburger.in div:last-child { - bottom: 1px; - position: relative; - transform: rotate(-45deg); + bottom: 8px; position: relative; transform: rotate(-45deg); } nav.main-nav ul { align-items: center; @@ -121,8 +133,9 @@ nav.main-nav ul { } @media (max-width: 991px) { nav.main-nav ul { - background-color: #ffffff; + background-color: var(--white); flex-direction: column; + justify-content: center; height: 100%; left: 100%; padding: 24px; @@ -130,10 +143,9 @@ nav.main-nav ul { top: 0; transition: 0.25s; width: 100%; + z-index: 5; } - nav.main-nav ul.in { - left: 0; - } + nav.main-nav ul.in { left: 0; } } nav.main-nav ul li { font-family: "Libre Baskerville", serif; @@ -142,7 +154,7 @@ nav.main-nav ul li { } nav.main-nav ul li a { font-family: "Libre Baskerville", serif; - color: #231F20; + color: var(--black); display: inline-block; font-size: 11px; letter-spacing: 1px; @@ -150,116 +162,485 @@ nav.main-nav ul li a { text-decoration: none; text-transform: uppercase; width: 100%; + transition: color 0.2s; } +nav.main-nav ul li a:hover { color: var(--gold); } @media (max-width: 991px) { - nav.main-nav ul li a { - font-size: 14px; - padding-bottom: 16px; - width: 50%; - } -} -nav.main-nav ul li:nth-child(-n+3) a { - text-align: left; + nav.main-nav ul li a { font-size: 16px; padding-bottom: 22px; width: 50%; } } +nav.main-nav ul li:nth-child(-n+3) a { text-align: left; } +nav.main-nav ul li:nth-last-child(-n+3) a { text-align: right; } @media (max-width: 991px) { - nav.main-nav ul li:nth-child(-n+3) a { - text-align: left; - } -} -nav.main-nav ul li:nth-last-child(-n+3) a { - text-align: right; + nav.main-nav ul li:nth-child(-n+3) a, + nav.main-nav ul li:nth-last-child(-n+3) a { text-align: center; } } +nav.main-nav ul li.main-nav--logo a img { margin: 0 14px; height: 52px; width: auto; } @media (max-width: 991px) { - nav.main-nav ul li:nth-last-child(-n+3) a { - text-align: left; - } -} -nav.main-nav ul li.main-nav--logo a img { - margin: 0 8px; -} -@media (max-width: 991px) { - nav.main-nav ul li.main-nav--logo { - display: none; - } -} -@media (max-width: 991px) { - nav.main-nav { - border-radius: 0; - padding: 24px 0; - } + nav.main-nav ul li.main-nav--logo { display: none; } + nav.main-nav { border-radius: 0; padding: 18px 0; } } -.slides { - position: relative; +/* ============================================================ + LAYOUT / SECTIONS + ============================================================ */ +.page-content { padding-top: 92px; } +@media (max-width: 991px) { .page-content { padding-top: 72px; } } + +.section { padding-top: 72px; padding-bottom: 72px; } +@media (max-width: 767px) { .section { padding-top: 48px; padding-bottom: 48px; } } + +.eyebrow { + display: inline-block; + font-family: "Libre Baskerville", serif; + text-transform: uppercase; + letter-spacing: 3px; + font-size: 12px; + color: var(--gold); + margin-bottom: 10px; } -.slides.vineyard { - min-height: 300px; +.eyebrow.light { color: #d8c9a3; } + +.section-title { font-size: 36px; margin: 0 0 16px; line-height: 1.2; } +.section-subtitle { color: var(--gray); font-style: italic; margin-bottom: 20px; } +.section-lead { + max-width: 780px; + margin: 0 auto 8px; + color: var(--gray); + font-size: 17px; } -.slides.vineyard img { - height: 300px; +@media (max-width: 767px) { .section-title { font-size: 28px; } } + +.section-divider { + border: 0; + border-top: 1px solid rgba(171, 153, 109, 0.35); + margin: 0; } -.slides.house { - min-height: 400px; -} -.slides.house img { - height: 400px; -} -.slides img { - border-radius: 5px; - object-fit: cover; - opacity: 1; - transition: 0.15s; + +.feature-img { width: 100%; + height: 440px; + object-fit: cover; + border-radius: 6px; + box-shadow: 0 18px 40px -18px rgba(0, 0, 0, 0.45); } -.slides img::selection { - background: rgba(255, 255, 255, 0); -} -.slides img.out { - opacity: 0; -} -.slides .slides-arrow { - align-items: center; - background: #ffffff; - border-radius: 5px; - cursor: pointer; +@media (max-width: 767px) { .feature-img { height: 280px; } } + +/* ============================================================ + HERO + ============================================================ */ +.hero { + position: relative; + height: calc(100vh - 92px); + min-height: 480px; + max-height: 820px; + overflow: hidden; display: flex; - height: 50px; + align-items: center; justify-content: center; - left: -25px; - opacity: 1; + text-align: center; +} +@media (max-width: 991px) { .hero { height: calc(100vh - 72px); } } + +.hero-video { + position: absolute; + top: 0; left: 0; + width: 100%; height: 100%; + object-fit: cover; + z-index: 0; +} +.hero-overlay { + position: absolute; + inset: 0; + background: linear-gradient(180deg, rgba(35,31,32,0.35) 0%, rgba(35,31,32,0.15) 40%, rgba(35,31,32,0.6) 100%); + z-index: 1; +} +.hero-content { + position: relative; + z-index: 2; + color: var(--white); + padding: 0 20px; +} +.hero-eyebrow { + text-transform: uppercase; + letter-spacing: 5px; + font-size: 13px; + font-family: "Libre Baskerville", serif; + margin-bottom: 12px; + color: #f2e9d6; +} +.hero-title { + font-size: 84px; + margin: 0 0 14px; + line-height: 1; + text-shadow: 0 2px 24px rgba(0,0,0,0.4); +} +.hero-sub { + font-size: 20px; + font-family: "Libre Baskerville", serif; + margin-bottom: 28px; + text-shadow: 0 1px 10px rgba(0,0,0,0.5); +} +.hero-btn { font-size: 15px; padding: 0.7rem 2rem; } +@media (max-width: 767px) { + .hero-title { font-size: 52px; } + .hero-sub { font-size: 16px; } +} +.hero-scroll { + position: absolute; + bottom: 24px; left: 50%; + transform: translateX(-50%); + z-index: 2; + color: var(--white); + opacity: 0.85; + animation: heroBounce 2s infinite; +} +.hero-scroll svg { width: 34px; height: 34px; } +@keyframes heroBounce { + 0%, 100% { transform: translate(-50%, 0); } + 50% { transform: translate(-50%, 8px); } +} + +/* ============================================================ + GALLERY (carousel) + ============================================================ */ +.gallery { + position: relative; + border-radius: 6px; + overflow: hidden; + box-shadow: 0 18px 40px -18px rgba(0, 0, 0, 0.45); +} +.gallery-track { + position: relative; + width: 100%; + height: 460px; +} +@media (max-width: 991px) { .gallery-track { height: 360px; } } +@media (max-width: 575px) { .gallery-track { height: 260px; } } +.gallery-img { + position: absolute; + inset: 0; + width: 100%; + height: 100%; + object-fit: cover; + opacity: 0; + transition: opacity 0.6s ease; +} +.gallery-img.is-active { opacity: 1; } + +.gallery-arrow { position: absolute; - right: auto; top: 50%; transform: translateY(-50%); - transition: 0.15s; - width: 50px; + width: 44px; height: 44px; + border: none; + border-radius: 50%; + background: rgba(255, 255, 255, 0.85); + color: var(--black); + cursor: pointer; + display: flex; + align-items: center; + justify-content: center; + z-index: 3; + transition: background 0.2s, transform 0.15s; } -.slides .slides-arrow.out { - opacity: 0; - pointer-events: none; +.gallery-arrow:hover { background: var(--white); } +.gallery-arrow:active { transform: translateY(-50%) scale(0.92); } +.gallery-arrow svg { width: 22px; height: 22px; } +.gallery-arrow.prev { left: 14px; } +.gallery-arrow.next { right: 14px; } + +.gallery-dots { + position: absolute; + bottom: 14px; left: 0; right: 0; + display: flex; + justify-content: center; + gap: 8px; + z-index: 3; } -.slides .slides-arrow svg { - background-color: #bebebe; - border-radius: 3px; - color: #ffffff; - height: 32px; - padding: 4px; - pointer-events: none; - transition: 0.1s; - width: 32px; +.gallery-dot { + width: 9px; height: 9px; + border-radius: 50%; + border: none; + padding: 0; + background: rgba(255, 255, 255, 0.55); + cursor: pointer; + transition: background 0.2s, transform 0.2s; } -.slides .slides-arrow:last-child { - left: auto; - right: -25px; +.gallery-dot.is-active { background: var(--gold); transform: scale(1.25); } + +/* ============================================================ + COMMUNITY MAP + ============================================================ */ +.map-frame { + border-radius: 6px; + overflow: hidden; + box-shadow: 0 18px 40px -18px rgba(0, 0, 0, 0.4); + border: 1px solid rgba(171, 153, 109, 0.3); + max-width: 900px; + margin: 0 auto; } -.slides .slides-arrow:hover svg { - background-color: #b1b1b1; - border-radius: 4px; - transform: scale(1.15); +.map-img { display: block; width: 100%; } + +/* ============================================================ + HOA BOARD TABLE + ============================================================ */ +.board-heading { + text-align: center; + font-size: 24px; + margin: 40px 0 24px; } -.slides .slides-arrow:active svg { - background-color: #a5a5a5; - transform: scale(1.1); +.board-table { + width: 100%; + max-width: 900px; + margin: 0 auto; + border-collapse: collapse; + background: var(--white); + border-radius: 6px; + overflow: hidden; + box-shadow: 0 12px 30px -18px rgba(0, 0, 0, 0.4); +} +.board-table thead th { + background: var(--black); + color: var(--white); + font-family: "Libre Baskerville", serif; + font-weight: 700; + text-align: left; + padding: 16px 22px; + font-size: 14px; + letter-spacing: 0.5px; +} +.board-table tbody td { + padding: 16px 22px; + border-top: 1px solid rgba(0, 0, 0, 0.08); + vertical-align: middle; +} +.board-table tbody tr:nth-child(even) { background: var(--cream); } +.board-table tbody tr:hover { background: rgba(171, 153, 109, 0.12); } +.board-table td a { color: var(--gold-dark); text-decoration: none; } +.board-table td a:hover { text-decoration: underline; } +.board-table td[data-label="Position"] { font-family: "Libre Baskerville", serif; } + +/* Stack into cards on small screens */ +@media (max-width: 575px) { + .board-table { box-shadow: none; } + .board-table thead { display: none; } + .board-table, .board-table tbody, .board-table tr, .board-table td { display: block; width: 100%; } + .board-table tbody tr { + margin-bottom: 16px; + border: 1px solid rgba(171, 153, 109, 0.3); + border-radius: 6px; + overflow: hidden; + box-shadow: 0 8px 20px -14px rgba(0,0,0,0.4); + } + .board-table tbody tr:nth-child(even) { background: var(--white); } + .board-table tbody td { border-top: none; padding: 10px 18px; } + .board-table tbody td:first-child { padding-top: 16px; font-weight: 700; font-size: 17px; } + .board-table tbody td:last-child { padding-bottom: 16px; } + .board-table tbody td::before { + content: attr(data-label); + display: block; + text-transform: uppercase; + letter-spacing: 1px; + font-size: 10px; + color: var(--gold); + margin-bottom: 2px; + } + .board-table tbody td:first-child::before { content: ""; margin: 0; } } -/*# sourceMappingURL=main.css.map */ +/* ============================================================ + CONTACT + ============================================================ */ +.contact-section { + background: var(--black); + color: var(--white); +} +.contact-section .section-title { color: var(--white); } +.contact-section .section-lead { color: #cfcabd; } +.contact-btn { + margin-top: 18px; + background: var(--gold); + border-color: var(--gold); + color: var(--white); + font-family: "Libre Baskerville", serif; + padding: 0.7rem 2rem; +} +.contact-btn:hover { background: var(--gold-dark); border-color: var(--gold-dark); color: var(--white); } + +/* ============================================================ + FOOTER + ============================================================ */ +.site-footer { + background: var(--cream); + text-align: center; + padding: 44px 0; + border-top: 1px solid rgba(171, 153, 109, 0.3); +} +.footer-logo { height: 70px; margin-bottom: 14px; } +.footer-tagline { + font-family: "Libre Baskerville", serif; + color: var(--gray); + margin-bottom: 6px; +} +.footer-copy { color: var(--light-gray); font-size: 13px; margin: 0; } + +/* ============================================================ + CUSTOM-HOMES AVAILABILITY NOTE + ============================================================ */ +.availability-note { + border-left: 3px solid var(--gold); + padding: 4px 0 4px 16px; + margin: 22px 0; + color: var(--gray); + font-style: italic; +} +.availability-note a { color: var(--gold-dark); font-weight: 700; } + +/* ============================================================ + GOOGLE MAP EMBED (Kannapolis) + ============================================================ */ +.map-embed { + margin-top: 40px; + position: relative; + width: 100%; + padding-top: 42%; + border-radius: 6px; + overflow: hidden; + box-shadow: 0 18px 40px -18px rgba(0, 0, 0, 0.4); + border: 1px solid rgba(171, 153, 109, 0.3); +} +.map-embed iframe { + position: absolute; + inset: 0; + width: 100%; + height: 100%; + border: 0; +} +@media (max-width: 767px) { .map-embed { padding-top: 75%; } } + +/* ============================================================ + HOMEOWNER DOCUMENTS + ============================================================ */ +.doc-grid { + display: grid; + grid-template-columns: repeat(2, 1fr); + gap: 18px; + max-width: 900px; + margin: 28px auto 0; +} +@media (max-width: 767px) { .doc-grid { grid-template-columns: 1fr; } } +.doc-card { + display: flex; + align-items: center; + gap: 16px; + padding: 18px 20px; + background: var(--white); + border: 1px solid rgba(171, 153, 109, 0.35); + border-radius: 6px; + text-decoration: none; + color: var(--black); + box-shadow: 0 10px 24px -18px rgba(0, 0, 0, 0.4); + transition: transform 0.18s, box-shadow 0.18s, border-color 0.18s; +} +.doc-card:hover { + transform: translateY(-3px); + box-shadow: 0 16px 30px -16px rgba(0, 0, 0, 0.45); + border-color: var(--gold); + text-decoration: none; + color: var(--black); +} +.doc-icon { + flex: 0 0 auto; + width: 46px; + height: 46px; + display: flex; + align-items: center; + justify-content: center; + border-radius: 50%; + background: rgba(171, 153, 109, 0.14); + color: var(--gold-dark); +} +.doc-icon svg { width: 24px; height: 24px; } +.doc-text { display: flex; flex-direction: column; } +.doc-title { + font-family: "Libre Baskerville", serif; + font-size: 16px; + line-height: 1.3; + margin-bottom: 3px; +} +.doc-meta { font-size: 12.5px; color: var(--gray); } +.doc-note { text-align: center; color: var(--gray); margin-top: 24px; font-size: 15px; } +.doc-note a { color: var(--gold-dark); font-weight: 700; } + +/* ============================================================ + LIGHTBOX + ============================================================ */ +.gallery-track.zoomable { cursor: zoom-in; } + +.lightbox { + position: fixed; + inset: 0; + z-index: 1000; + display: flex; + align-items: center; + justify-content: center; + background: rgba(20, 18, 18, 0.92); + padding: 24px; +} +.lightbox[hidden] { display: none; } +.lightbox-figure { + margin: 0; + max-width: 92vw; + max-height: 88vh; + display: flex; + flex-direction: column; + align-items: center; +} +.lightbox-img { + max-width: 92vw; + max-height: 80vh; + object-fit: contain; + border-radius: 4px; + box-shadow: 0 24px 60px rgba(0, 0, 0, 0.6); + cursor: pointer; +} +.lightbox-caption { + color: rgba(255, 255, 255, 0.85); + font-size: 13px; + margin-top: 12px; + text-align: center; + max-width: 700px; +} +.lightbox-close, +.lightbox-arrow { + position: absolute; + border: none; + background: rgba(255, 255, 255, 0.12); + color: var(--white); + cursor: pointer; + display: flex; + align-items: center; + justify-content: center; + border-radius: 50%; + transition: background 0.2s; +} +.lightbox-close:hover, +.lightbox-arrow:hover { background: rgba(255, 255, 255, 0.28); } +.lightbox-close { + top: 18px; right: 18px; + width: 48px; height: 48px; +} +.lightbox-close svg { width: 26px; height: 26px; } +.lightbox-arrow { + top: 50%; + transform: translateY(-50%); + width: 54px; height: 54px; +} +.lightbox-arrow svg { width: 28px; height: 28px; } +.lightbox-arrow.prev { left: 20px; } +.lightbox-arrow.next { right: 20px; } +@media (max-width: 575px) { + .lightbox-arrow { width: 44px; height: 44px; } + .lightbox-arrow.prev { left: 8px; } + .lightbox-arrow.next { right: 8px; } +} diff --git a/css/main.css.map b/css/main.css.map deleted file mode 100644 index 558d312..0000000 --- a/css/main.css.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sourceRoot":"","sources":["main.scss","components/_nav.scss","components/_slide.scss"],"names":[],"mappings":"AAsBA;EAPE;EASA;;;AAGF;EACE,kBA3BK;EA4BL,cA5BK;;AA8BL;EACE;EACA;;AAGF;EAIE;EACA;EACA;;;AAIJ;EA5BE;EA+BA,kBA/CM;EAgDN,OA7CM;EA8CN;EACA;;;AAGF;EArCE;;;AAyCF;EA5CE;;;AAgDF;EACE;EACA;EACA;;AAGE;EACE;EACA;;;ACvEN;EACI,YDCI;ECAJ;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA;EACA;;AAEA;EACE;EACA;;AAEA;EACE;;AAGF;EARF;IASI;;;AAIJ;EACE;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE,kBDjCF;ECkCE;EACA;EACA;EACA;EACA;;AAEA;EACE;;AAKF;EACE,kBDjDL;;ACqDC;EA3BF;IA4BI;;;AAIA;EACE;EACA;EACA;;AAEF;EACE;EACA;;AAEF;EACE;EACA;EACA;;AAMR;EACE;EACA;EACA;EACA;EACA;;AAEA;EAPF;IAQI,kBDrFA;ICsFA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEA;IACE;;;AAIJ;EDvFJ;EC0FM;EACA;;AAEA;ED7FN;ECgGQ,OD1GF;EC2GE;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EAZF;IAaI;IACA;IACA;;;AAKF;EACE;;AAEA;EAHF;IAII;;;AAMJ;EACE;;AAEA;EAHF;IAII;;;AAOF;EACE;;AAIJ;EAPF;IAQI;;;AAMR;EAjKJ;IAkKQ;IACA;;;;ACnKR;EACI;;AAEA;EACE;;AACA;EACE;;AAIJ;EACE;;AACA;EACE;;AAMJ;EACE;EACA;EACA;EACA;EACA;;AAEA;EACE;;AAGF;EACE;;AAIJ;EACE;EACA,YFnCE;EEoCF;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA;;AAGF;EACE,kBFtDK;EEuDL;EACA,OF1DA;EE2DA;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;;AAIA;EACE;EACA;EACA;;AAKF;EACE;EACA","file":"main.css"} \ No newline at end of file diff --git a/css/main.scss b/css/main.scss index 65a7eae..743abf5 100644 --- a/css/main.scss +++ b/css/main.scss @@ -4,6 +4,7 @@ $white: #ffffff; $gray: #585858; $light-gray: #bebebe; $black: #231F20; +$cream: #F7F4EE; // breakpoints $xs-break: 575px; @@ -19,10 +20,17 @@ $l-break: 1199px; font-family: 'Lato', sans-serif; } +* { box-sizing: border-box; } + //btns .btn { @include Libre; font-size: 14px; + letter-spacing: 0.3px; + padding: 0.55rem 1.5rem; + border-radius: 2px; + + & + .btn { margin-left: 0.5rem; } } .btn-primary { @@ -46,20 +54,20 @@ $l-break: 1199px; body { @include Lato; - + background-color: $white; color: $black; margin: 0; overflow-x: hidden; + line-height: 1.65; } // Enable native smooth-scrolling for in-page anchor navigation -// This complements the JS smooth-scroll and works when JS is unavailable html { scroll-behavior: smooth; } -p, a, li, span, div { +p, a, li, span, div, td, th { @include Lato; } @@ -67,18 +75,17 @@ h1, h2, h3, h4, h5, h6 { @include Libre; } -.page-content { - padding: 110px 0 0 0; - position: relative; - top: -32px; +img { max-width: 100%; } - .hero-text { - h1 { - font-size: 64px; - margin-top: 0; - } - } +.page-content { + padding-top: 92px; + + @media (max-width: $m-break) { padding-top: 72px; } } @import 'components/nav'; -@import 'components/slide'; \ No newline at end of file +@import 'components/hero'; +@import 'components/sections'; +@import 'components/gallery'; +@import 'components/board'; +@import 'components/features'; diff --git a/docs/README.md b/docs/README.md new file mode 100644 index 0000000..c01c321 --- /dev/null +++ b/docs/README.md @@ -0,0 +1,19 @@ +# Homeowner Documents + +The Homeowner Information section of `index.html` currently links to the live +PDFs hosted on **pinecreekhoa.com** (they could not be downloaded automatically +because that site sits behind a browser-isolation proxy, but they open fine in a +normal browser). + +When this site takes over the `pinecreekhoa.com` domain, make the documents +self-hosted so the links keep working: + +1. Save these six PDFs from the current site into this `docs/` folder: + - `PineCreekCCR.pdf` — Pine Creek Neighborhood Covenants + - `vineyardccr.pdf` — The Vineyard Supplemental Covenants + - `Pine-Creek-Safety-Rules.pdf` — Safety Rules & Regulations + - `HOAApprovalForm.pdf` — Architectural Review Approval Form + - `Pine Creek Delinquency Policy.pdf` — Delinquency Policy + - `Pine-Creek-Request-for-Reimbursement-of-Costs-for-Community-Event.pdf` — Community Event Reimbursement Form +2. In `index.html`, change each `.doc-card` `href` from + `https://www.pinecreekhoa.com/` to `docs/`. diff --git a/favicon-16.png b/favicon-16.png new file mode 100644 index 0000000..cf7209e Binary files /dev/null and b/favicon-16.png differ diff --git a/favicon-32.png b/favicon-32.png new file mode 100644 index 0000000..cfc93be Binary files /dev/null and b/favicon-32.png differ diff --git a/favicon.ico b/favicon.ico index 7beb292..af91398 100644 Binary files a/favicon.ico and b/favicon.ico differ diff --git a/favicon.svg b/favicon.svg new file mode 100644 index 0000000..5c5ec99 --- /dev/null +++ b/favicon.svg @@ -0,0 +1,219 @@ + + + + + + + + diff --git a/img/.DS_Store b/img/.DS_Store deleted file mode 100644 index 5008ddf..0000000 Binary files a/img/.DS_Store and /dev/null differ diff --git a/img/community-map.jpg b/img/community-map.jpg new file mode 100644 index 0000000..300337a Binary files /dev/null and b/img/community-map.jpg differ diff --git a/img/community/community-aerial.jpg b/img/community/community-aerial.jpg new file mode 100644 index 0000000..cb04ffe Binary files /dev/null and b/img/community/community-aerial.jpg differ diff --git a/img/community/community-forest-pond.jpg b/img/community/community-forest-pond.jpg new file mode 100644 index 0000000..080207e Binary files /dev/null and b/img/community/community-forest-pond.jpg differ diff --git a/img/community/community-pavilion-pond.jpg b/img/community/community-pavilion-pond.jpg new file mode 100644 index 0000000..af2117c Binary files /dev/null and b/img/community/community-pavilion-pond.jpg differ diff --git a/img/community/community-pavilion.jpg b/img/community/community-pavilion.jpg new file mode 100644 index 0000000..f70e66b Binary files /dev/null and b/img/community/community-pavilion.jpg differ diff --git a/img/community/community-vineyard-gate.jpg b/img/community/community-vineyard-gate.jpg new file mode 100644 index 0000000..dc689c7 Binary files /dev/null and b/img/community/community-vineyard-gate.jpg differ diff --git a/img/community/community-vineyard-rows.jpg b/img/community/community-vineyard-rows.jpg new file mode 100644 index 0000000..365abec Binary files /dev/null and b/img/community/community-vineyard-rows.jpg differ diff --git a/img/gallery/IMG_1914.jpg b/img/gallery/IMG_1914.jpg new file mode 100644 index 0000000..a6f3648 Binary files /dev/null and b/img/gallery/IMG_1914.jpg differ diff --git a/img/gallery/IMG_1915.jpg b/img/gallery/IMG_1915.jpg new file mode 100644 index 0000000..76764f1 Binary files /dev/null and b/img/gallery/IMG_1915.jpg differ diff --git a/img/gallery/IMG_1920.jpg b/img/gallery/IMG_1920.jpg new file mode 100644 index 0000000..8746093 Binary files /dev/null and b/img/gallery/IMG_1920.jpg differ diff --git a/img/gallery/IMG_1921.jpg b/img/gallery/IMG_1921.jpg new file mode 100644 index 0000000..83d6211 Binary files /dev/null and b/img/gallery/IMG_1921.jpg differ diff --git a/img/gallery/IMG_1922.jpg b/img/gallery/IMG_1922.jpg new file mode 100644 index 0000000..c49686e Binary files /dev/null and b/img/gallery/IMG_1922.jpg differ diff --git a/img/gallery/IMG_1926.jpg b/img/gallery/IMG_1926.jpg new file mode 100644 index 0000000..cc724e3 Binary files /dev/null and b/img/gallery/IMG_1926.jpg differ diff --git a/img/gallery/IMG_1937.jpg b/img/gallery/IMG_1937.jpg new file mode 100644 index 0000000..08518f5 Binary files /dev/null and b/img/gallery/IMG_1937.jpg differ diff --git a/img/gallery/IMG_1941.jpg b/img/gallery/IMG_1941.jpg new file mode 100644 index 0000000..1007f70 Binary files /dev/null and b/img/gallery/IMG_1941.jpg differ diff --git a/img/gallery/IMG_1943.jpg b/img/gallery/IMG_1943.jpg new file mode 100644 index 0000000..48f3b95 Binary files /dev/null and b/img/gallery/IMG_1943.jpg differ diff --git a/img/gallery/IMG_1945.jpg b/img/gallery/IMG_1945.jpg new file mode 100644 index 0000000..dbe1b24 Binary files /dev/null and b/img/gallery/IMG_1945.jpg differ diff --git a/img/gallery/IMG_1947.jpg b/img/gallery/IMG_1947.jpg new file mode 100644 index 0000000..3b799dc Binary files /dev/null and b/img/gallery/IMG_1947.jpg differ diff --git a/img/gallery/IMG_1949.jpg b/img/gallery/IMG_1949.jpg new file mode 100644 index 0000000..cf8e4fe Binary files /dev/null and b/img/gallery/IMG_1949.jpg differ diff --git a/img/gallery/IMG_1954.jpg b/img/gallery/IMG_1954.jpg new file mode 100644 index 0000000..09969b4 Binary files /dev/null and b/img/gallery/IMG_1954.jpg differ diff --git a/img/gallery/IMG_1955.jpg b/img/gallery/IMG_1955.jpg new file mode 100644 index 0000000..4fa7c88 Binary files /dev/null and b/img/gallery/IMG_1955.jpg differ diff --git a/img/gallery/IMG_1957.jpg b/img/gallery/IMG_1957.jpg new file mode 100644 index 0000000..9efd59c Binary files /dev/null and b/img/gallery/IMG_1957.jpg differ diff --git a/img/gallery/IMG_1964.jpg b/img/gallery/IMG_1964.jpg new file mode 100644 index 0000000..bdf574d Binary files /dev/null and b/img/gallery/IMG_1964.jpg differ diff --git a/img/gallery/IMG_1968.jpg b/img/gallery/IMG_1968.jpg new file mode 100644 index 0000000..75e4032 Binary files /dev/null and b/img/gallery/IMG_1968.jpg differ diff --git a/img/gallery/IMG_1971.jpg b/img/gallery/IMG_1971.jpg new file mode 100644 index 0000000..d80fa8d Binary files /dev/null and b/img/gallery/IMG_1971.jpg differ diff --git a/img/gallery/IMG_1974.jpg b/img/gallery/IMG_1974.jpg new file mode 100644 index 0000000..7494975 Binary files /dev/null and b/img/gallery/IMG_1974.jpg differ diff --git a/img/gallery/IMG_1977.jpg b/img/gallery/IMG_1977.jpg new file mode 100644 index 0000000..873ea49 Binary files /dev/null and b/img/gallery/IMG_1977.jpg differ diff --git a/img/gallery/IMG_1979.jpg b/img/gallery/IMG_1979.jpg new file mode 100644 index 0000000..b7abf95 Binary files /dev/null and b/img/gallery/IMG_1979.jpg differ diff --git a/img/gallery/IMG_1980.jpg b/img/gallery/IMG_1980.jpg new file mode 100644 index 0000000..c06d215 Binary files /dev/null and b/img/gallery/IMG_1980.jpg differ diff --git a/img/gallery/IMG_1984.jpg b/img/gallery/IMG_1984.jpg new file mode 100644 index 0000000..86b5fa3 Binary files /dev/null and b/img/gallery/IMG_1984.jpg differ diff --git a/img/gallery/IMG_1985.jpg b/img/gallery/IMG_1985.jpg new file mode 100644 index 0000000..d2c1664 Binary files /dev/null and b/img/gallery/IMG_1985.jpg differ diff --git a/img/gallery/IMG_2978.jpg b/img/gallery/IMG_2978.jpg new file mode 100644 index 0000000..8facb7d Binary files /dev/null and b/img/gallery/IMG_2978.jpg differ diff --git a/img/hero-mobile.mp4 b/img/hero-mobile.mp4 new file mode 100644 index 0000000..904162d Binary files /dev/null and b/img/hero-mobile.mp4 differ diff --git a/img/hero-poster.jpg b/img/hero-poster.jpg new file mode 100644 index 0000000..532a271 Binary files /dev/null and b/img/hero-poster.jpg differ diff --git a/img/hero.mp4 b/img/hero.mp4 new file mode 100644 index 0000000..dac012d Binary files /dev/null and b/img/hero.mp4 differ diff --git a/img/house-0.jpg b/img/house-0.jpg deleted file mode 100644 index 4293801..0000000 Binary files a/img/house-0.jpg and /dev/null differ diff --git a/img/house-1.jpg b/img/house-1.jpg deleted file mode 100644 index 15deafc..0000000 Binary files a/img/house-1.jpg and /dev/null differ diff --git a/img/house-10.jpg b/img/house-10.jpg deleted file mode 100644 index dc86372..0000000 Binary files a/img/house-10.jpg and /dev/null differ diff --git a/img/house-11.jpg b/img/house-11.jpg deleted file mode 100644 index 9378f61..0000000 Binary files a/img/house-11.jpg and /dev/null differ diff --git a/img/house-12.jpg b/img/house-12.jpg deleted file mode 100644 index f12bdb4..0000000 Binary files a/img/house-12.jpg and /dev/null differ diff --git a/img/house-13.jpg b/img/house-13.jpg deleted file mode 100644 index e89afdd..0000000 Binary files a/img/house-13.jpg and /dev/null differ diff --git a/img/house-14.jpg b/img/house-14.jpg deleted file mode 100644 index b37dec0..0000000 Binary files a/img/house-14.jpg and /dev/null differ diff --git a/img/house-15.jpg b/img/house-15.jpg deleted file mode 100644 index b6dd40b..0000000 Binary files a/img/house-15.jpg and /dev/null differ diff --git a/img/house-16.jpg b/img/house-16.jpg deleted file mode 100644 index b81ee7b..0000000 Binary files a/img/house-16.jpg and /dev/null differ diff --git a/img/house-17.jpg b/img/house-17.jpg deleted file mode 100644 index 0abca55..0000000 Binary files a/img/house-17.jpg and /dev/null differ diff --git a/img/house-2.jpg b/img/house-2.jpg deleted file mode 100644 index 7b8b820..0000000 Binary files a/img/house-2.jpg and /dev/null differ diff --git a/img/house-3.jpg b/img/house-3.jpg deleted file mode 100644 index aba564b..0000000 Binary files a/img/house-3.jpg and /dev/null differ diff --git a/img/house-4.jpg b/img/house-4.jpg deleted file mode 100644 index 8dfe1fa..0000000 Binary files a/img/house-4.jpg and /dev/null differ diff --git a/img/house-5.jpg b/img/house-5.jpg deleted file mode 100644 index c82fe3e..0000000 Binary files a/img/house-5.jpg and /dev/null differ diff --git a/img/house-6.jpg b/img/house-6.jpg deleted file mode 100644 index 6bcf4b5..0000000 Binary files a/img/house-6.jpg and /dev/null differ diff --git a/img/house-7.jpg b/img/house-7.jpg deleted file mode 100644 index 20207c3..0000000 Binary files a/img/house-7.jpg and /dev/null differ diff --git a/img/house-8.jpg b/img/house-8.jpg deleted file mode 100644 index 79c0f26..0000000 Binary files a/img/house-8.jpg and /dev/null differ diff --git a/img/house-9.jpg b/img/house-9.jpg deleted file mode 100644 index 8070c65..0000000 Binary files a/img/house-9.jpg and /dev/null differ diff --git a/img/intro_short.mp4 b/img/intro_short.mp4 deleted file mode 100644 index 57efc98..0000000 Binary files a/img/intro_short.mp4 and /dev/null differ diff --git a/img/vineyard-0.jpg b/img/vineyard-0.jpg deleted file mode 100644 index 31bf5e3..0000000 Binary files a/img/vineyard-0.jpg and /dev/null differ diff --git a/img/vineyard-1.jpg b/img/vineyard-1.jpg deleted file mode 100644 index 6b0ef87..0000000 Binary files a/img/vineyard-1.jpg and /dev/null differ diff --git a/img/vineyard-2.jpg b/img/vineyard-2.jpg deleted file mode 100644 index 5ba9d40..0000000 Binary files a/img/vineyard-2.jpg and /dev/null differ diff --git a/img/vineyard-3.jpg b/img/vineyard-3.jpg deleted file mode 100644 index a9cace3..0000000 Binary files a/img/vineyard-3.jpg and /dev/null differ diff --git a/index.html b/index.html index 30a8a1d..9a8faf4 100644 --- a/index.html +++ b/index.html @@ -3,23 +3,38 @@ - Pine Creek HOA + Pine Creek — Kannapolis' Premier Gated Community + - + + + + + + + + + + + + + + - + + + - - + @@ -42,124 +57,332 @@
-
-
- + +
+ +
+
+

Kannapolis, North Carolina

+

Pine Creek

+

A premier gated community of custom luxury homes

+ Explore the Community
-
+ + + + -
-
-
-

Welcome to Pine Creek

-
Kannapolis' Premier Gated community
+ +
+
+
+ Welcome +

Welcome to Pine Creek

+
Kannapolis' Premier Gated Community
+

Pine Creek is one of the Greater Charlotte area's premier gated communities, offering custom-built homes in North Carolina's Cabarrus County.

+

The neighborhood features elegant custom homes based on French country designs and influences, ranging in size from 4,500 to over 11,000 square feet. Each home is carefully positioned on lots of one acre or more to preserve the natural beauty of the original landscape and protect each homeowner's privacy.

+

Create lifelong memories with your family in a luxury, custom home within a secure and quiet community. Welcome home to Pine Creek.

-
-

Pine Creek is one of the Greater Charlotte Area’s premier gated communities offering custom built homes in North Carolina’s Cabarrus County.

-

The neighborhood features elegant custom built homes based on French country designs and influences, and homes range in size from 4,500 to over 11,000 square feet. Each home is carefully positioned on lots of one acre or more in order to preserve the natural beauty of the original landscape and to protect each homeowner’s privacy.

-

Create lifelong memories with your family in a luxury, custom home in a secure and quiet community. Welcome home to Pine Creek.

-
-
-
- -
-
-
- -
-
-
-

The Vineyard

-

A subsect of Pine Creek, The Vineyard is its own haven. Enclosed by lush grape vines and woods, The Vineyard custom homes feature Spanish/Tuscan styled architectural designs.

- Learn More -
-
-
- -
- -
-
- -
-
+
+ A stately custom stone home in Pine Creek
-
-
-
+

-
-
-
-

Build Your Custom Home in Pine Creek

-

While Pine Creek does not have a list of pre-approved custom home builders in order to provide owners with more flexibility in who builds their future custom home, Pine Creek Homeowners’ Association does evaluate proposed plans in accordance to the guidance in Pine Creek Covenants.

-

The primary focus of this approval process is to ensure all proposed home designs, architectural details and landscape designs align with the existing custom homes in Pine Creek. The HOA is pleased to provide feedback to a potential buyer on home plan renderings to confirm your vision would be in harmony with the style of the neighborhood.

- View open lots - Contact us + +
+
+
+ The Vineyard +

The Vineyard

+

A subsection of Pine Creek, The Vineyard is its own haven. Enclosed by lush grape vines and woods, The Vineyard's custom homes feature Spanish and Tuscan-inspired architectural designs along streets such as Tuscany Drive and Chardonnay Circle.

+ Learn More
-
-
- -
- +
+ +
+
+ +

+ + +
+
+
+ Custom Homes +

Build Your Custom Home in Pine Creek

+

Pine Creek owners enjoy the freedom to choose their own builder. Rather than limiting you to a pre-approved list, the Pine Creek Homeowners' Association reviews proposed plans in accordance with the Pine Creek Covenants — giving you the flexibility to bring your own vision to life.

+

This review ensures that every home design, architectural detail, and landscape plan is in harmony with the established character of Pine Creek. The HOA is glad to offer early feedback on your renderings, so you can move forward with confidence.

+

Interested in building? A limited number of homesites are available. Contact us for lot availability.

+ Contact the HOA +
+
+
-
-
-
+

-
-
-
-

Call Kannapolis, NC ‘Home’

-

Kannapolis, North Carolina is a family-oriented town filled with Southern charm. Kannapolis was originally developed in 1906 to be the home to Cannon Mills. Even though the mill is no longer open, Kannapolis has exploded with residential and business development and has become home to families desiring to live close to uptown with the small town, country feel.

-

The town is conveniently located; right off of I-85 and within 30 minutes of uptown Charlotte and Charlotte Douglas International Airport. With growing businesses, a vast array of shops and restaurants, a beautiful downtown, Cabarrus County schools and highly sought after private schools, and the grandeur of the NC Research Campus, Kannapolis is a wonderful place to call home.

+ +
+
+
+ Life at Pine Creek +

Community & Common Areas

+

Beyond its custom homes, Pine Creek is defined by the spaces neighbors share. A gated stone entrance opens to winding, tree-lined streets and the manicured vineyard rows that give The Vineyard its name.

+

At the heart of the community, a lakeside pavilion overlooks a tranquil pond with a fountain — a gathering place framed by mature woods and meticulously kept grounds.

-
-
- +
+
-
-
-
+

-
-
-
-

Pine Creek Homeowners’ Association

-
-

The Pine Creek Homeowners’ Association consists of board members voted into position by homeowners within the neighborhood. The Homeowner’s Association is responsible for approving proposed building plans and ongoing maintenance of homes within the neighborhood to ensure homes are built and managed to meet the aesthetics of Pine Creek and the Vineyards.

+ +
+
+ The Neighborhood +

Community Map

+

Winding, tree-lined streets — Tuscany Drive, Chardonnay Circle, Willowood Road, Stone Ridge Road, Richwood Circle, and Rolling Ridge Drive — thread through Pine Creek's gently rolling, one-acre-plus homesites.

+
+
+ Map of the Pine Creek community streets
- - -
-
-

Contact Us

-

Email: info@pinecreekhoa.example

+ +

+ + +
+
+
+ The Area +

Call Kannapolis, NC 'Home'

+

Kannapolis, North Carolina is a family-oriented town filled with Southern charm. Originally developed in 1906 as the home of Cannon Mills, Kannapolis has since blossomed with residential and business development, drawing families who want to live close to uptown Charlotte while keeping a small-town, country feel.

+

The town is conveniently located right off I-85, within 30 minutes of uptown Charlotte and Charlotte Douglas International Airport. With growing businesses, a vast array of shops and restaurants, a beautiful downtown, sought-after Cabarrus County and private schools, and the grandeur of the NC Research Campus, Kannapolis is a wonderful place to call home.

+
+
+ Downtown Kannapolis, North Carolina +
+
+
+ +
+
+ +

+ + +
+
+ Governance +

Pine Creek Homeowners' Association

+

The Pine Creek Homeowners' Association consists of board members voted into position by homeowners within the neighborhood. The Association approves proposed building plans and oversees the ongoing maintenance of homes to ensure they meet the aesthetics of Pine Creek and The Vineyard.

+
+ +

Meet the Board

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NamePositionEmail
Brad HarrisPresidentpresident@pinecreekhoa.com
Kurt MaloneVice Presidentvp@pinecreekhoa.com
Trevor LewisSecretarysecretary@pinecreekhoa.com
Chris OlsonTreasurertreasurer@pinecreekhoa.com
Norm ShueGeneralgeneral@pinecreekhoa.com
+ + + +

Homeowner Information

+

Governing documents, rules, and forms for current and prospective Pine Creek and Vineyard homeowners.

+ +
+ + + + Pine Creek Neighborhood Covenants + The CC&Rs governing Pine Creek · PDF + + + + + + The Vineyard Supplemental Covenants + Additional covenants for The Vineyard · PDF + + + + + + Safety Rules & Regulations + Community safety rules and regulations · PDF + + + + + + Architectural Review Approval Form + Submit improvements for board approval · PDF + + + + + + Delinquency Policy + Assessment collection & delinquency policy · PDF + + + + + + Community Event Reimbursement Form + Request reimbursement for community events · PDF + + +
+

Pine Creek is professionally managed by Premier Management Company. Need a document that isn't listed here? Contact the HOA and we'll be glad to help.

+ + + +
+
+ Get in Touch +

Contact Us

+

Questions about Pine Creek, available lots, or the home-plan approval process? We'd love to hear from you.

+ Email the HOA
- - + + + + + + diff --git a/js/main.js b/js/main.js index 000d797..c41dd24 100644 --- a/js/main.js +++ b/js/main.js @@ -1,178 +1,171 @@ +/* ============================================================ + Pine Creek — site interactions + - Mobile nav (hamburger) toggle + - Smooth-scroll for in-page anchors with fixed-header offset + - Image galleries (prev/next, dots, autoplay, swipe) + - Sticky-nav shadow on scroll + ============================================================ */ + const hamburger = document.getElementById('hamburger'), mainNav = document.querySelector('#mainNav ul'), navItem = document.getElementsByClassName('nav-item') -// Nav toggle, open, close +// --- Mobile nav ------------------------------------------------ const toggleNav = () => { - !(mainNav.classList.contains('in')) ? ( - mainNav.classList.add('in'), - hamburger.classList.add('in') - ) : ( - mainNav.classList.remove('in'), - hamburger.classList.remove('in') - ) + mainNav.classList.toggle('in') + hamburger.classList.toggle('in') }, - openNav = () => mainNav.classList.add('in'), - closeNav = () => mainNav.classList.remove('in') - -// Hamburger menu icon click -hamburger.onclick = toggleNav - -// Nav items on click: close nav (mobile) and smooth-scroll to anchor targets -for (let i = 0; i < navItem.length; i++) { - navItem[i].onclick = function (e) { - // prevent default anchor jump; we'll smooth-scroll with offset instead - e.preventDefault() - // close mobile nav if open - closeNav() - - const href = this.getAttribute('href') || '' - if (href.startsWith('#')) { - const target = document.querySelector(href) - if (target) { - // compute offset to account for fixed header - const header = document.getElementById('mainNav') - const headerHeight = header ? header.offsetHeight : 0 - const extra = 8 // small spacing under header - const targetY = window.pageYOffset + target.getBoundingClientRect().top - headerHeight - extra - - window.scrollTo({ top: targetY, behavior: 'smooth' }) - return + closeNav = () => { + mainNav.classList.remove('in') + hamburger.classList.remove('in') } - } - // fallback: follow the link if it's not an in-page anchor - if (href) window.location.href = href - } -} +hamburger.onclick = toggleNav +hamburger.addEventListener('keydown', (e) => { + if (e.key === 'Enter' || e.key === ' ') { e.preventDefault(); toggleNav() } +}) -// If the page is loaded with a hash or the hash changes, adjust scroll to account for the fixed header -const scrollToHashWithOffset = (hash) => { - if (!hash) return - const target = document.querySelector(hash) - if (!target) return +// --- Smooth scroll with fixed-header offset -------------------- +const scrollToTarget = (hash) => { + const target = hash && document.querySelector(hash) + if (!target) return false const header = document.getElementById('mainNav') const headerHeight = header ? header.offsetHeight : 0 - const extra = 8 - const targetY = window.pageYOffset + target.getBoundingClientRect().top - headerHeight - extra - // Use a short timeout to allow browser default jump to complete before adjusting - setTimeout(() => window.scrollTo({ top: targetY, behavior: 'smooth' }), 50) + const y = window.pageYOffset + target.getBoundingClientRect().top - headerHeight - 8 + window.scrollTo({ top: y, behavior: 'smooth' }) + return true } -window.addEventListener('load', () => scrollToHashWithOffset(location.hash)) -window.addEventListener('hashchange', () => scrollToHashWithOffset(location.hash)) - -// light auth -window.onload = () => { - const board = document.getElementById('boardPage'), - owner = document.getElementById('ownerPage') - - if (board || owner) { - const response = prompt('Please enter the password.') - - switch (response) { - case '12345': - console.log('Board Member') - break - case 'abcde': - console.log('Owner') - break - default: - console.log('Access Denied') - break +for (let i = 0; i < navItem.length; i++) { + navItem[i].onclick = function (e) { + const href = this.getAttribute('href') || '' + closeNav() + if (href.startsWith('#') && scrollToTarget(href)) { + e.preventDefault() } } } -// Slides +// Also offset any in-page anchor (hero buttons, etc.) +document.querySelectorAll('a[href^="#"]:not(.nav-item)').forEach((a) => { + a.addEventListener('click', (e) => { + const href = a.getAttribute('href') + if (href.length > 1 && scrollToTarget(href)) e.preventDefault() + }) +}) -const slidesVineyard = document.getElementById('slidesVineyard'), - slidesVineyardLeft = document.querySelector('#slidesVineyard .slides-arrow:nth-last-child(2)'), - slidesVineyardRight = document.querySelector('#slidesVineyard .slides-arrow:last-child'), - slidesVineyardImg = document.querySelector('#slidesVineyard .slides-img'), - slidesHouse = document.getElementById('slidesHouse'), - slidesHouseLeft = document.querySelector('#slidesHouse .slides-arrow:nth-last-child(2)'), - slidesHouseRight = document.querySelector('#slidesHouse .slides-arrow:last-child'), - slidesHouseImg = document.querySelector('#slidesHouse .slides-img') +window.addEventListener('load', () => scrollToTarget(location.hash)) +window.addEventListener('hashchange', () => scrollToTarget(location.hash)) -let vineyardImgs = 0 +// --- Sticky nav shadow ---------------------------------------- +const navEl = document.getElementById('mainNav') +const onScroll = () => { + if (window.pageYOffset > 20) navEl.classList.add('scrolled') + else navEl.classList.remove('scrolled') +} +window.addEventListener('scroll', onScroll, { passive: true }) +onScroll() -slidesVineyardRight.onclick = () => { - vineyardImgs = vineyardImgs + 1 - slidesVineyardImg.classList.add('out') - setTimeout(() => { - slidesVineyardImg.setAttribute('src', 'img/vineyard-' + vineyardImgs + '.jpg') - slidesVineyardImg.classList.remove('out') - if (vineyardImgs >= 1) { - slidesVineyardLeft.classList.remove('out') - } - }, 150) +// --- Lightbox -------------------------------------------------- +const lightbox = document.getElementById('lightbox') +let lbSrcs = [], lbAlts = [], lbIndex = 0 +if (lightbox) { + const lbImg = lightbox.querySelector('.lightbox-img'), + lbCap = lightbox.querySelector('.lightbox-caption'), + lbPrev = lightbox.querySelector('.lightbox-arrow.prev'), + lbNext = lightbox.querySelector('.lightbox-arrow.next'), + lbClose = lightbox.querySelector('.lightbox-close') + + const render = () => { + lbImg.src = lbSrcs[lbIndex] + lbImg.alt = lbAlts[lbIndex] || '' + lbCap.textContent = lbAlts[lbIndex] || '' + } + window.openLightbox = (srcs, alts, i) => { + lbSrcs = srcs; lbAlts = alts; lbIndex = i + render() + lightbox.hidden = false + document.body.style.overflow = 'hidden' + } + const close = () => { lightbox.hidden = true; document.body.style.overflow = '' } + const lbGo = (n) => { lbIndex = (n + lbSrcs.length) % lbSrcs.length; render() } + + lbPrev.addEventListener('click', (e) => { e.stopPropagation(); lbGo(lbIndex - 1) }) + lbNext.addEventListener('click', (e) => { e.stopPropagation(); lbGo(lbIndex + 1) }) + lbClose.addEventListener('click', close) + lightbox.addEventListener('click', (e) => { + if (e.target === lbImg) lbGo(lbIndex + 1) + else if (!e.target.closest('.lightbox-arrow') && !e.target.closest('.lightbox-close')) close() + }) + document.addEventListener('keydown', (e) => { + if (lightbox.hidden) return + if (e.key === 'Escape') close() + else if (e.key === 'ArrowLeft') lbGo(lbIndex - 1) + else if (e.key === 'ArrowRight') lbGo(lbIndex + 1) + }) } -slidesVineyardLeft.onclick = () => { - slidesVineyardImg.classList.add('out') - - setTimeout(() => { - slidesVineyardImg.classList.remove('out') - if (vineyardImgs > 0) { - vineyardImgs = vineyardImgs - 1 - slidesVineyardImg.setAttribute('src', 'img/vineyard-' + vineyardImgs + '.jpg') - } - if (vineyardImgs < 1) { - slidesVineyardLeft.classList.add('out') - } - }, 150) -} +// --- Galleries ------------------------------------------------- +document.querySelectorAll('.gallery').forEach((gallery) => { + const imgs = Array.from(gallery.querySelectorAll('.gallery-img')), + prev = gallery.querySelector('.gallery-arrow.prev'), + next = gallery.querySelector('.gallery-arrow.next'), + dotsWrap = gallery.querySelector('.gallery-dots') + if (!imgs.length) return -const imgVineyardError = (image) => { - vineyardImgs = 0 - image.src = 'img/vineyard-0.jpg' + let index = 0 + let timer = null - setTimeout(() => { - if (vineyardImgs < 1) { - slidesVineyardLeft.classList.add('out') - } - }, 150) - return true -} + // Build dots + const dots = imgs.map((_, i) => { + const dot = document.createElement('button') + dot.className = 'gallery-dot' + (i === 0 ? ' is-active' : '') + dot.setAttribute('aria-label', 'Go to image ' + (i + 1)) + dot.addEventListener('click', () => { go(i); restart() }) + dotsWrap && dotsWrap.appendChild(dot) + return dot + }) -let houseImgs = 0 + const go = (n) => { + imgs[index].classList.remove('is-active') + dots[index] && dots[index].classList.remove('is-active') + index = (n + imgs.length) % imgs.length + imgs[index].classList.add('is-active') + dots[index] && dots[index].classList.add('is-active') + } -slidesHouseRight.onclick = () => { - houseImgs = houseImgs + 1 - slidesHouseImg.classList.add('out') - setTimeout(() => { - slidesHouseImg.setAttribute('src', 'img/house-' + houseImgs + '.jpg') - slidesHouseImg.classList.remove('out') - if (houseImgs >= 1) { - slidesHouseLeft.classList.remove('out') - } - }, 150) -} + const start = () => { timer = setInterval(() => go(index + 1), 6000) } + const stop = () => { clearInterval(timer); timer = null } + const restart = () => { stop(); start() } -slidesHouseLeft.onclick = () => { - slidesHouseImg.classList.add('out') - - setTimeout(() => { - slidesHouseImg.classList.remove('out') - if (houseImgs > 0) { - houseImgs = houseImgs - 1 - slidesHouseImg.setAttribute('src', 'img/house-' + houseImgs + '.jpg') - } - if (houseImgs < 1) { - slidesHouseLeft.classList.add('out') - } - }, 150) -} + prev && prev.addEventListener('click', () => { go(index - 1); restart() }) + next && next.addEventListener('click', () => { go(index + 1); restart() }) -const imgHouseError = (image) => { - houseImgs = 0 - image.src = 'img/house-0.jpg' + // Pause on hover (desktop) + gallery.addEventListener('mouseenter', stop) + gallery.addEventListener('mouseleave', start) - setTimeout(() => { - if (houseImgs < 1) { - slidesHouseLeft.classList.add('out') - } - }, 150) - return true -} \ No newline at end of file + // Touch swipe + let startX = 0 + gallery.addEventListener('touchstart', (e) => { startX = e.touches[0].clientX; stop() }, { passive: true }) + gallery.addEventListener('touchend', (e) => { + const dx = e.changedTouches[0].clientX - startX + if (Math.abs(dx) > 40) go(index + (dx < 0 ? 1 : -1)) + start() + }) + + // Click image to open in lightbox (opens at the currently shown slide) + const track = gallery.querySelector('.gallery-track') + if (track && window.openLightbox) { + const srcs = imgs.map((i) => i.getAttribute('src')) + const alts = imgs.map((i) => i.alt) + track.classList.add('zoomable') + track.addEventListener('click', () => window.openLightbox(srcs, alts, index)) + } + + start() +}) + +// --- Footer year ---------------------------------------------- +const yearEl = document.getElementById('year') +if (yearEl) yearEl.textContent = new Date().getFullYear() diff --git a/old.index.php b/old.index.php deleted file mode 100644 index d82d16f..0000000 --- a/old.index.php +++ /dev/null @@ -1,166 +0,0 @@ - - - - - - - - Pine Creek HOA - - - - - - - - - - - - - - - -
- -
-
- -
-
- -
-
-
-

Welcome to Pine Creek

-
Kannapolis' Premier Gated community
-
-
-

Pine Creek is one of the Greater Charlotte Area’s premier gated communities offering custom built homes in North Carolina’s Cabarrus County.

-

The neighborhood features elegant custom built homes based on French country designs and influences, and homes range in size from 4,500 to over 11,000 square feet. Each home is carefully positioned on lots of one acre or more in order to preserve the natural beauty of the original landscape and to protect each homeowner’s privacy.

-

Create lifelong memories with your family in a luxury, custom home in a secure and quiet community. Welcome home to Pine Creek.

-
-
-
- -
-
-
- -
-
-
-

The Vineyard

-

A subsect of Pine Creek, The Vineyard is its own haven. Enclosed by lush grape vines and woods, The Vineyard custom homes feature Spanish/Tuscan styled architectural designs.

- Learn More -
-
-
- -
- -
-
- -
-
-
-
-
- -
-
-
- -
-
-
-

Build Your Custom Home in Pine Creek

-

While Pine Creek does not have a list of pre-approved custom home builders in order to provide owners with more flexibility in who builds their future custom home, Pine Creek Homeowners’ Association does evaluate proposed plans in accordance to the guidance in Pine Creek Covenants.

-

The primary focus of this approval process is to ensure all proposed home designs, architectural details and landscape designs align with the existing custom homes in Pine Creek. The HOA is pleased to provide feedback to a potential buyer on home plan renderings to confirm your vision would be in harmony with the style of the neighborhood.

- View open lots - Contact us -
-
-
- -
- -
-
- -
-
-
-
-
- -
-
-
- -
-
-
-

Call Kannapolis, NC ‘Home’

-

Kannapolis, North Carolina is a family-oriented town filled with Southern charm. Kannapolis was originally developed in 1906 to be the home to Cannon Mills. Even though the mill is no longer open, Kannapolis has exploded with residential and business development and has become home to families desiring to live close to uptown with the small town, country feel.

-

The town is conveniently located; right off of I-85 and within 30 minutes of uptown Charlotte and Charlotte Douglas International Airport. With growing businesses, a vast array of shops and restaurants, a beautiful downtown, Cabarrus County schools and highly sought after private schools, and the grandeur of the NC Research Campus, Kannapolis is a wonderful place to call home.

-
-
-
- -
-
-
-
- -
-
-
- -
-
-
-

Pine Creek Homeowners’ Association

-
-

The Pine Creek Homeowners’ Association consists of board members voted into position by homeowners within the neighborhood. The Homeowner’s Association is responsible for approving proposed building plans and ongoing maintenance of homes within the neighborhood to ensure homes are built and managed to meet the aesthetics of Pine Creek and the Vineyards.

-
-
- -
- - - - - -