# Peptide Starter Theme - Conventions & Development Guide ## Naming Conventions ### PHP Functions All custom PHP functions are prefixed with `peptide_starter_`: ```php // Good function peptide_starter_get_hero_title() { } function peptide_starter_setup() { } function peptide_starter_widgets_init() { } function peptide_starter_pagination() { } // Bad function get_hero_title() { } function setup_theme() { } ``` **Pattern:** `peptide_starter_{verb}_{noun}` or `peptide_starter_get_{option}` **Common function types:** - `peptide_starter_get_*()` — Retrieve theme mod or option - `peptide_starter_{noun}_init()` — Initialization functions - `peptide_starter_is_*()` — Boolean checks - `peptide_starter_render_*()` — Output HTML ### CSS Classes All theme CSS classes are prefixed with `.ps-`: ```css /* Components */ .ps-btn /* Button component */ .ps-btn-primary /* Button variant */ .ps-btn-sm /* Button size */ .ps-card /* Card component */ .ps-badge /* Badge component */ .ps-alert-info /* Alert variant */ /* Utilities */ .ps-container /* Max-width wrapper */ .ps-pagination /* Pagination nav */ .ps-search-form /* Search form */ .ps-search-input /* Search input */ /* Regions */ .site-header /* No prefix; global region */ .site-footer /* No prefix; global region */ .site-main /* No prefix; global region */ .hero-section /* Hero region specific */ ``` **Pattern:** `.ps-{component}` for components, `.ps-{component}-{variant}` for variants **Reserved prefixes (do not use):** - `.pn-*` — Peptide News plugin - `.psa-*` — Peptide Search AI plugin - `.prab-*` — PRAutoBlogger plugin ### CSS Variables (Custom Properties) All design tokens are defined in `style.css :root`: ```css /* Colors */ --text-primary /* Main text color */ --text-secondary /* Secondary text color */ --bg-primary /* Main background */ --bg-secondary /* Secondary background */ /* Spacing (8px grid base) */ --spacing-xs: 4px /* 0.5 × base */ --spacing-sm: 8px /* 1 × base */ --spacing-md: 16px /* 2 × base */ --spacing-lg: 24px /* 3 × base */ --spacing-xl: 32px /* 4 × base */ /* Typography */ --font-sans /* Primary font family */ --font-mono /* Monospace font */ --text-h1 /* H1 size */ --text-h1-weight /* H1 weight */ ``` **Usage:** ```css .ps-card { padding: var(--spacing-md); color: var(--text-primary); } ``` ### Template Part Naming Template parts in `template-parts/` follow WordPress convention: ``` template-parts/content.php /* Default loop item */ template-parts/content-{post-type}.php /* CPT-specific */ template-parts/content-none.php /* Empty state */ template-parts/{section}-{name}.php /* Specific parts (if added) */ ``` **Calling template parts:** ```php get_template_part( 'template-parts/content', get_post_type() ); get_template_part( 'template-parts/content', 'none' ); ``` ### Hook Names Custom hooks use the `peptide_starter_` prefix: ```php // Filters apply_filters( 'peptide_starter_show_newsletter', true ); // Actions (if any added in future) do_action( 'peptide_starter_hero_before' ); ``` ### File Organization - **Root:** Theme core files (functions.php, header.php, footer.php, etc.) - **assets/js/:** Client-side scripts only; no bundling - **assets/css/:** (None; all CSS in style.css) - **languages/:** Translation files - **template-parts/:** Reusable template parts ## Step-by-Step Guides ### How to Add a New Template **Scenario:** Create a custom landing page template 1. Create file: `landing-{name}.php` ```php
Template dropdown 4. Test the template: - Create/edit a page and select the template - Verify hero, dark mode toggle, footer all appear correctly **Best practices:** - Always include `get_header()` and `get_footer()` - Wrap main content in `
` - Use `.ps-container` for consistent max-width - Use existing component classes (`.ps-card`, `.ps-btn`, etc.) - Keep templates under 150 lines; extract complex parts to `template-parts/` ### How to Add a New Plugin Integration **Scenario:** Integrate a new plugin (e.g., "Research Database") via shortcode 1. **In front-page.php**, add a conditional shortcode block: ```php

``` 2. **In functions.php**, optionally add inline overrides if plugin CSS needs adjustment: ```php function peptide_starter_plugin_overrides() { wp_add_inline_style( 'peptide-starter-style', ' /* Override plugin styles here */ .rdb-card { /* example */ } ' ); } add_action( 'wp_enqueue_scripts', 'peptide_starter_plugin_overrides', 99 ); ``` 3. **Document the integration** in CLAUDE.md: - Plugin namespace (e.g., `.rdb-*`) - Shortcode name and parameters - Expected styling classes 4. **If plugin needs dark mode coordination:** - Ask plugin author to listen to `themechange` event (see ARCHITECTURE.md) - Or have plugin read `html[data-theme]` attribute - Provide plugin with CSS custom properties: `getComputedStyle(document.documentElement).getPropertyValue('--text-primary')` 5. **Test:** - Activate plugin and visit front page - Verify shortcode renders - Toggle dark mode; verify plugin responds - Deactivate plugin; verify page still renders (fallback gracefully) **Important:** Always wrap shortcodes in `shortcode_exists()` checks so theme doesn't break if plugin is missing. ### How to Add a Performance Policy Rule **Scenario:** Dequeue or transform an asset on certain page conditions Performance optimizations live in `inc/perf-asset-policy.php` and hook into WordPress's enqueue/style-loading pipeline. The module supports conditional dequeue (WC, Elementor, USMI), font weight slimming, preconnect hints, and script deferral. 1. **For conditional dequeue**, add a block in `peptide_starter_perf_dequeue_plugin_assets()`: ```php if ( /* your condition */ ) { $handles = apply_filters( 'peptide_starter_perf_yourplugin_handles', array( 'handle-1', 'handle-2' ) ); foreach ( $handles as $handle ) { wp_dequeue_style( $handle ); // or wp_dequeue_script } } ``` 2. **For style-src rewrites** (e.g., URL parameter slimming), extend `peptide_starter_perf_slim_google_fonts()` with a new loop iteration: ```php foreach ( $font_weights_config as $config_family => $weights ) { if ( 0 === strcasecmp( $family, $config_family ) ) { // Rewrite and return } } ``` 3. **For preconnect hints**, add URLs to the filter in `peptide_starter_perf_resource_hints()`: ```php $font_urls = apply_filters( 'peptide_starter_perf_font_preconnect_urls', array( 'https://fonts.googleapis.com', 'https://fonts.gstatic.com' ) ); ``` 4. **For script deferral**, add a new handle check in `peptide_starter_perf_defer_cookie_notice()`: ```php if ( 'my-script-handle' !== $handle ) { return $tag; } $tag = str_replace( '