Initial commit: WeedOps WordPress theme

Custom theme for weedops.site — front page, header, footer,
functions, styles, and images.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
John Mizerek 2026-03-17 19:28:20 -07:00
commit 2db3c63e5a
7 changed files with 1582 additions and 0 deletions

15
footer.php Normal file
View file

@ -0,0 +1,15 @@
</main>
<footer class="site-footer">
<div class="container">
<div class="footer-content">
<span class="footer-location">WeedOps &middot; Los Angeles, California</span>
<span class="footer-copy">&copy; <?php echo date('Y'); ?> WeedOps</span>
</div>
<p class="footer-disclaimer">This is a confidential investor overview. Not a public offering.</p>
</div>
</footer>
<?php wp_footer(); ?>
</body>
</html>

341
front-page.php Normal file
View file

@ -0,0 +1,341 @@
<?php
/**
* Template Name: Home
* Home page investor-facing landing page
*/
get_header();
$form_result = weedops_get_form_result();
?>
<!-- Hero -->
<section class="hero">
<div class="container">
<div class="hero-content">
<p class="section-label">A Confidential Investor Overview</p>
<h1>Your home. Your plants.<br>Our expertise. <span class="green">Your check.</span></h1>
<p class="subhead">California adults can legally grow cannabis at home. Almost none of them do. We built the company that changes that and makes money at every step of the process.</p>
<p class="hero-note">$500,000 Convertible Notes Private Party Round Now Open</p>
<div class="hero-ctas">
<a href="#deck" class="btn btn-primary">Request the Deck</a>
<a href="#opportunity" class="btn btn-secondary">Learn How It Works</a>
</div>
</div>
</div>
</section>
<!-- The Opportunity -->
<section class="opportunity" id="opportunity">
<div class="container">
<p class="section-label">The Opportunity</p>
<div class="opportunity-content">
<h2>A category that doesn't exist yet. We're defining it.</h2>
<p>Millions of California adults consume cannabis. A fraction grow it. The gap isn't desire — it's <span class="emphasis">expertise, equipment, and time</span>. WeedOps is the first company to solve all three with a fully managed, fully licensed, recurring service model.</p>
<p>This is not a dispensary. Not a delivery app. Not a brand.</p>
<p class="emphasis" style="color: var(--white);">This is infrastructure.</p>
</div>
</div>
</section>
<!-- The Problem -->
<section id="problem">
<div class="container">
<p class="section-label">The Problem</p>
<h2>Many adults want craft cannabis.<br>Almost none of them grow it.</h2>
<div class="problem-grid">
<div class="problem-card">
<h3>The expertise gap</h3>
<p>A successful home grow requires strain knowledge, lighting science, training techniques, and timing. Most adults never get past seed-to-sprout.</p>
</div>
<div class="problem-card">
<h3>The time barrier</h3>
<p>Daily monitoring. Biweekly maintenance. Processing at harvest. A full-time job on top of your actual job.</p>
</div>
<div class="problem-card">
<h3>The equipment wall</h3>
<p>A quality grow tent setup costs $800 - $2,000 upfront before you've grown a single gram. Most people quit before they start.</p>
</div>
</div>
</div>
</section>
<!-- The Solution -->
<section class="opportunity" id="model">
<div class="container">
<p class="section-label">The Solution</p>
<h2>We bring the entire operation to your home.</h2>
<p class="subhead">WeedOps handles everything equipment, setup, clones, biweekly visits, harvesting, and processing. You provide the space. We provide the rest.</p>
<div class="solution-features">
<div class="solution-feature">
<h3>Full equipment setup</h3>
<p>We bring it. We install it. All of it.</p>
</div>
<div class="solution-feature">
<h3>Expert grow management</h3>
<p>Biweekly site visits.</p>
</div>
<div class="solution-feature">
<h3>Monthly product supply</h3>
<p>Your share, delivered.</p>
</div>
<div class="solution-feature">
<h3>Revenue share check</h3>
<p>Every harvest cycle.</p>
</div>
</div>
</div>
</section>
<!-- How It Works -->
<section id="how-it-works">
<div class="container">
<p class="section-label">How It Works</p>
<h2>Six steps from empty bedroom to monthly check.</h2>
<div class="steps-grid">
<div class="step-card">
<span class="step-number">01</span>
<h3>Register</h3>
<p>Tell us about your space and household. We send a proposal.</p>
</div>
<div class="step-card">
<span class="step-number">02</span>
<h3>Setup Day</h3>
<p>We arrive with all equipment. Full grow tent installed, clones planted.</p>
</div>
<div class="step-card">
<span class="step-number">03</span>
<h3>Biweekly Visits</h3>
<p>Our tech stops by every two weeks maintenance, monitoring, training if desired.</p>
</div>
<div class="step-card">
<span class="step-number">04</span>
<h3>Harvest</h3>
<p>Every ~9 weeks. We take the product for processing. You watch if you want, get an estimate.</p>
</div>
<div class="step-card">
<span class="step-number">05</span>
<h3>Your Supply</h3>
<p>Next week: 30-day supply for every registered adult flower, edible, cart, extract. You choose your format.</p>
</div>
<div class="step-card">
<span class="step-number">06</span>
<h3>Your Check</h3>
<p>Remaining product processed and sold on consignment. Revenue share check every cycle.</p>
</div>
</div>
</div>
</section>
<!-- What You Get as a WeedOpper -->
<section class="opportunity">
<div class="container">
<p class="section-label">What You Get as a WeedOpper</p>
<h2>You had a hand in growing it. That's the whole point.</h2>
<div class="weedopper-stats">
<div class="stat-card">
<div class="stat-value">$0</div>
<div class="stat-label">Out of Pocket</div>
<p>Refundable $500 deposit is the only ask. Equipment, clones, nutrients all on us.</p>
</div>
<div class="stat-card">
<div class="stat-value">30</div>
<div class="stat-label">Day Supply / Mo</div>
<p>Every registered adult in the home gets their full monthly supply, first.</p>
</div>
<div class="stat-card">
<div class="stat-value" style="font-size: clamp(1.5rem, 3vw, 2rem);">Revenue Share</div>
<div class="stat-label">Per Harvest</div>
<p>Your cut from processed excess, every ~9-week cycle. Passive income.</p>
</div>
</div>
<p class="text-center" style="color: var(--gray);">Optional webcam inside your grow. Video consultations. And a service you can learn to run yourself.</p>
</div>
</section>
<!-- The Campus -->
<section class="opportunity" id="campus">
<div class="container">
<p class="section-label">The WeedOps Campus</p>
<h2>The home service is the foundation. The Superstore is the destination.</h2>
<p class="subhead" style="max-width: 800px; margin-bottom: 48px;">This isn't a boutique. It's a floor. WeedOps Superstore is where serious growers come to outfit an operation flat carts for 50-pound soil runs, shopping carts for accessories and nutrients, a full retail floor with every brand, format, and supply a home grower or commercial operation needs. Think Home Depot. Now think cannabis. Nobody has built it. That's the point.</p>
<div class="campus-grid">
<div class="campus-card">
<h3>Processing</h3>
<p>Glass wall. Watch your product get made. Like a brewery.</p>
</div>
<div class="campus-card">
<h3>Retail Store</h3>
<p>WeedOps product + curated shelf. You know what's in it.</p>
</div>
<div class="campus-card">
<h3>Farmers Market</h3>
<p>Third-party growers. Community. Foot traffic engine.</p>
</div>
<div class="campus-card">
<h3>2nd Floor</h3>
<p>Indoor grow suites for lease. No home required.</p>
</div>
<div class="campus-card">
<h3>Rooftop</h3>
<p>Outdoor grow plots for lease. Seasonal. Instagrammable.</p>
</div>
<div class="campus-card">
<h3>Supply Shop</h3>
<p>All supplies available onsite. Everything a grower needs, where growers already are.</p>
</div>
<div class="campus-card">
<h3>Superstore Floor</h3>
<p>Flat carts. Shopping carts. Bulk supply. Full equipment. The complete grow operation, ready to walk out the door.</p>
</div>
</div>
<p class="campus-tagline">The cannabis superstore. Finally.</p>
</div>
</section>
<!-- Revenue Streams -->
<section>
<div class="container">
<p class="section-label">Revenue Streams</p>
<h2>This is not a single-product cannabis company.</h2>
<div class="streams-grid">
<div class="stream-card">
<span class="stream-tag core">Core</span>
<h3>Service Contracts</h3>
<p>Monthly fee per home grow site. Predictable, recurring, scalable.</p>
</div>
<div class="stream-card">
<span class="stream-tag margin">Margin</span>
<h3>Processing</h3>
<p>Licensed processing of all harvested product.</p>
</div>
<div class="stream-card">
<span class="stream-tag margin">Margin</span>
<h3>Distribution</h3>
<p>Licensed distribution of processed product to retail.</p>
</div>
<div class="stream-card">
<span class="stream-tag campus">Campus</span>
<h3>Campus Retail</h3>
<p>WeedOps-branded product on our own shelf.</p>
</div>
<div class="stream-card">
<span class="stream-tag campus">Campus</span>
<h3>Grow Suite Rental</h3>
<p>Second floor and rooftop leasable grow spaces.</p>
</div>
<div class="stream-card">
<span class="stream-tag campus">Campus</span>
<h3>Supply Sales</h3>
<p>Equipment, nutrients, accessories sold where growers already are.</p>
</div>
</div>
</div>
</section>
<!-- Why Now -->
<section class="opportunity">
<div class="container">
<p class="section-label">Why Now. Why LA. Why Us.</p>
<h2>First mover in distributed home cultivation services.</h2>
<div class="why-grid">
<div class="why-card">
<h3>Greater LA launch</h3>
<p>5M+ adults in the LA metro. Cannabis-normalized culture. Word travels fast in every neighborhood on the westside.</p>
</div>
<div class="why-card">
<h3>Fully licensed</h3>
<p>Every required California license cultivation, processing, distribution. 100% compliant. Taxes paid. Federal/state tension is real and acknowledged; our structure keeps commercial activity entirely within the state-licensed chain.</p>
</div>
<div class="why-card">
<h3>Referral flywheel</h3>
<p>Happy growers share what they grew. That's the whole pitch deck at a dinner party.</p>
</div>
<div class="why-card">
<h3>First mover edge</h3>
<p>Nobody has built this. The managed home grow service category doesn't exist yet. We're defining it.</p>
</div>
</div>
</div>
</section>
<!-- The Ask -->
<section class="ask-section" id="ask">
<div class="container">
<p class="section-label">The Ask</p>
<div class="ask-headline">
<div class="amount">$500,000</div>
<p class="terms">Convertible Notes &middot; Private Party &middot; No VC</p>
<p class="terms-detail">Individual investors only &middot; No institutional money</p>
</div>
<div class="use-of-funds">
<div class="fund-item">
<div class="fund-percent">40%</div>
<h3>Licensing & Legal</h3>
<p>All required CA licenses. Cannabis counsel.</p>
</div>
<div class="fund-item">
<div class="fund-percent">30%</div>
<h3>First Cohort Ops</h3>
<p>Equipment for first 25 sites. Clones. Setup labor.</p>
</div>
<div class="fund-item">
<div class="fund-percent">20%</div>
<h3>Processing Setup</h3>
<p>Licensed facility, equipment, first cycle.</p>
</div>
<div class="fund-item">
<div class="fund-percent">10%</div>
<h3>Technology & Brand</h3>
<p>Customer portal. Ops dashboard. Marketing.</p>
</div>
</div>
</div>
</section>
<!-- Deck Request CTA -->
<section class="cta-section" id="deck">
<div class="container">
<?php if ($form_result === true): ?>
<div class="form-success">
<h3>Request received.</h3>
<p>We'll send the full investor overview to your email shortly.</p>
</div>
<?php else: ?>
<h2>Interested in the round?</h2>
<p class="subhead">Request the full investor overview. This is a confidential offering to individual investors.</p>
<?php if (is_string($form_result)): ?>
<div class="form-error"><?php echo esc_html($form_result); ?></div>
<?php endif; ?>
<form class="deck-form" method="post" action="#deck">
<?php wp_nonce_field('weedops_deck_request'); ?>
<input type="hidden" name="weedops_deck_request" value="1">
<div class="form-row">
<div class="form-group">
<label for="name">Name</label>
<input type="text" id="name" name="name" placeholder="Your name" required>
</div>
<div class="form-group">
<label for="email">Email</label>
<input type="email" id="email" name="email" placeholder="you@email.com" required>
</div>
</div>
<div class="form-group">
<label for="note">Anything you'd like us to know (optional)</label>
<textarea id="note" name="note" rows="3" placeholder="How you heard about us, questions, etc."></textarea>
</div>
<?php if (WEEDOPS_TURNSTILE_SITE_KEY): ?>
<div class="cf-turnstile mb-24" data-sitekey="<?php echo WEEDOPS_TURNSTILE_SITE_KEY; ?>" data-theme="dark"></div>
<?php endif; ?>
<button type="submit" class="btn btn-primary" style="width: 100%;">Request the Deck</button>
</form>
<?php endif; ?>
</div>
</section>
<?php get_footer(); ?>

130
functions.php Normal file
View file

@ -0,0 +1,130 @@
<?php
/**
* WeedOps Theme Functions
*/
// Theme setup
function weedops_setup() {
add_theme_support('title-tag');
add_theme_support('post-thumbnails');
add_theme_support('html5', array('search-form', 'comment-form', 'comment-list', 'gallery', 'caption'));
}
add_action('after_setup_theme', 'weedops_setup');
// Enqueue styles
function weedops_scripts() {
wp_enqueue_style('weedops-style', get_stylesheet_uri(), array(), '1.0');
}
add_action('wp_enqueue_scripts', 'weedops_scripts');
// Remove WordPress junk from head
remove_action('wp_head', 'wp_generator');
remove_action('wp_head', 'wlwmanifest_link');
remove_action('wp_head', 'rsd_link');
remove_action('wp_head', 'wp_shortlink_wp_head');
remove_action('wp_head', 'rest_output_link_wp_head');
remove_action('wp_head', 'wp_oembed_add_discovery_links');
remove_action('wp_head', 'print_emoji_detection_script', 7);
remove_action('wp_print_styles', 'print_emoji_styles');
// Remove WP block library CSS (not using Gutenberg blocks)
function weedops_remove_block_css() {
wp_dequeue_style('wp-block-library');
wp_dequeue_style('wp-block-library-theme');
wp_dequeue_style('classic-theme-styles');
wp_dequeue_style('global-styles');
}
add_action('wp_enqueue_scripts', 'weedops_remove_block_css', 100);
// Disable Gutenberg for pages
function weedops_disable_gutenberg($current_status, $post_type) {
if ($post_type === 'page') return false;
return $current_status;
}
add_filter('use_block_editor_for_post_type', 'weedops_disable_gutenberg', 10, 2);
// Cloudflare Turnstile (for deck request form)
define('WEEDOPS_TURNSTILE_SITE_KEY', '');
define('WEEDOPS_TURNSTILE_SECRET_KEY', '');
function weedops_turnstile_scripts() {
if (WEEDOPS_TURNSTILE_SITE_KEY) {
wp_enqueue_script('turnstile', 'https://challenges.cloudflare.com/turnstile/v0/api.js', array(), null, true);
}
}
add_action('wp_enqueue_scripts', 'weedops_turnstile_scripts');
function weedops_verify_turnstile($token) {
if (!WEEDOPS_TURNSTILE_SECRET_KEY || empty($token)) return !WEEDOPS_TURNSTILE_SECRET_KEY;
$response = wp_remote_post('https://challenges.cloudflare.com/turnstile/v0/siteverify', array(
'body' => array(
'secret' => WEEDOPS_TURNSTILE_SECRET_KEY,
'response' => $token,
'remoteip' => $_SERVER['REMOTE_ADDR'] ?? '',
),
));
if (is_wp_error($response)) return false;
$body = json_decode(wp_remote_retrieve_body($response), true);
return !empty($body['success']);
}
// Handle deck request form submission (early, before headers sent)
function weedops_handle_deck_request_init() {
if (!isset($_POST['weedops_deck_request'])) return;
// Verify nonce
if (!wp_verify_nonce($_POST['_wpnonce'] ?? '', 'weedops_deck_request')) {
set_transient('weedops_form_error_' . $_SERVER['REMOTE_ADDR'], 'Invalid request.', 60);
wp_redirect(home_url('/#deck'));
exit;
}
// Verify Turnstile if configured
if (WEEDOPS_TURNSTILE_SITE_KEY && !weedops_verify_turnstile($_POST['cf-turnstile-response'] ?? '')) {
set_transient('weedops_form_error_' . $_SERVER['REMOTE_ADDR'], 'Verification failed. Please try again.', 60);
wp_redirect(home_url('/#deck'));
exit;
}
$name = sanitize_text_field($_POST['name'] ?? '');
$email = sanitize_email($_POST['email'] ?? '');
$note = sanitize_textarea_field($_POST['note'] ?? '');
if (empty($name) || empty($email)) {
set_transient('weedops_form_error_' . $_SERVER['REMOTE_ADDR'], 'Name and email are required.', 60);
wp_redirect(home_url('/#deck'));
exit;
}
// Send notification email
$to = 'john@weedops.site';
$subject = 'WeedOps Deck Request: ' . $name;
$body = "Name: {$name}\nEmail: {$email}\n\nNote:\n{$note}";
$headers = array('Reply-To: ' . $name . ' <' . $email . '>');
wp_mail($to, $subject, $body, $headers);
set_transient('weedops_form_success_' . $_SERVER['REMOTE_ADDR'], true, 60);
wp_redirect(home_url('/#deck'));
exit;
}
add_action('template_redirect', 'weedops_handle_deck_request_init');
// Get form result from transient (after redirect)
function weedops_get_form_result() {
$ip = $_SERVER['REMOTE_ADDR'];
$success = get_transient('weedops_form_success_' . $ip);
if ($success) {
delete_transient('weedops_form_success_' . $ip);
return true;
}
$error = get_transient('weedops_form_error_' . $ip);
if ($error) {
delete_transient('weedops_form_error_' . $ip);
return $error;
}
return null;
}

33
header.php Normal file
View file

@ -0,0 +1,33 @@
<!DOCTYPE html>
<html <?php language_attributes(); ?>>
<head>
<meta charset="<?php bloginfo('charset'); ?>">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="description" content="WeedOps — managed home cannabis cultivation. A confidential investor overview.">
<meta name="robots" content="noindex, nofollow">
<link rel="icon" type="image/svg+xml" href="<?php echo get_template_directory_uri(); ?>/images/favicon.svg">
<?php wp_head(); ?>
</head>
<body <?php body_class(); ?>>
<header class="site-header">
<nav class="nav-container">
<a href="<?php echo home_url(); ?>" class="logo">Weed<span>Ops</span></a>
<button class="nav-toggle" aria-label="Toggle navigation" onclick="document.querySelector('.nav-links').classList.toggle('active')">
<span></span>
<span></span>
<span></span>
</button>
<ul class="nav-links">
<li><a href="<?php echo home_url('/#opportunity'); ?>">The Opportunity</a></li>
<li><a href="<?php echo home_url('/#model'); ?>">The Model</a></li>
<li><a href="<?php echo home_url('/#campus'); ?>">Campus</a></li>
<li><a href="<?php echo home_url('/#ask'); ?>">The Ask</a></li>
<li><a href="<?php echo home_url('/#deck'); ?>" class="btn-nav">Request the Deck</a></li>
</ul>
</nav>
</header>
<main>

4
images/favicon.svg Normal file
View file

@ -0,0 +1,4 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32">
<rect width="32" height="32" rx="6" fill="#0a0a0a"/>
<text x="16" y="22" text-anchor="middle" font-family="system-ui, sans-serif" font-weight="700" font-size="16" fill="#22c55e">W</text>
</svg>

After

Width:  |  Height:  |  Size: 259 B

26
index.php Normal file
View file

@ -0,0 +1,26 @@
<?php
/**
* Default template fallback redirect to home
*/
get_header();
?>
<section style="padding-top: calc(var(--nav-height) + 80px); padding-bottom: 64px;">
<div class="container">
<h1><?php the_title(); ?></h1>
</div>
</section>
<section>
<div class="container">
<?php
if (have_posts()) :
while (have_posts()) : the_post();
the_content();
endwhile;
endif;
?>
</div>
</section>
<?php get_footer(); ?>

1033
style.css Normal file

File diff suppressed because it is too large Load diff