diff --git a/assets/img/starter-content/default-icon.png b/assets/img/starter-content/default-icon.png new file mode 100644 index 0000000000..3b7b9471b0 Binary files /dev/null and b/assets/img/starter-content/default-icon.png differ diff --git a/assets/img/starter-content/default-logo.png b/assets/img/starter-content/default-logo.png new file mode 100644 index 0000000000..c82b5d801c Binary files /dev/null and b/assets/img/starter-content/default-logo.png differ diff --git a/assets/img/starter-content/default-logo.svg b/assets/img/starter-content/default-logo.svg new file mode 100644 index 0000000000..b1d338a5bf --- /dev/null +++ b/assets/img/starter-content/default-logo.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/assets/img/starter-content/folio-code.jpeg b/assets/img/starter-content/folio-code.jpeg new file mode 100644 index 0000000000..390be6d43d Binary files /dev/null and b/assets/img/starter-content/folio-code.jpeg differ diff --git a/assets/img/starter-content/folio-dashboard.jpeg b/assets/img/starter-content/folio-dashboard.jpeg new file mode 100644 index 0000000000..1db4ccd734 Binary files /dev/null and b/assets/img/starter-content/folio-dashboard.jpeg differ diff --git a/assets/img/starter-content/folio-design.jpeg b/assets/img/starter-content/folio-design.jpeg new file mode 100644 index 0000000000..e6389d56d0 Binary files /dev/null and b/assets/img/starter-content/folio-design.jpeg differ diff --git a/assets/img/starter-content/folio-hero.jpeg b/assets/img/starter-content/folio-hero.jpeg new file mode 100644 index 0000000000..37682c3b6f Binary files /dev/null and b/assets/img/starter-content/folio-hero.jpeg differ diff --git a/assets/img/starter-content/folio-process.jpeg b/assets/img/starter-content/folio-process.jpeg new file mode 100644 index 0000000000..e8cedd54bd Binary files /dev/null and b/assets/img/starter-content/folio-process.jpeg differ diff --git a/assets/img/starter-content/logo-agency.png b/assets/img/starter-content/logo-agency.png deleted file mode 100644 index 9c752c9fb2..0000000000 Binary files a/assets/img/starter-content/logo-agency.png and /dev/null differ diff --git a/assets/img/starter-content/neve-hero-2.png b/assets/img/starter-content/neve-hero-2.png deleted file mode 100644 index 460e018f0f..0000000000 Binary files a/assets/img/starter-content/neve-hero-2.png and /dev/null differ diff --git a/assets/img/starter-content/neve-marketing-agency-01.png b/assets/img/starter-content/neve-marketing-agency-01.png deleted file mode 100644 index ce8abc085f..0000000000 Binary files a/assets/img/starter-content/neve-marketing-agency-01.png and /dev/null differ diff --git a/assets/img/starter-content/neve-marketing-agency-02.png b/assets/img/starter-content/neve-marketing-agency-02.png deleted file mode 100644 index 88cbbab07a..0000000000 Binary files a/assets/img/starter-content/neve-marketing-agency-02.png and /dev/null differ diff --git a/assets/img/starter-content/neve-marketing-agency-03.png b/assets/img/starter-content/neve-marketing-agency-03.png deleted file mode 100644 index 807688885b..0000000000 Binary files a/assets/img/starter-content/neve-marketing-agency-03.png and /dev/null differ diff --git a/assets/img/starter-content/neve-marketing-agency-04.png b/assets/img/starter-content/neve-marketing-agency-04.png deleted file mode 100644 index cc4930e9cd..0000000000 Binary files a/assets/img/starter-content/neve-marketing-agency-04.png and /dev/null differ diff --git a/assets/img/starter-content/neve-marketing-agency-05.png b/assets/img/starter-content/neve-marketing-agency-05.png deleted file mode 100644 index 8c978104dc..0000000000 Binary files a/assets/img/starter-content/neve-marketing-agency-05.png and /dev/null differ diff --git a/assets/img/starter-content/neve-marketing-agency-06.png b/assets/img/starter-content/neve-marketing-agency-06.png deleted file mode 100644 index 5f58af93d9..0000000000 Binary files a/assets/img/starter-content/neve-marketing-agency-06.png and /dev/null differ diff --git a/assets/img/starter-content/neve-marketing-agency-07.png b/assets/img/starter-content/neve-marketing-agency-07.png deleted file mode 100644 index c0699a1015..0000000000 Binary files a/assets/img/starter-content/neve-marketing-agency-07.png and /dev/null differ diff --git a/assets/img/starter-content/neve-marketing-agency-10.png b/assets/img/starter-content/neve-marketing-agency-10.png deleted file mode 100644 index 3f756bc195..0000000000 Binary files a/assets/img/starter-content/neve-marketing-agency-10.png and /dev/null differ diff --git a/assets/img/starter-content/neve-marketing-agency-12.png b/assets/img/starter-content/neve-marketing-agency-12.png deleted file mode 100644 index 2c66a473e0..0000000000 Binary files a/assets/img/starter-content/neve-marketing-agency-12.png and /dev/null differ diff --git a/assets/img/starter-content/neve-marketing-agency-13.png b/assets/img/starter-content/neve-marketing-agency-13.png deleted file mode 100644 index 37937bfcf8..0000000000 Binary files a/assets/img/starter-content/neve-marketing-agency-13.png and /dev/null differ diff --git a/assets/img/starter-content/neve-marketing-agency-14.png b/assets/img/starter-content/neve-marketing-agency-14.png deleted file mode 100644 index 3797f3fc7d..0000000000 Binary files a/assets/img/starter-content/neve-marketing-agency-14.png and /dev/null differ diff --git a/assets/img/starter-content/neve-marketing-agency-15.png b/assets/img/starter-content/neve-marketing-agency-15.png deleted file mode 100644 index 45ba54a2fe..0000000000 Binary files a/assets/img/starter-content/neve-marketing-agency-15.png and /dev/null differ diff --git a/assets/img/starter-content/neve-marketing-agency-16.png b/assets/img/starter-content/neve-marketing-agency-16.png deleted file mode 100644 index 6b4f6c82cc..0000000000 Binary files a/assets/img/starter-content/neve-marketing-agency-16.png and /dev/null differ diff --git a/assets/img/starter-content/neve-marketing-agency-17.png b/assets/img/starter-content/neve-marketing-agency-17.png deleted file mode 100644 index da99f6794f..0000000000 Binary files a/assets/img/starter-content/neve-marketing-agency-17.png and /dev/null differ diff --git a/assets/img/starter-content/neve-marketing-agency-18.png b/assets/img/starter-content/neve-marketing-agency-18.png deleted file mode 100644 index 5f96631315..0000000000 Binary files a/assets/img/starter-content/neve-marketing-agency-18.png and /dev/null differ diff --git a/assets/img/starter-content/neve-marketing-agency-22.png b/assets/img/starter-content/neve-marketing-agency-22.png deleted file mode 100644 index 58123391ae..0000000000 Binary files a/assets/img/starter-content/neve-marketing-agency-22.png and /dev/null differ diff --git a/assets/img/starter-content/neve-marketing-agency-25.png b/assets/img/starter-content/neve-marketing-agency-25.png deleted file mode 100644 index 60cc39eae3..0000000000 Binary files a/assets/img/starter-content/neve-marketing-agency-25.png and /dev/null differ diff --git a/assets/img/starter-content/neve-marketing-icon-1.png b/assets/img/starter-content/neve-marketing-icon-1.png deleted file mode 100644 index e93cf6bdd9..0000000000 Binary files a/assets/img/starter-content/neve-marketing-icon-1.png and /dev/null differ diff --git a/assets/img/starter-content/neve-marketing-icon-2.png b/assets/img/starter-content/neve-marketing-icon-2.png deleted file mode 100644 index be10579c28..0000000000 Binary files a/assets/img/starter-content/neve-marketing-icon-2.png and /dev/null differ diff --git a/assets/img/starter-content/neve-marketing-icon-3.1.png b/assets/img/starter-content/neve-marketing-icon-3.1.png deleted file mode 100644 index 6e2a283205..0000000000 Binary files a/assets/img/starter-content/neve-marketing-icon-3.1.png and /dev/null differ diff --git a/assets/img/starter-content/neve-marketing-icon-4.1.png b/assets/img/starter-content/neve-marketing-icon-4.1.png deleted file mode 100644 index e1c64be0b9..0000000000 Binary files a/assets/img/starter-content/neve-marketing-icon-4.1.png and /dev/null differ diff --git a/assets/img/starter-content/neve-marketing-icon-5.png b/assets/img/starter-content/neve-marketing-icon-5.png deleted file mode 100644 index 9d76a38b92..0000000000 Binary files a/assets/img/starter-content/neve-marketing-icon-5.png and /dev/null differ diff --git a/assets/img/starter-content/neve-marketing-icon-6.png b/assets/img/starter-content/neve-marketing-icon-6.png deleted file mode 100644 index fe654c0cdb..0000000000 Binary files a/assets/img/starter-content/neve-marketing-icon-6.png and /dev/null differ diff --git a/assets/img/starter-content/neve-marketing-icon-7.png b/assets/img/starter-content/neve-marketing-icon-7.png deleted file mode 100644 index 5fef9c4753..0000000000 Binary files a/assets/img/starter-content/neve-marketing-icon-7.png and /dev/null differ diff --git a/assets/img/starter-content/person-hero-2.png b/assets/img/starter-content/person-hero-2.png deleted file mode 100644 index f8c9ecdae5..0000000000 Binary files a/assets/img/starter-content/person-hero-2.png and /dev/null differ diff --git a/inc/compatibility/starter-content/about.php b/inc/compatibility/starter-content/about.php index 9c7a1c8628..d4d0d2b64a 100644 --- a/inc/compatibility/starter-content/about.php +++ b/inc/compatibility/starter-content/about.php @@ -5,352 +5,199 @@ * @package Neve\Compatibility\Starter_Content */ -return [ - 'post_type' => 'page', - 'post_title' => _x( 'About', 'Theme starter content', 'neve' ), - 'post_content' => ' -
-
-

About Us

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

Our Story

- - - -

Are there any leftovers in the kitchen? what are the expectations but technologically savvy.

+$post_content = <<<'HTML' + +
+

About Us

- -

Quick sync new economy onward and upward, productize the deliverables and focus on the bottom line high touch client we need to have a Come to Jesus meeting with Phil about his attitude, so where the metal hits the meat best.

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

We are driven by values

+ +

A team focused on building clear, useful digital experiences

- -

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Ut elit tellus, luctus nec ullamcorper mattis, pulvinar dapibus leo. Line high touch client we need to have a Come to Jesus meeting with Phil about his attitude, so where the.

- - - - - - - - - - - - -
+ +

Founded in 2012, we’ve grown from a small design studio into a full-service digital agency working with clients around the world.

+
+ + + +
+
+
+
+
Our team at work
+
+
- -
-
-
-
- - - - -
-
- - - -
- - - - -
-
-
- - - - - - - -

Results Oriented Growth

+ +
+

Our Mission

- -

Lorem ipsum dolor sit amet elit do, consectetur adipiscing, sed eiusmod tempor line high touch client.

+ +

We believe design should solve real problems. Our mission is to bridge the gap between thoughtful aesthetics and functional digital products that drive measurable business results.

- - -
- + +

Every project starts with deep understanding — of your brand, your audience, and the market you operate in. We don’t just make things look good; we make them work.

+
+
+
+ - -
-
- + +
+

What drives us

+ - - - + +
+
+
+ + - -

Client Collaboration

+ +

Precision

- -

Lorem ipsum dolor sit amet elit do, consectetur adipiscing, sed eiusmod tempor line high touch client.

- - - - -
+ +

Every pixel matters. We pay close attention to the details that shape the final result.

+
+
- -
-
- - - - - + +
+
+ + - -

Data-Driven Creativity

+ +

Collaboration

- -

Lorem ipsum dolor sit amet elit do, consectetur adipiscing, sed eiusmod tempor line high touch client.

- - - - -
-
- - - - -
- - - -
-
- - - - -
-
-
+ +

We work as an extension of your team, aligning every decision with your goals.

+
- -
-
- - - - - - + +
+
+ + - - -
-
- + +

Innovation

+ - -
-
+ +

We keep up with current trends to deliver solutions that hold up well over time.

+
- - - -
-
-
- +
+ - - - - - -

John Marshall

+ +
+

Meet the team

- -

Strategy

- - - - - + +

James Chen

+ - - -
+ +

Creative Director

+
+
- -
-
- - - - - + +
+
+SM + - -

Maria Williams

+ +

Sophie Martin

- -

Marketing

- - - - - - - - -
+ +

Lead Designer

+
+
- -
-
- + +
+
+DK + - - - - - -

Mark Spencer

+ +

David Kim

- -

Copywriting

- - - - - - - - -
+ +

Tech Lead

+
+
- -
-
- + +
+
+EW + - - - - - -

Helen Castillo

+ +

Emma Walsh

- -

Public Relations

- - - - - - - - -
+ +

Strategy Director

+
+
- +
+ - - + +HTML; - - -
-
-', +return [ + 'post_type' => 'page', + 'post_name' => 'about', + 'post_title' => _x( 'About', 'Theme starter content', 'neve' ), + 'post_content' => str_replace( + [ '{{theme_uri}}', '{{home_url}}' ], + [ trailingslashit( get_template_directory_uri() ), trailingslashit( home_url() ) ], + $post_content + ), ]; diff --git a/inc/compatibility/starter-content/blog.php b/inc/compatibility/starter-content/blog.php new file mode 100644 index 0000000000..e72f1968f6 --- /dev/null +++ b/inc/compatibility/starter-content/blog.php @@ -0,0 +1,25 @@ + +
+

Content coming soon.

+
+ +HTML; + +return [ + 'post_type' => 'page', + 'post_name' => 'blog', + 'post_title' => _x( 'Blog', 'Theme starter content', 'neve' ), + 'post_content' => str_replace( + [ '{{theme_uri}}', '{{home_url}}' ], + [ trailingslashit( get_template_directory_uri() ), trailingslashit( home_url() ) ], + $post_content + ), +]; diff --git a/inc/compatibility/starter-content/contact.php b/inc/compatibility/starter-content/contact.php index 69cc2e7797..c4be95c003 100644 --- a/inc/compatibility/starter-content/contact.php +++ b/inc/compatibility/starter-content/contact.php @@ -1,156 +1,179 @@ 'page', - 'post_name' => 'contact', - 'post_title' => _x( 'Contact', 'Theme starter content', 'neve' ), - 'post_content' => ' -
-
-

Contact us

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

Call us

- - - -

509-728-8632 | Monday - Friday

+$post_content = <<<'HTML' + +
+

Contact Us

- - -
+ +

Let’s start a conversation

+ + + +

Have a project in mind or just want to say hello? We’d love to hear from you.

+
+ + + +
+
+
+
+
+
+ + + + +

Email

+
+ + + +

hello@example.com

+
+ + + +
+
+ + + + +

Phone

+
+ + + +

+1 (234) 567-890

+
+ + + +
+
+ + + + +

Location

+
+ + + +

San Francisco, CA 94103

+
+ + + +
+
+ + + + +

Office Hours

+
+ + + +

Mon – Fri: 9:00 AM – 6:00 PM

+
+
- -
-
- - - - -
- - - - - - - -

Email

+ +
+
+

Prefer to email?

- -

info@marketing-agency.com

+ +

Tell us about your project and we’ll get back to you within one business day. We read every message that comes in.

- - -
-
- - - -
-
- - - - -
- + + + - - - + + +
+
+
+
+ - -

Offices

+ +
+

Frequently asked questions

- -

2982 Sun Valley Road, Washington

- - - - -
+ +
+
What is your typical project timeline? +

Most projects take 4–8 weeks from kickoff to launch. Larger projects with complex requirements may take 10–12 weeks. We’ll give you a clear timeline during our initial consultation.

+
+ + + +
How much does a project cost? +

Every project is unique, so we provide custom quotes based on scope and requirements. We offer packages starting at $5,000 for smaller projects and enterprise solutions for larger engagements.

+
+ + + +
Do you offer ongoing support? +

Yes. We offer maintenance and support packages to keep your digital products running reliably. From monthly updates to full managed services, we can match a plan to your needs.

+
+ + + +
What information do you need to get started? +

A brief description of your project, your goals, timeline preferences, and budget range. The more detail you provide, the more accurate our initial proposal will be.

+
+
-
- - - - -
- - - -
-
- - - - -
-

-
- - - - - - - -
-
-

Send us a message or Come visit us

+ + + + - + + +
+
+ +HTML; - - -
-
-', +return [ + 'post_type' => 'page', + 'post_name' => 'contact', + 'post_title' => _x( 'Contact', 'Theme starter content', 'neve' ), + 'post_content' => str_replace( + [ '{{theme_uri}}', '{{home_url}}' ], + [ trailingslashit( get_template_directory_uri() ), trailingslashit( home_url() ) ], + $post_content + ), ]; diff --git a/inc/compatibility/starter-content/custom-css.php b/inc/compatibility/starter-content/custom-css.php new file mode 100644 index 0000000000..54dffc0ef9 --- /dev/null +++ b/inc/compatibility/starter-content/custom-css.php @@ -0,0 +1,116 @@ + .wp-block-group__inner-container, +.folio-hero-media.is-layout-flex{min-height:340px;align-items:center} +.folio-hero-media .wp-block-cover{flex:0 0 auto;width:172px;min-height:252px;border-radius:16px;overflow:hidden;box-shadow:0 24px 52px rgba(15,23,42,.22);margin:0} +.folio-hero-media .wp-block-cover:nth-child(1){transform:rotate(-7deg) translateY(6px);z-index:1} +.folio-hero-media .wp-block-cover:nth-child(2){transform:translateY(-16px);z-index:3;margin:0 -26px} +.folio-hero-media .wp-block-cover:nth-child(3){transform:rotate(7deg) translateY(10px);z-index:2} +@media(max-width:782px){ + .folio-hero-media .wp-block-cover{width:150px;transform:none !important;margin:6px !important} +} + +/* Star rating row */ +.folio-stars{display:inline-flex;gap:3px;color:var(--nv-c-3,#F59E0B);line-height:1} +.folio-stars svg{width:18px;height:18px;display:block} + +/* Outline buttons: core's transparent-background outline rule loses the cascade on some + WP versions (e.g. 6.9) and the default dark button background shows through. */ +.folio-btn-outline .wp-block-button__link{background-color:transparent} + +/* Tag pills */ +.folio-pills .wp-block-button__link{font-size:13px} + +/* Brand strip */ +.folio-brand p{margin:0;opacity:.55;font-weight:600} + +/* Icon wrapper */ +.folio-icon{display:inline-flex;align-items:center;justify-content:center;line-height:0} +.folio-icon svg{display:block} + +/* Cards (services, what-we-do) */ +.folio-card{height:auto;background:var(--nv-site-bg,#fff);transition:transform .2s ease,box-shadow .2s ease;box-shadow:0 1px 2px rgba(15,23,42,.04)} +.folio-card:hover{transform:translateY(-4px);box-shadow:0 22px 48px rgba(15,23,42,.10)} +/* Centered card variant (home "What we do") */ +.folio-card-center{text-align:center} +.folio-card-center .folio-icon{margin-left:auto;margin-right:auto} + +/* Project cards */ +.folio-project{background:var(--nv-site-bg,#fff);overflow:hidden;transition:transform .2s ease,box-shadow .2s ease;box-shadow:0 10px 30px rgba(15,23,42,.06)} +.folio-project:hover{transform:translateY(-5px);box-shadow:0 26px 56px rgba(15,23,42,.14)} +.folio-project .wp-block-image,.folio-project img{margin:0;display:block} +.folio-project .wp-block-image img{width:100%;height:100%;object-fit:cover} + +/* Equal-height cards only when laid out in a row (not stacked on mobile) */ +@media(min-width:783px){.folio-card,.folio-project{height:100%}} + +/* Team member: center avatar + text under each other */ +.folio-team-member{text-align:center} +.folio-team-member .folio-avatar{width:62px;height:62px;font-size:20px;margin-left:auto;margin-right:auto} + +/* Testimonial author row: keep avatar + name vertically centered. Classic themes put + the nested stack's blockGap on the inner-container, so the name/role paragraphs keep + their default margins and overflow the avatar height — reset them. */ +.folio-author > .wp-block-group__inner-container,.folio-author.is-layout-flex{align-items:center} +.folio-author p{margin:0} + +/* Stats */ +.folio-stat-num{line-height:1} + +/* Testimonials */ +.folio-quote{height:100%;background:var(--nv-site-bg,#fff);box-shadow:0 10px 30px rgba(15,23,42,.06)} +.folio-quote-mark{font-family:Georgia,serif;line-height:.6;color:var(--nv-c-1,#E5E7EB)} +.folio-avatar{width:46px;height:46px;border-radius:50%;display:flex;align-items:center;justify-content:center;background:var(--nv-primary-accent,#2563EB);color:#fff;font-weight:700;font-size:15px;flex:0 0 auto} + +/* FAQ (core details) */ +.folio-faq details{background:var(--nv-site-bg,#fff);border:1px solid var(--nv-c-1,#E5E7EB);border-radius:12px;padding:18px 22px;margin-bottom:14px} +.folio-faq summary{cursor:pointer;font-weight:600;list-style:none} +.folio-faq summary::-webkit-details-marker{display:none} +.folio-faq summary::after{content:"+";float:right;font-size:20px;line-height:1;color:var(--nv-c-2,#6B7280)} +.folio-faq details[open] summary::after{content:"\2013"} +.folio-faq details[open] summary{margin-bottom:10px} + +/* Contact info icon chips */ +.folio-contact-icon{width:44px;height:44px;border-radius:10px;background:var(--nv-light-bg,#F1F5F9);display:flex;align-items:center;justify-content:center;flex:0 0 auto;color:var(--nv-primary-accent,#2563EB)} + +/* Generic image rounding inside starter pages */ +.folio-round img{border-radius:16px} + +/* ---- Block editor only ---- */ +/* The editor renders core/html previews in a sandboxed iframe whose box stretches + to the available width, which breaks flex rows (squeezed labels) and centering. + Size the starter icon/avatar blocks to their actual content. Scoped to preview + mode via :has() so the HTML-edit textarea stays full width; core/html saves + without a wrapper element, so these rules are inert on the front end. */ +.folio-rating .wp-block-html:has(.components-sandbox){flex:0 0 102px;max-width:102px} +.folio-author .wp-block-html:has(.components-sandbox){flex:0 0 46px;max-width:46px} +.folio-team-member .wp-block-html:has(.components-sandbox){flex:0 0 auto;width:46px;max-width:46px} +.folio-card-center .wp-block-html:has(.components-sandbox){width:30px;max-width:30px;margin-left:auto;margin-right:auto} +.folio-project .wp-block-html:has(.components-sandbox){flex:0 0 20px;max-width:20px} +.folio-check .wp-block-html:has(.components-sandbox){flex:0 0 18px;max-width:18px} +.folio-chip .wp-block-html:has(.components-sandbox){flex:0 0 44px;max-width:44px} +/* The classic-editor canvas gives every block auto side margins (default content + width), which centers fit-content items inside flex rows — pin ours back left. + Element+class selectors out-rank the canvas default; .wp-block is editor-only. */ +.folio-author > div.wp-block, +.folio-rating > div.wp-block,.folio-rating > p.wp-block, +.folio-check > div.wp-block,.folio-check > p.wp-block, +.folio-chip > div.wp-block,.folio-chip > p.wp-block, +.folio-project div.wp-block,.folio-project p.wp-block{margin-left:0;margin-right:0} +CSS; diff --git a/inc/compatibility/starter-content/home.php b/inc/compatibility/starter-content/home.php index e9beee3b15..aaaea99a50 100644 --- a/inc/compatibility/starter-content/home.php +++ b/inc/compatibility/starter-content/home.php @@ -4,398 +4,474 @@ * * @package Neve\Compatibility\Starter_Content */ -return [ - 'post_type' => 'page', - 'post_title' => _x( 'Home', 'Theme starter content', 'neve' ), - 'post_content' => ' -
-
-
- - - - -

Create and grow your unique website today

+ +$star = ''; + +$post_content = <<<'HTML' + +
+
+
+

We craft digital experiences that matter

- -

Programmatically work but low hanging fruit so new economy cross-pollination. Quick sync new economy onward and upward.

+ +

Turn your ideas into digital products people use. From brand identity to custom web development, we focus on results that move your business forward.

- - + +
+$star$star$star$star$star + + + +

Trusted by 500+ clients worldwide

+
+ + + +
+ + + + + + + + + + + + + +
+
- -
-
-
-
-
+ +
+
+
+

Brand Identity

+
- - - + +
+

Web Design

+
+ - -
-
-
- + +
+

Photography

+
+
+
+
+
+ - - - + +
+

Brands we have worked with

+ - -

Business

- + +
+
+

Northwind

+
+ - -

Vivamus dolor sit amet do, consectetur adipiscing.

- + +
+

APEX

+
+ - - -
+ +
+

Coastal Co.

+
- -
-
- + +
+

Helix Group

+
+ + + +
+

Solaris

+
+ - - - + +
+

VANTAGE

+
+
+
+ - -

Online Store

+ +
+

What we do

- -

Sollicitudin ipsum sit amet elit do sed eiusmod tempor.

+ +

Comprehensive creative and technical services to bring your ideas to life.

- - -
- + +
+
+
+ + - -
-
- - - - - - - -

Personal Blog

+ +

Brand Design

- -

Faucibus dolor sit amet do, consectetur adipiscing.

+ +

Create a distinctive identity that resonates with your audience and stands apart in the marketplace.

- - -
+ + +
+
- -
-
- - - - - + +
+
+ + - -

Portfolio

+ +

Web Development

- -

Interdum dolor sit amet elit do sed eiusmod tempor.

+ +

Build fast, scalable websites that load quickly, engage visitors, and convert them into customers.

- - -
-
- - - -
-
- - - - -
-
- -
-
- + +
+
+ + + + +

Photography

- - + +

Capture clear visuals that tell your brand story and support your marketing materials.

- - -
+ + +
- -
-
-
-
- + +
+
+ + - -
-
-
- + +

Digital Marketing

+ - - - + +

Strategic campaigns that reach your target audience and deliver measurable growth.

+ + + + +
+
+
+
+ - -

Marketing Strategy

+ +
+

Selected projects

- - -
- + +

A glimpse of the brands and products we have helped shape.

+ - -
-
+ +
+
+
+
Horizon Brand
- - - - - -

Omnichannel Optimization

+ +
+

Horizon Brand

- - -
-
-
-
- + +
+

Branding

+ - - +
+
+ - -
-
-
+ +
+
+
Digital Platform
- - - - - - - + +
+

Digital Platform

+ - -

Janet Morris

+ +
+

Website

- - -
+ + +
+
+
+
- -
-
+ +
+
+
Summer Campaign
- - - + +
+

Summer Campaign

+ - -

“The agency completely transformed our strategy. They\'re a true marketing partner, and we\'re thrilled with the results.”

+ +
+

Campaign

- -

Willie Brown

- + + +
+
+
+
+
+
+ + + +
+
+
+

500+

+ - - -
+ +

Projects Completed

+
- -
-
- + +
+

98%

+ + + +

Client Satisfaction

+
+ - - - + +
+

12

+ - -

“Their expertise and their data-driven approach allowed us to optimize our campaigns for maximum impact.”

- + +

Years Experience

+
+ - -

MARIA STEVENS

- + +
+

50+

+ - - -
+ +

Team Members

+
- +
+ - - -
- + +
+

What our clients say

+ - -
-
- - - - -
-
-
-
- + +

Real words from teams we have partnered with.

+ - -
- - + +
+
+
+

+ - -

Food Magazine Ad

- + +

The Default team reworked our entire online presence. They understood our goals early and delivered what we asked for on time.

+ + + +
+MJ + - -

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Ut elit tellus, luctus nec ullamcorper mattis, pulvinar dapibus. Fit authentic try-hard farm-to-table hammock hexagon aesthetic.

+ +
+

Maria Johnson

- - -
-
- + +

CEO, Horizon Tech

+
+
+
+
+ - -
-
- - + +
+
+

+ - -

Influencer Marketing

- + +

Working with Default was straightforward. They are responsive, creative, and genuinely invested in our success.

+ + + +
+AR + - -

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Ut elit tellus, luctus nec ullamcorper mattis, pulvinar dapibus. Fit authentic try-hard farm-to-table hammock hexagon aesthetic.

+ +
+

Alex Rivera

- - -
+ +

Founder, Creative Studio

+
+
+
+
- -
-
-
-
- + +
+
+

+ - - -
-
- + +

Reliable service from start to finish. Default paid close attention to detail at every stage of the project.

+ - -
- - + +
+SK + - -
-
- + +
+

Sarah Kim

+ + + +

Director, Digital Growth

+
+
+
+
+
+
+ - -
-
-

Let’s work together on your next marketing project

+ + - + +HTML; - -
-
- +$post_content = str_replace( '$star', $star, $post_content ); - - -
-', +return [ + 'post_type' => 'page', + 'post_name' => 'home', + 'post_title' => _x( 'Home', 'Theme starter content', 'neve' ), + 'post_content' => str_replace( + [ '{{theme_uri}}', '{{home_url}}' ], + [ trailingslashit( get_template_directory_uri() ), trailingslashit( home_url() ) ], + $post_content + ), ]; diff --git a/inc/compatibility/starter-content/portofolio.php b/inc/compatibility/starter-content/portofolio.php deleted file mode 100644 index 304f686413..0000000000 --- a/inc/compatibility/starter-content/portofolio.php +++ /dev/null @@ -1,302 +0,0 @@ - 'page', - 'post_title' => _x( 'Portofolio', 'Theme starter content', 'neve' ), - 'post_content' => ' -
-
-

Portfolio

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

Marketing Strategy

- - - -

Lorem ipsum dolor sit amet, consectetur adipiscing, luctus ullamcorper mattis.

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

Omnichannel Optimization

- - - -

Lorem ipsum dolor sit amet, consectetur adipiscing, luctus ullamcorper mattis.

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

Brand Positioning Map

- - - -

Lorem ipsum dolor sit amet, consectetur adipiscing, luctus ullamcorper mattis.

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

Food Magazine Ad

- - - -

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Ut elit tellus, luctus nec ullamcorper mattis, pulvinar dapibus. Whatever shabby chic gatekeep flannel echo park, pinterest semiotics. Plaid kickstarter squid, swag street art yr pabst distillery blue bottle dreamcatcher ramps.

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

“Their expertise and their data-driven approach allowed us to optimize our campaigns for maximum impact.”

- - - -

MARIA STEVENS

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

Social Media Management

- - - -

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Ut elit tellus, luctus nec ullamcorper mattis.

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

Influencer Marketing

- - - -

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Ut elit tellus, luctus nec ullamcorper mattis.

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

Let’s work together on your next marketing project

- - - - - - - - -
-
- - - -
-
- - - - -
-', -]; diff --git a/inc/compatibility/starter-content/project-details.php b/inc/compatibility/starter-content/project-details.php deleted file mode 100644 index b8d1483eda..0000000000 --- a/inc/compatibility/starter-content/project-details.php +++ /dev/null @@ -1,214 +0,0 @@ - 'page', - 'post_title' => _x( 'Project Details', 'Theme starter content', 'neve' ), - 'post_content' => ' -
-
-
-
- - - - -

Marketing Strategy

- - - -

How we helped Dimero to create a Marketing Strategy and a brand consistent website that converts visitors into clients.

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

-
- - - - - - - -
-
-

Closer to the metal we’ve got to manage that low hanging fruit but quantity and drive awareness to engagement post launch. Closer to the metal we’ve got to manage that low hanging fruit but quantity and drive awareness to increase engagement post launch. Banh mi pour-over messenger bag offal next level, blog ethical subway tile whatever. Cupping williamsburg meh yuccie. Ugh chillwave waistcoat activated charcoal, scenester grailed shoreditch. Big mood mustache shabby chic activated charcoal helvetica su.

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

“We saw a significant increase in website traffic and sales within just a few months.”

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

JANET MORRIS

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

Other projects

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

Marketing Strategy

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

Food Magazine Ad

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

Influencer Marketing

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

Let’s work together on your next marketing project

- - - - - - - - -
-
- - - -
-
- - - - -
-', -]; diff --git a/inc/compatibility/starter-content/services.php b/inc/compatibility/starter-content/services.php new file mode 100644 index 0000000000..b8d84eb1b7 --- /dev/null +++ b/inc/compatibility/starter-content/services.php @@ -0,0 +1,369 @@ + +
+

Our Services

+ + + +

Everything you need to build your digital presence

+ + + +

We offer a range of creative and technical services designed to help your business grow and connect with people online.

+
+ + + +
+
+
+ + + + +

Brand Design

+ + + +

We create distinctive visual identities that capture your brand essence. From logo design to comprehensive brand guidelines, we build the foundation for how your business communicates with the world.

+ + + +
+
+
+ + + + +

Logo & Identity

+
+
+ + + +
+
+ + + + +

Brand Guidelines

+
+
+
+ + + +
+
+
+ + + + +

Visual Systems

+
+
+ + + +
+
+ + + + +

Brand Strategy

+
+
+
+ + + + +
+ + + +
+
Brand Design
+
+
+
+ + + +
+
+
+
Web Development
+
+ + + +
+ + + + +

Web Development

+ + + +

Modern, responsive websites built with performance and user experience at the core. We develop everything from marketing sites to complex web applications.

+ + + +
+
+
+ + + + +

Custom Websites

+
+
+ + + +
+
+ + + + +

Web Applications

+
+
+
+ + + +
+
+
+ + + + +

E-commerce

+
+
+ + + +
+
+ + + + +

CMS Development

+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + + + +

Photography

+ + + +

Photography that tells your brand story. From product shoots to team portraits and event coverage, we capture the visuals that represent your business.

+ + + +
+
+
+ + + + +

Product Photography

+
+
+ + + +
+
+ + + + +

Team Portraits

+
+
+
+ + + +
+
+
+ + + + +

Event Coverage

+
+
+ + + +
+
+ + + + +

Lifestyle Shoots

+
+
+
+ + + + +
+ + + +
+
Photography
+
+
+
+ + + +
+
+
+
Digital Marketing
+
+ + + +
+ + + + +

Digital Marketing

+ + + +

Data-driven marketing strategies that reach your audience and deliver measurable results. We combine creativity with analytics to support your return on investment.

+ + + +
+
+
+ + + + +

SEO & Content

+
+
+ + + +
+
+ + + + +

Social Media

+
+
+
+ + + +
+
+
+ + + + +

Paid Advertising

+
+
+ + + +
+
+ + + + +

Email Campaigns

+
+
+
+ + + + +
+
+
+ + + + + +HTML; + +return [ + 'post_type' => 'page', + 'post_name' => 'services', + 'post_title' => _x( 'Services', 'Theme starter content', 'neve' ), + 'post_content' => str_replace( + [ '{{theme_uri}}', '{{home_url}}' ], + [ trailingslashit( get_template_directory_uri() ), trailingslashit( home_url() ) ], + $post_content + ), +]; diff --git a/inc/compatibility/starter-content/theme-mods.php b/inc/compatibility/starter-content/theme-mods.php index 9ff536a3a6..9a1b002258 100644 --- a/inc/compatibility/starter-content/theme-mods.php +++ b/inc/compatibility/starter-content/theme-mods.php @@ -6,6 +6,14 @@ */ return array( 'logo_show_tagline' => 0, + 'hfg_header_layout_v2' => '{"desktop":{"top":{"left":[],"c-left":[],"center":[],"c-right":[],"right":[]},"main":{"left":[{"id":"logo"}],"c-left":[],"center":[],"c-right":[],"right":[{"id":"primary-menu"},{"id":"button_base"}]},"bottom":{"left":[],"c-left":[],"center":[],"c-right":[],"right":[]}},"mobile":{"top":{"left":[],"c-left":[],"center":[],"c-right":[],"right":[]},"main":{"left":[{"id":"logo"}],"c-left":[],"center":[],"c-right":[],"right":[{"id":"nav-icon"}]},"bottom":{"left":[],"c-left":[],"center":[],"c-right":[],"right":[]},"sidebar":[{"id":"primary-menu"},{"id":"button_base"}]}}', + 'hfg_header_layout_main_height' => '{"mobile":60,"tablet":70,"desktop":80,"suffix":{"mobile":"px","tablet":"px","desktop":"px"}}', + 'hfg_header_layout_main_bottom_border' => '{"mobile":1,"tablet":1,"desktop":1,"suffix":{"mobile":"px","tablet":"px","desktop":"px"}}', + 'hfg_header_layout_main_border_color' => 'var(--nv-c-1)', + 'hfg_header_layout_main_layout' => 'layout-full-contained', + 'button_base_text_setting' => 'Get Started', + 'button_base_link_setting' => home_url( '/contact/' ), + 'button_base_new_tab' => 0, 'nav-icon_button_appearance' => array( 'borderRadius' => @@ -139,8 +147,8 @@ 'neve_advanced_layout_options' => true, 'neve_blog_archive_sidebar_layout' => 'full-width', 'neve_blog_archive_content_width' => 100, - 'neve_body_font_family' => '', - 'neve_headings_font_family' => '', + 'neve_body_font_family' => 'Nunito Sans', + 'neve_headings_font_family' => 'Bricolage Grotesque', 'neve_button_appearance' => array( 'borderRadius' => @@ -286,11 +294,11 @@ 'tablet' => 0, 'desktop' => 0, ), - 'fontWeight' => '600', - 'textTransform' => 'uppercase', + 'fontWeight' => '500', + 'textTransform' => 'none', ), - 'neve_link_color' => '#2b2b2b', - 'neve_link_hover_color' => '#727272', + 'neve_link_color' => '#2563eb', + 'neve_link_hover_color' => '#1d4ed8', 'neve_secondary_button_appearance' => array( 'borderRadius' => @@ -505,15 +513,15 @@ 'allowDeletion' => false, 'colors' => array( - 'nv-primary-accent' => '#0065cb', - 'nv-secondary-accent' => '#0057ad', + 'nv-primary-accent' => '#2563eb', + 'nv-secondary-accent' => '#1d4ed8', 'nv-site-bg' => '#ffffff', - 'nv-light-bg' => '#f8f8f8', - 'nv-dark-bg' => '#0d1821', - 'nv-text-color' => '#2c2c2c', + 'nv-light-bg' => '#f1f5f9', + 'nv-dark-bg' => '#111827', + 'nv-text-color' => '#1f2937', 'nv-text-dark-bg' => '#ffffff', - 'nv-c-1' => '#77b978', - 'nv-c-2' => '#f37262', + 'nv-c-1' => '#e5e7eb', + 'nv-c-2' => '#6b7280', ), ), 'darkMode' => @@ -665,6 +673,7 @@ ), 'neve_had_old_skin' => false, 'footer_copyright_color' => 'var(--nv-text-dark-bg)', + 'footer_copyright_content' => '© ' . gmdate( 'Y' ) . ' Default. All rights reserved.', 'footer_copyright_component_align' => array( 'desktop' => 'center', @@ -721,7 +730,7 @@ 'neve_post_cover_title_boxed_background_color' => 'var(--nv-dark-bg)', 'neve_enable_masonry' => false, 'neve_post_thumbnail_box_shadow' => 0, - 'primary-menu_style' => 'style-border-top', + 'primary-menu_style' => 'style-plain', 'neve_post_cover_background_color' => 'var(--nv-secondary-accent)', 'neve_post_cover_padding' => array( @@ -797,7 +806,7 @@ 'mobile' => 'left', ), 'hfg_footer_layout_bottom_columns_number' => 2, - 'custom_logo' => '{{featured-image-logo}}', + 'custom_logo' => '{{default-logo}}', 'logo_color' => 'var(--nv-text-color)', 'neve_blog_post_meta_fields' => '[{"slug":"author","title":"' . __( 'Author', 'neve' ) . '","visibility":"yes","hide_on_mobile":"","blocked":"yes"},{"slug":"comments","title":"' . __( 'Comments', 'neve' ) . '","visibility":"yes","hide_on_mobile":"","blocked":"yes"},{"slug":"category","title":"' . __( 'Category', 'neve' ) . '","visibility":"yes","hide_on_mobile":"","blocked":"yes"},{"slug":"date","title":"' . __( 'Date', 'neve' ) . '","visibility":"no","hide_on_mobile":"","blocked":"yes"}]', // V4 changes. diff --git a/inc/compatibility/starter-content/work.php b/inc/compatibility/starter-content/work.php new file mode 100644 index 0000000000..663915336c --- /dev/null +++ b/inc/compatibility/starter-content/work.php @@ -0,0 +1,227 @@ +'; + +$post_content = <<<'HTML' + +
+

Our Work

+ + + +

Projects that speak for themselves

+ + + +

A selection of our recent work across branding, web development, photography, and digital campaigns.

+
+ + + +
+
+
+
+
Horizon Brand
+ + + +
+
+

Branding

+ + + +$arrow +
+ + + +

Horizon Brand

+ + + +

Complete brand identity redesign for a tech startup, including logo, guidelines, and digital assets.

+
+
+
+ + + +
+
+
Digital Platform
+ + + +
+
+

Website

+ + + +$arrow +
+ + + +

Digital Platform

+ + + +

Modern SaaS platform design and development with user-centric interface and responsive experience.

+
+
+
+ + + +
+
+
Summer Campaign
+ + + +
+
+

Campaign

+ + + +$arrow +
+ + + +

Summer Campaign

+ + + +

Multi-channel marketing campaign with social, email, and print assets for a lifestyle brand.

+
+
+
+
+ + + +
+
+
+
Alpine Photography
+ + + +
+
+

Photography

+ + + +$arrow +
+ + + +

Alpine Photography

+ + + +

Corporate photography series capturing team culture and workspace for employer branding.

+
+
+
+ + + +
+
+
FinTech Dashboard
+ + + +
+
+

Web App

+ + + +$arrow +
+ + + +

FinTech Dashboard

+ + + +

Complex financial dashboard with real-time data visualization and intuitive analytics interface.

+
+
+
+ + + +
+
+
Eco Initiative
+ + + +
+
+

Branding

+ + + +$arrow +
+ + + +

Eco Initiative

+ + + +

Sustainability-focused brand identity for an environmental organization with regional offices.

+
+
+
+
+
+ + + + + +HTML; + +$post_content = str_replace( '$arrow', $arrow, $post_content ); + +return [ + 'post_type' => 'page', + 'post_name' => 'work', + 'post_title' => _x( 'Work', 'Theme starter content', 'neve' ), + 'post_content' => str_replace( + [ '{{theme_uri}}', '{{home_url}}' ], + [ trailingslashit( get_template_directory_uri() ), trailingslashit( home_url() ) ], + $post_content + ), +]; diff --git a/inc/compatibility/starter_content.php b/inc/compatibility/starter_content.php index 68aea5cc04..1f184e967b 100644 --- a/inc/compatibility/starter_content.php +++ b/inc/compatibility/starter_content.php @@ -13,12 +13,12 @@ * @package Neve\Compatibility */ class Starter_Content { - const HOME_SLUG = 'home'; - const BLOG_SLUG = 'blog'; - const ABOUT_SLUG = 'about'; - const CONTACT = 'contact'; - const PORTOFOLIO_SLUG = 'portofolio'; - const PROJECT_DETAILS = 'project-details'; + const HOME_SLUG = 'home'; + const BLOG_SLUG = 'blog'; + const ABOUT_SLUG = 'about'; + const CONTACT = 'contact'; + const SERVICES_SLUG = 'services'; + const WORK_SLUG = 'work'; /** @@ -40,6 +40,16 @@ public function __construct() { 3 ); // starter content does not provide means of adding post meta so we need to tweak it. + // Site-wide side effects (custom CSS, permalinks) must only run when the + // starter content is actually published, never on the customize.php preview + // (core stages the auto-drafts on mere customizer open). + add_action( 'customize_save_after', [ $this, 'after_publish' ], 100 ); + + // The wp.org theme preview (wp-themes.com) serves starter content virtually and + // never publishes, and the fresh-site Customizer preview renders before publish — + // inline the polish layer there so both match the published result. + add_action( 'wp_enqueue_scripts', [ $this, 'preview_css' ], 20 ); + if ( ! is_customize_preview() ) { return; } @@ -62,32 +72,49 @@ public function __construct() { * @return string Meta value. */ public function starter_meta( $value, $post_id, $meta_key ) { - if ( get_post_type( $post_id ) !== 'page' ) { - return $value; - } - - $post = get_post( $post_id ); + $handled = array( + 'neve_meta_disable_title' => 'on', + 'neve_meta_container' => 'full-width', + 'neve_meta_enable_content_width' => 'on', + 'neve_meta_content_width' => '100', + ); - if ( ! $post ) { + // Bail for every other key. This also prevents recursion: the draft-slug read + // below re-enters this filter with the '_customize_draft_post_name' key. + if ( ! isset( $handled[ $meta_key ] ) ) { return $value; } - if ( $post->post_name === self::BLOG_SLUG ) { + if ( get_post_type( $post_id ) !== 'page' ) { return $value; } + // Only style our own starter pages. Customizer drafts carry the slug in the draft + // meta (post_name is empty); the wp.org theme preview (wp-themes.com) serves the + // starter posts virtually with no meta at all, so fall back to post_name there. + $draft_slug = get_post_meta( $post_id, '_customize_draft_post_name', true ); + $slug = '' !== $draft_slug ? $draft_slug : get_post_field( 'post_name', $post_id ); - if ( $meta_key === 'neve_meta_disable_title' ) { - return 'on'; - } - if ( $meta_key === 'neve_meta_enable_content_width' ) { - return 'on'; - } - if ( $meta_key === 'neve_meta_content_width' ) { - return '100'; + if ( ! $this->is_starter_page_slug( $slug ) || self::BLOG_SLUG === $slug ) { + return $value; } - return $value; + return $handled[ $meta_key ]; + } + + /** + * Whether a draft slug belongs to one of our starter pages. + * + * @param mixed $slug Candidate slug. + * + * @return bool + */ + private function is_starter_page_slug( $slug ) { + return in_array( + $slug, + [ self::HOME_SLUG, self::BLOG_SLUG, self::ABOUT_SLUG, self::CONTACT, self::SERVICES_SLUG, self::WORK_SLUG ], + true + ); } @@ -102,17 +129,244 @@ public function register_listener( $post_ID, $post, $update ) { if ( $update ) { return; } - $is_from_starter_content = ! empty( get_post_meta( $post_ID, '_customize_draft_post_name', true ) ); - if ( ! $is_from_starter_content ) { + $draft_slug = get_post_meta( $post_ID, '_customize_draft_post_name', true ); + // Only touch our own starter drafts — pages a user adds inside the Customizer + // carry the same draft meta and must be left alone. + if ( ! $this->is_starter_page_slug( $draft_slug ) ) { return; } if ( $post->post_type === 'page' ) { update_post_meta( $post_ID, 'neve_meta_disable_title', 'on' ); update_post_meta( $post_ID, 'neve_meta_enable_content_width', 'on' ); update_post_meta( $post_ID, 'neve_meta_content_width', '100' ); + // Full-bleed sections need a full-width page container (blog stays the contained posts list). + if ( $draft_slug !== self::BLOG_SLUG ) { + update_post_meta( $post_ID, 'neve_meta_container', 'full-width' ); + } + } + } + + /** + * Inline the starter polish CSS while the content renders without a publish. + * + * Active only while the class is constructed (fresh sites, plus the wp.org theme + * preview which filters fresh_site to true). Published sites get the same CSS via + * after_publish() and never construct this class again. + * + * @return void + */ + public function preview_css() { + $css = require __DIR__ . '/starter-content/custom-css.php'; + if ( ! empty( $css ) ) { + wp_add_inline_style( 'neve-style', $css ); + } + } + + /** + * Mirror the starter polish CSS inside the block editor canvas. + * + * Core never loads "Additional CSS" (wp_custom_css) in the post editor, so without + * this the starter pages render misaligned there (uncentered avatars, unstyled + * cards) while looking fine on the front end. Every rule is scoped to .folio-* + * classes, so the styles are inert for content that does not use them. + * + * Hooked unconditionally (the class is only constructed on fresh sites, but the + * pages outlive the fresh_site flag), gated on the polish layer actually being + * active: either the site is still fresh, or the published Additional CSS carries + * the starter marker. If the user deletes the Additional CSS, the editor follows. + * + * @param array $settings Block editor settings. + * + * @return array + */ + public static function editor_css( $settings ) { + $active = get_option( 'fresh_site' ) || false !== strpos( (string) wp_get_custom_css(), 'folio-' ); + if ( ! $active ) { + return $settings; + } + $css = require __DIR__ . '/starter-content/custom-css.php'; + if ( ! empty( $css ) ) { + if ( ! isset( $settings['styles'] ) || ! is_array( $settings['styles'] ) ) { + $settings['styles'] = array(); + } + $settings['styles'][] = array( 'css' => $css ); + } + return $settings; + } + + /** + * Run the one-time site setup after the starter content is actually published. + * + * Hooked on customize_save_after: the post metas above attach to auto-drafts (garbage + * collected if the changeset is abandoned), but custom CSS and permalinks are live, + * site-wide state and may only change once the user commits the starter content. + * + * @return void + */ + public function after_publish() { + if ( ! $this->get_published_starter_page( self::HOME_SLUG ) ) { + return; + } + $this->apply_starter_custom_css(); + $this->maybe_enable_pretty_permalinks(); + } + + /** + * Fetch a published starter page by slug. + * + * @param string $slug Page slug. + * + * @return \WP_Post|null + */ + private function get_published_starter_page( $slug ) { + $pages = get_posts( + array( + 'post_type' => 'page', + 'name' => $slug, + 'post_status' => 'publish', + 'numberposts' => 1, + ) + ); + + return empty( $pages ) ? null : $pages[0]; + } + + /** + * Allow the inline SVG icons used by the starter pages through KSES. + * + * Registered unconditionally (see Front_End::setup_theme): the imported pages keep + * their inline icons for the life of the site, so a later edit by a user without + * unfiltered_html (multisite admins, editors) must not strip them and invalidate the + * blocks. Shape elements and presentation attributes only — no scripts, hrefs, or + * event handlers. Existing entries from other plugins are merged, not replaced. + * + * @param array $tags Allowed tags. + * @param string $context KSES context. + * + * @return array + */ + public static function allow_starter_svg( $tags, $context ) { + if ( 'post' !== $context ) { + return $tags; + } + + $presentation = array( + 'fill' => true, + 'stroke' => true, + 'stroke-width' => true, + 'stroke-linecap' => true, + 'stroke-linejoin' => true, + ); + + $allow = array( + 'svg' => array_merge( + $presentation, + array( + 'width' => true, + 'height' => true, + 'viewbox' => true, + 'xmlns' => true, + 'aria-hidden' => true, + 'focusable' => true, + ) + ), + 'path' => array_merge( $presentation, array( 'd' => true ) ), + 'circle' => array_merge( + $presentation, + array( + 'cx' => true, + 'cy' => true, + 'r' => true, + ) + ), + 'rect' => array_merge( + $presentation, + array( + 'x' => true, + 'y' => true, + 'width' => true, + 'height' => true, + 'rx' => true, + ) + ), + ); + + foreach ( $allow as $tag => $attributes ) { + $existing = isset( $tags[ $tag ] ) && is_array( $tags[ $tag ] ) ? $tags[ $tag ] : array(); + $tags[ $tag ] = array_merge( $existing, $attributes ); + } + + return $tags; + } + + /** + * Enable pretty permalinks on import when the server supports them. + * + * The starter pages cross-link via path URLs (/work/, /contact/, ...), which 404 + * under plain permalinks. Mirrors the core installer behavior: only act when no + * structure is set and URL rewriting is available. + * + * @return void + */ + private function maybe_enable_pretty_permalinks() { + if ( get_option( 'permalink_structure' ) ) { + return; + } + if ( ! function_exists( 'got_url_rewrite' ) ) { + require_once ABSPATH . 'wp-admin/includes/misc.php'; + } + if ( ! got_url_rewrite() ) { + return; + } + global $wp_rewrite; + if ( ! $wp_rewrite instanceof \WP_Rewrite ) { + return; + } + $wp_rewrite->set_permalink_structure( '/%postname%/' ); + // Lazy flush: rules regenerate on the next request (flush_rewrite_rules is plugin territory). + update_option( 'rewrite_rules', '' ); + + // Verify a pretty URL actually resolves, like the core installer does. A definitive + // 404 (e.g. Apache without .htaccess rules) reverts; loopback errors are inconclusive. + $probe = $this->get_published_starter_page( self::ABOUT_SLUG ); + if ( null === $probe ) { + return; + } + $response = wp_remote_head( get_permalink( $probe ), array( 'timeout' => 3 ) ); + if ( is_wp_error( $response ) ) { + return; + } + $code = (int) wp_remote_retrieve_response_code( $response ); + if ( $code >= 400 ) { + $wp_rewrite->set_permalink_structure( '' ); + update_option( 'rewrite_rules', '' ); } } + /** + * Apply the starter content polish layer as core custom CSS. + * + * Scoped under .folio-* classes, so it only affects the starter pages. + * + * @return void + */ + private function apply_starter_custom_css() { + if ( ! function_exists( 'wp_update_custom_css_post' ) || ! function_exists( 'wp_get_custom_css' ) ) { + return; + } + $css = require __DIR__ . '/starter-content/custom-css.php'; + if ( empty( $css ) ) { + return; + } + $existing = (string) wp_get_custom_css(); + // Idempotent and non-destructive: append once, never overwrite the user's own Additional CSS. + if ( false !== strpos( $existing, 'folio-hero-media' ) ) { + return; + } + $combined = '' === trim( $existing ) ? $css : $existing . "\n\n" . $css; + wp_update_custom_css_post( $combined ); + } + /** * Return starter content definition. * @@ -121,35 +375,43 @@ public function register_listener( $post_ID, $post, $update ) { public function get() { $nav_items = [ - 'home' => [ + 'home' => [ 'type' => 'post_type', 'object' => 'page', 'object_id' => '{{' . self::HOME_SLUG . '}}', + 'title' => _x( 'Home', 'Theme starter content', 'neve' ), ], - 'page_about' => [ + 'page_about' => [ 'type' => 'post_type', 'object' => 'page', 'object_id' => '{{' . self::ABOUT_SLUG . '}}', + 'title' => _x( 'About', 'Theme starter content', 'neve' ), ], - 'page_portofolio' => [ + 'page_services' => [ 'type' => 'post_type', 'object' => 'page', - 'object_id' => '{{' . self::PORTOFOLIO_SLUG . '}}', + 'object_id' => '{{' . self::SERVICES_SLUG . '}}', + // "Services"/"Work" reuse msgids that already exist in the POT with this + // context (from the previous starter content), so no new strings are added. + 'title' => _x( 'Services', 'Theme starter content', 'neve' ), ], - 'page_project_details' => [ + 'page_work' => [ 'type' => 'post_type', 'object' => 'page', - 'object_id' => '{{' . self::PROJECT_DETAILS . '}}', + 'object_id' => '{{' . self::WORK_SLUG . '}}', + 'title' => _x( 'Work', 'Theme starter content', 'neve' ), ], - 'page_blog' => [ + 'page_blog' => [ 'type' => 'post_type', 'object' => 'page', 'object_id' => '{{' . self::BLOG_SLUG . '}}', + 'title' => _x( 'Blog', 'Theme starter content', 'neve' ), ], - 'page_contact' => [ + 'page_contact' => [ 'type' => 'post_type', 'object' => 'page', 'object_id' => '{{' . self::CONTACT . '}}', + 'title' => _x( 'Contact', 'Theme starter content', 'neve' ), ], ]; @@ -164,6 +426,11 @@ public function get() { 'object' => 'page', 'object_id' => '{{' . self::BLOG_SLUG . '}}', ], + 'page_work' => [ + 'type' => 'post_type', + 'object' => 'page', + 'object_id' => '{{' . self::WORK_SLUG . '}}', + ], 'page_about' => [ 'type' => 'post_type', 'object' => 'page', @@ -190,28 +457,27 @@ public function get() { 'page_on_front' => '{{' . self::HOME_SLUG . '}}', 'page_for_posts' => '{{' . self::BLOG_SLUG . '}}', 'show_on_front' => 'page', - 'blogname' => 'Marketing Agency', + 'blogname' => 'Default', + 'site_icon' => '{{default-icon}}', ], 'theme_mods' => require __DIR__ . '/starter-content/theme-mods.php', - 'attachments' => array( - 'featured-image-logo' => array( - 'post_title' => 'Featured Logo', - 'post_content' => 'Attachment Description', - 'post_excerpt' => 'Attachment Caption', - 'file' => 'assets/img/starter-content/logo-agency.png', - ), - ), - 'posts' => [ - self::HOME_SLUG => require __DIR__ . '/starter-content/home.php', - self::ABOUT_SLUG => require __DIR__ . '/starter-content/about.php', - self::CONTACT => require __DIR__ . '/starter-content/contact.php', - self::PORTOFOLIO_SLUG => require __DIR__ . '/starter-content/portofolio.php', - self::PROJECT_DETAILS => require __DIR__ . '/starter-content/project-details.php', - self::BLOG_SLUG => [ - 'post_name' => self::BLOG_SLUG, - 'post_type' => 'page', - 'post_title' => _x( 'Blog', 'Theme starter content', 'neve' ), + 'attachments' => [ + 'default-logo' => [ + 'post_title' => 'Default Logo', + 'file' => 'assets/img/starter-content/default-logo.png', ], + 'default-icon' => [ + 'post_title' => 'Default Icon', + 'file' => 'assets/img/starter-content/default-icon.png', + ], + ], + 'posts' => [ + self::HOME_SLUG => require __DIR__ . '/starter-content/home.php', + self::ABOUT_SLUG => require __DIR__ . '/starter-content/about.php', + self::SERVICES_SLUG => require __DIR__ . '/starter-content/services.php', + self::WORK_SLUG => require __DIR__ . '/starter-content/work.php', + self::CONTACT => require __DIR__ . '/starter-content/contact.php', + self::BLOG_SLUG => require __DIR__ . '/starter-content/blog.php', ], ]; diff --git a/inc/core/admin.php b/inc/core/admin.php index 0aa6cdec41..bc82ea5ef1 100644 --- a/inc/core/admin.php +++ b/inc/core/admin.php @@ -686,7 +686,7 @@ public function admin_notice() { echo ''; $this->dismiss_script(); - echo '
'; + echo '
'; echo '
'; $this->welcome_notice_content(); echo '
'; diff --git a/inc/core/front_end.php b/inc/core/front_end.php index 3b8475f923..82df2aed5d 100644 --- a/inc/core/front_end.php +++ b/inc/core/front_end.php @@ -65,7 +65,16 @@ public function setup_theme() { add_theme_support( 'link-color' ); add_theme_support( 'post-thumbnails' ); add_theme_support( 'service_worker', true ); - add_theme_support( 'starter-content', ( new Starter_Content() )->get() ); + if ( get_option( 'fresh_site' ) ) { + // Core only consumes starter content on fresh sites; skip building it elsewhere. + add_theme_support( 'starter-content', ( new Starter_Content() )->get() ); + } + // Keep the starter pages' inline SVG icons KSES-safe for the life of the site, + // so later edits by users without unfiltered_html don't strip and invalidate them. + add_filter( 'wp_kses_allowed_html', array( Starter_Content::class, 'allow_starter_svg' ), 10, 2 ); + // Core never loads "Additional CSS" in the block editor; mirror the starter + // polish there so the starter pages match the front end while editing. + add_filter( 'block_editor_settings_all', array( Starter_Content::class, 'editor_css' ) ); add_theme_support( 'title-tag' ); add_filter( 'script_loader_tag', array( $this, 'filter_script_loader_tag' ), 10, 2 ); add_filter( 'embed_oembed_html', array( $this, 'wrap_oembeds' ), 10, 3 ); diff --git a/screenshot.png b/screenshot.png index 438d70ec34..cced633026 100644 Binary files a/screenshot.png and b/screenshot.png differ