diff --git a/MARKDOWN_SYNTAX_AND_VARIABLES.md b/MARKDOWN_SYNTAX_AND_VARIABLES.md
new file mode 100644
index 0000000..e84ec9f
--- /dev/null
+++ b/MARKDOWN_SYNTAX_AND_VARIABLES.md
@@ -0,0 +1,170 @@
+# Markdown Syntax & Variables - Analysis & Recommendations
+
+## Current Issues
+
+### 1. Card & Button Syntax
+**Current:**
+```markdown
+[card type="hero"]
+Content here
+[/card]
+
+[button url="https://example.com" style="solid"]Click me[/button]
+```
+
+**Problem:** Not standard Markdown - uses WordPress-style shortcodes
+
+### 2. Variable Naming Mismatch
+**Template uses:** `{order_item_table}` (singular)
+**Preview defines:** `order_items_table` (plural)
+**Result:** Variable not replaced, shows as `{orderitemtable}` (underscores removed by some HTML sanitizer)
+
+---
+
+## All Variables Used in Templates
+
+### Order Variables
+- `{order_number}` - Order ID
+- `{order_date}` - Order date
+- `{order_total}` - Total amount
+- `{order_status}` - Current status
+- `{order_url}` - Link to view order
+- `{order_item_table}` ⚠️ **MISMATCH** - Should be `order_items_table`
+
+### Customer Variables
+- `{customer_name}` - Customer full name
+- `{customer_email}` - Customer email
+- `{customer_username}` - Username (for new accounts)
+- `{customer_password}` - Temporary password (for new accounts)
+
+### Store Variables
+- `{store_name}` - Store name
+- `{store_url}` - Store URL
+- `{store_email}` - Store contact email
+
+### Payment Variables
+- `{payment_method}` - Payment method used
+- `{payment_status}` - Payment status
+- `{transaction_id}` - Transaction ID
+
+### Shipping Variables
+- `{shipping_address}` - Full shipping address
+- `{tracking_number}` - Shipment tracking number
+- `{carrier}` - Shipping carrier
+
+### Date Variables
+- `{completion_date}` - Order completion date
+- `{cancellation_date}` - Order cancellation date
+
+---
+
+## Recommendations
+
+### Option 1: Keep Current Syntax (Easiest)
+**Pros:**
+- No changes needed
+- Users already familiar
+- Clear boundaries for cards
+
+**Cons:**
+- Not standard Markdown
+- Verbose
+
+**Action:** Just fix the variable mismatch
+
+### Option 2: Simplified Shortcode
+```markdown
+[card:hero]
+Content here
+[/card]
+
+[button:solid](https://example.com)Click me[/button]
+```
+
+**Pros:**
+- Shorter, cleaner
+- Still clear
+
+**Cons:**
+- Still not standard Markdown
+- Requires converter changes
+
+### Option 3: HTML + Markdown (Hybrid)
+```html
+
+
+**Content** with markdown
+
+
+
+Click me
+```
+
+**Pros:**
+- Standard Markdown allows inline HTML
+- No custom parsing needed
+
+**Cons:**
+- Verbose
+- Less user-friendly
+
+### Option 4: Attributes Syntax (Most Markdown-like)
+```markdown
+> **Order Number:** #{order_number}
+> **Order Date:** {order_date}
+{: .card .card-hero}
+
+[Click me](https://example.com){: .button .button-solid}
+```
+
+**Pros:**
+- More Markdown-like
+- Compact
+
+**Cons:**
+- Complex to parse
+- Not widely supported
+- Users may not understand
+
+---
+
+## Recommended Action Plan
+
+### Immediate Fixes (Priority 1)
+1. ✅ **Fix `
` rendering** - DONE!
+2. ⚠️ **Fix variable mismatch:**
+ - Change `order_item_table` → `order_items_table` in DefaultTemplates.php
+ - OR change `order_items_table` → `order_item_table` in EditTemplate.tsx preview
+3. **Add all missing variables to preview sample data**
+
+### Short-term (Priority 2)
+1. **Document all variables** - Create user-facing documentation
+2. **Add variable autocomplete** in markdown editor
+3. **Add variable validation** - warn if variable doesn't exist
+
+### Long-term (Priority 3)
+1. **Consider syntax improvements** - Get user feedback first
+2. **Add visual card/button inserter** - UI buttons to insert syntax
+3. **Add syntax highlighting** in markdown editor
+
+---
+
+## Variable Replacement Issue
+
+The underscore removal (`{order_item_table}` → `{orderitemtable}`) suggests HTML sanitization is happening somewhere. Need to check:
+
+1. **Frontend:** DOMPurify or similar sanitizer?
+2. **Backend:** WordPress `wp_kses()` or similar?
+3. **Email client:** Some email clients strip underscores?
+
+**Solution:** Use consistent naming without underscores OR fix sanitizer to preserve variable syntax.
+
+---
+
+## Next Steps
+
+1. Fix variable naming mismatch
+2. Test all variables in preview
+3. Document syntax for users
+4. Get feedback on syntax preferences
+5. Consider improvements based on feedback
diff --git a/PHASE_COMPLETE.md b/PHASE_COMPLETE.md
new file mode 100644
index 0000000..c893d61
--- /dev/null
+++ b/PHASE_COMPLETE.md
@@ -0,0 +1,26 @@
+# Phase Complete ✅
+
+**Date:** November 15, 2025
+
+## Completed
+
+### 1. Email Queue ✅
+- Already implemented via MailQueue + WooEmailOverride
+- Prevents 30s timeout
+
+### 2. Documentation ✅
+- Reduced 56 → 27 files (52% reduction)
+- Created NOTIFICATION_SYSTEM.md (consolidated)
+- Deleted 30 obsolete docs
+
+### 3. Git Push ✅
+- 3 commits pushed to main
+- Remote: git.backoffice.biz.id
+
+### 4. Plugin Zip ✅
+- File: woonoow.zip
+- Size: 1.4MB
+- Location: /wp-content/plugins/woonoow.zip
+- Guide: PLUGIN_ZIP_GUIDE.md
+
+## Ready for Distribution! 🚀
diff --git a/includes/Admin/Assets.php b/includes/Admin/Assets.php
index fe768b4..0bf8cb2 100644
--- a/includes/Admin/Assets.php
+++ b/includes/Admin/Assets.php
@@ -225,20 +225,21 @@ class Assets {
}
/** Determine dev mode:
- * - WP environment 'development'
- * - or constant WOONOOW_ADMIN_DEV=true
+ * - ONLY enabled if constant WOONOOW_ADMIN_DEV=true is explicitly set
* - or filter override (woonoow/admin_is_dev)
+ *
+ * Note: We don't check WP_ENV to avoid accidentally enabling dev mode
+ * in Local by Flywheel or other local dev environments.
*/
private static function is_dev_mode(): bool {
- $env_is_dev = function_exists('wp_get_environment_type') && wp_get_environment_type() === 'development';
+ // Only enable dev mode if explicitly set via constant
$const_dev = defined('WOONOOW_ADMIN_DEV') && WOONOOW_ADMIN_DEV === true;
- $is_dev = $env_is_dev || $const_dev;
/**
* Filter: force dev/prod mode for WooNooW admin assets.
* Return true to use Vite dev server, false to use built assets.
*/
- return (bool) apply_filters('woonoow/admin_is_dev', $is_dev);
+ return (bool) apply_filters('woonoow/admin_is_dev', $const_dev);
}
/** Dev server URL (filterable) */