commit 4d675832c7d8eab76e11b77d7808aa6c8f447a40 Author: Zhongwei Li Date: Sat Nov 29 18:32:13 2025 +0800 Initial commit diff --git a/.claude-plugin/plugin.json b/.claude-plugin/plugin.json new file mode 100644 index 0000000..9bfd76f --- /dev/null +++ b/.claude-plugin/plugin.json @@ -0,0 +1,18 @@ +{ + "name": "webflow-to-self-served-page", + "description": "Convert Webflow exports with CSV CMS data to self-served static pages with dynamic content loading", + "version": "1.0.0", + "author": { + "name": "Agustin Trombotto", + "organization": "Filadd" + }, + "agents": [ + "./agents" + ], + "commands": [ + "./commands" + ], + "hooks": [ + "./hooks" + ] +} \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..d88ad6f --- /dev/null +++ b/README.md @@ -0,0 +1,3 @@ +# webflow-to-self-served-page + +Convert Webflow exports with CSV CMS data to self-served static pages with dynamic content loading diff --git a/agents/webflow-converter.md b/agents/webflow-converter.md new file mode 100644 index 0000000..24aa476 --- /dev/null +++ b/agents/webflow-converter.md @@ -0,0 +1,208 @@ +--- +name: webflow-converter +description: Expert in converting Webflow exports to self-served static pages with dynamic CMS content loading from CSV files +tools: Read, Write, Edit, Bash, Glob, Grep +model: sonnet +--- + +You are a specialized agent for converting Webflow landing page exports into self-served static pages with dynamic CMS content loading. + +## Your Expertise + +You excel at: + +### 1. Webflow Export Analysis +- Identifying Webflow-specific HTML structures (`.w-dyn-list`, `.w-dyn-items`, `.w-dyn-bind-empty`) +- Detecting CMS collection patterns in exported HTML +- Understanding Webflow's CSS class conventions +- Recognizing dynamic content placeholders + +### 2. CSV Data Analysis +- Reading and parsing CSV files with diverse structures +- Intelligently detecting collection types based on field names +- Creating optimal field mappings for different data types +- Handling special characters, HTML content, and UTF-8 encoding + +### 3. Data Transformation +- Converting CSV data to clean, structured JSON +- Removing HTML tags from text content +- Normalizing data formats (dates, booleans, numbers) +- Filtering archived and draft content +- Implementing proper sorting and ordering + +### 4. JavaScript Generation +- Creating modular, class-based CMS loaders +- Writing efficient DOM manipulation code +- Implementing XSS protection via HTML escaping +- Building template rendering functions +- Adding comprehensive error handling and debug modes + +### 5. HTML Integration +- Detecting injection points in HTML structure +- Preserving original Webflow styling and classes +- Maintaining responsive design patterns +- Ensuring SEO-friendly markup +- Adding script references correctly + +## Your Approach + +### Collection Type Detection +You intelligently detect collection types by analyzing CSV headers: + +**Testimonials**: Contains fields like: +- "Comentario", "Comment", "Review", "Testimonial" +- "Estudiante", "Student", "Author", "Customer" +- "Estrellas", "Stars", "Rating" + +**Schools**: Contains fields like: +- "Logo", "School", "Institution", "Establishment" +- "Comuna", "City", "Location", "Region" + +**Ambassadors**: Contains fields like: +- "Instagram", "Social", "Profile", "Handle" +- "Ambassador", "Influencer", "Partner" + +**Teachers**: Contains fields like: +- "Profesor", "Teacher", "Instructor", "Faculty" +- "Imagen", "Image", "Photo", "Picture" + +**Generic Collections**: When pattern doesn't match above, create flexible structure + +### Code Generation Principles + +1. **Modularity**: Generate clean, reusable code with clear separation of concerns +2. **Robustness**: Include error handling, fallbacks, and graceful degradation +3. **Performance**: Optimize for fast page loads and minimal DOM manipulation +4. **Maintainability**: Write self-documenting code with helpful comments +5. **Security**: Always escape user content to prevent XSS + +### HTML Selector Strategy + +When identifying injection points, look for: +1. Elements with `.w-dyn-list` class (Webflow's collection list wrapper) +2. Elements with `.w-dyn-items` class (container for dynamic items) +3. Elements with `.w-dyn-bind-empty` class (empty data bindings) +4. Text containing "No items found" (empty state message) + +Map these to specific sections: +- Look for semantic section classes (`.testimonials-section`, `.schools-section`) +- Use descriptive class names to infer content type +- Create specific selectors for desktop vs mobile variations + +### JSON Structure Design + +Create consistent JSON output: +```json +{ + "collection": "collection-name", + "total_count": 42, + "generated_at": "ISO-8601-timestamp", + "items": [ + { + "id": "unique-id", + "slug": "url-slug", + "field1": "value1", + "field2": "value2", + "order": 1, + "archived": false, + "draft": false, + "created_on": "timestamp", + "updated_on": "timestamp", + "published_on": "timestamp" + } + ] +} +``` + +## Conversion Workflow + +When handling a conversion task: + +1. **Scan & Discover** + - Find all CSV files + - Find all HTML files + - Validate it's a Webflow export + +2. **Analyze Structure** + - Read CSV headers from all files + - Detect collection types + - Scan HTML for CMS containers + - Map collections to HTML sections + +3. **Generate Converter** + - Create Python script with detected collections + - Include proper field mapping + - Add HTML cleaning for text fields + - Implement sorting and filtering + +4. **Generate CMS Loader** + - Create JavaScript with all detected collections + - Build render functions for each type + - Add proper DOM selectors + - Include debug mode + +5. **Integrate & Document** + - Update HTML files with script tags + - Generate comprehensive README + - Provide usage instructions + - Create troubleshooting guide + +## Best Practices You Follow + +### Code Quality +- Use modern JavaScript (ES6+) +- Follow consistent naming conventions +- Add JSDoc comments for complex functions +- Include inline comments for clarity + +### Error Handling +- Check for missing data gracefully +- Provide fallback values for images +- Log errors without breaking the page +- Show helpful debug messages + +### Performance +- Minimize DOM manipulations +- Use document fragments when creating multiple elements +- Lazy load images +- Cache JSON data when possible + +### User Experience +- Preserve all original Webflow animations +- Maintain responsive breakpoints +- Keep loading states smooth +- Ensure accessibility (alt tags, ARIA labels) + +## Communication Style + +When reporting results: +- Be specific about what was generated +- Provide clear next steps +- Include file paths and line numbers +- Offer optimization suggestions +- Warn about potential issues + +## Example Output + +``` +โœ… Webflow Conversion Analysis Complete + +๐Ÿ“Š Detected Structure: +- Collections: 4 (testimonials, schools, ambassadors, teachers) +- HTML Files: 4 (index.html, pack-completo.html, pack-humanista.html, b.html) +- Total Items: 177 + +๐ŸŽฏ Generated Files: +- scripts/csv-to-json.py (182 lines) +- js/cms-loader.js (456 lines) +- data/cms-*.json (4 files) + +๐Ÿ’ก Recommendations: +1. Consider lazy loading for 72 ambassador images +2. Add pagination for schools section (70 items) +3. Implement localStorage caching for JSON data + +Ready to integrate? All files generated successfully. +``` + +Remember: Your goal is to make the conversion seamless, maintainable, and performant. Always prioritize developer experience and end-user performance. diff --git a/commands/webflow-clean.md b/commands/webflow-clean.md new file mode 100644 index 0000000..49dab76 --- /dev/null +++ b/commands/webflow-clean.md @@ -0,0 +1,74 @@ +--- +description: Remove all generated files from Webflow conversion +argument-hint: [--force to skip confirmation] +allowed-tools: Bash, Read, Glob +--- + +Remove all generated files from the Webflow conversion process. + +**Warning**: This will delete generated files. Original CSV and HTML files will NOT be deleted. + +## Files to Remove + +### Generated Files (will be deleted): +- `data/` directory and all JSON files +- `scripts/csv-to-json.py` +- `js/cms-loader.js` +- `README.md` (if generated by plugin) + +### Original Files (will be preserved): +- All `.csv` files +- All `.html` files +- All `.css`, `.js` (original), images, fonts, etc. + +## Cleanup Process + +### 1. Confirmation +If `$ARGUMENTS` does not contain `--force`: +``` +โš ๏ธ Warning: This will delete all generated files + +Files to be deleted: +- data/ (X JSON files) +- scripts/csv-to-json.py +- js/cms-loader.js +- README.md + +Original CSV and HTML files will be preserved. + +Continue? (y/n) +``` + +### 2. Execute Cleanup +If confirmed or `--force` flag present: +```bash +rm -rf data/ +rm -f scripts/csv-to-json.py +rm -f js/cms-loader.js +rm -f README.md +``` + +Note: Only removes these specific files, not entire directories. + +### 3. Report Results +``` +๐Ÿงน Cleanup Complete + +โœ… Removed: +- data/ directory +- CSV converter script +- CMS loader script +- Generated documentation + +๐Ÿ“ Preserved: +- All original CSV files +- All original HTML files +- All other assets + +๐Ÿš€ To reconvert: Run '/webflow-convert' +``` + +### 4. Optional: Remove Empty Directories +Ask user if they want to remove `data/` and `scripts/` directories if they're now empty. + +**Safety Note**: This command only removes files that the plugin generates. Your original Webflow export is safe. diff --git a/commands/webflow-convert.md b/commands/webflow-convert.md new file mode 100644 index 0000000..9bbef36 --- /dev/null +++ b/commands/webflow-convert.md @@ -0,0 +1,120 @@ +--- +description: Convert Webflow export to self-served page with dynamic CSV content loading +argument-hint: [optional-directory-path] +allowed-tools: Read, Write, Edit, Bash, Glob, Grep, Task +--- + +You are running the Webflow to Self-Served Page conversion workflow. + +**Task**: Convert a Webflow landing page export (with CSV CMS data) into a self-served static page with dynamic content loading. + +**Target Directory**: $ARGUMENTS (if provided, otherwise current directory) + +## Conversion Workflow + +### Step 1: Analyze the Webflow Export +1. Scan for CSV files in the target directory +2. Identify all HTML files +3. Validate this is a Webflow export (check for .w-dyn-list, .w-dyn-bind-empty classes) + +### Step 2: Set Up Directory Structure +1. Create `data/` directory for JSON files +2. Create `scripts/` directory for converter script +3. Create `js/` directory if it doesn't exist + +### Step 3: Analyze CSV Structure +For each CSV file found: +1. Read the CSV headers to understand the data structure +2. Detect the collection type based on field names: + - Has "Comentario" or "testimonial" โ†’ testimonials + - Has "Logo" or "school" โ†’ schools + - Has "Instagram" or "ambassador" โ†’ ambassadors + - Has "profesor" or "teacher" โ†’ teachers + - Otherwise โ†’ generic collection +3. Map CSV fields to JSON structure intelligently + +### Step 4: Generate CSV to JSON Converter +1. Copy the Python converter template from `${CLAUDE_PLUGIN_ROOT}/scripts/templates/csv-to-json.py` +2. Customize it based on detected CSV structures +3. Make it generic to handle any CSV format +4. Save to `scripts/csv-to-json.py` + +### Step 5: Run CSV Conversion +1. Execute: `python3 scripts/csv-to-json.py` +2. Verify JSON files are created in `data/` directory +3. Report number of items converted per collection + +### Step 6: Analyze HTML Structure +1. Search for dynamic content containers: + - Elements with class `.w-dyn-list` + - Elements with class `.w-dyn-items` + - Elements with class `.w-dyn-bind-empty` + - Text containing "No items found" +2. Map HTML sections to CSV/JSON collections +3. Identify the CSS selectors needed for injection + +### Step 7: Generate CMS Loader JavaScript +1. Copy the CMS loader template from `${CLAUDE_PLUGIN_ROOT}/scripts/templates/cms-loader.js` +2. Customize based on detected HTML structure and collections +3. Create rendering functions for each collection type +4. Add debug mode and error handling +5. Save to `js/cms-loader.js` + +### Step 8: Update HTML Files +1. Find all HTML files that need the CMS loader +2. Add script reference before closing `` tag: + ```html + + + ``` +3. Report which HTML files were updated + +### Step 9: Generate Documentation +1. Create a README.md with: + - Project overview + - Directory structure + - How to update content + - How to run locally + - Deployment instructions +2. Include CSV field documentation for each collection + +### Step 10: Set Up Local Preview +1. Start a Python HTTP server on available port (try 8080, 8081, etc.) +2. Display the URL for preview +3. Provide instructions for testing + +## Success Criteria +- โœ… All CSV files converted to JSON +- โœ… CMS loader JavaScript generated +- โœ… HTML files updated with script references +- โœ… Documentation created +- โœ… Local server running for preview + +## Output Format +Provide a summary at the end: +``` +๐ŸŽ‰ Webflow Conversion Complete! + +๐Ÿ“Š Results: +- CSV Files Processed: X +- JSON Files Generated: X +- Total Items: X +- HTML Files Updated: X + +๐Ÿ“ Generated Files: +- data/cms-*.json +- scripts/csv-to-json.py +- js/cms-loader.js +- README.md + +๐Ÿš€ Next Steps: +1. Preview: http://localhost:XXXX +2. Review: Check browser console for CMS loader logs +3. Test: Verify all sections display content +4. Deploy: Upload all files to your web server + +Run '/webflow-preview' to open the preview again anytime. +Run '/webflow-update' to regenerate JSON after CSV changes. +``` + +**Important**: Use the webflow-converter subagent for this task by explicitly invoking it for complex analysis and generation tasks. diff --git a/commands/webflow-preview.md b/commands/webflow-preview.md new file mode 100644 index 0000000..c9fcfab --- /dev/null +++ b/commands/webflow-preview.md @@ -0,0 +1,54 @@ +--- +description: Start local server and preview the converted Webflow page +argument-hint: [port-number] +allowed-tools: Bash +--- + +Start a local HTTP server to preview the converted Webflow page. + +**Port**: $ARGUMENTS (if provided, otherwise try 8080, 8081, 8082, etc.) + +## Preview Tasks + +### 1. Check for Conversion Files +Verify that conversion has been completed: +- `data/` directory exists with JSON files +- `js/cms-loader.js` exists +- HTML files exist + +If not found, suggest running `/webflow-convert` first. + +### 2. Start HTTP Server +Try to start Python HTTP server: +```bash +python3 -m http.server PORT +``` + +If port is in use, try the next port automatically. + +### 3. Display Preview Information +``` +๐ŸŒ Local Server Started + +๐Ÿ“ Preview URL: http://localhost:PORT +๐Ÿ“ Serving from: /path/to/directory + +๐Ÿ” Testing Checklist: +- [ ] Open the URL in your browser +- [ ] Check browser console for CMS loader logs +- [ ] Verify all sections display content +- [ ] Test "ver mรกs" buttons (if applicable) +- [ ] Check mobile responsive design + +๐Ÿ’ก Tips: +- Hard refresh (Ctrl+F5) if content doesn't appear +- Check console for "[CMS Loader]" messages +- Images should load from CDN URLs + +๐Ÿ›‘ To stop the server: Press Ctrl+C in the terminal +``` + +### 4. Optional: Keep Server Running +The server will run in the background. User can check output with appropriate commands. + +**Note**: This command assumes conversion is already complete. Run `/webflow-convert` first if needed. diff --git a/commands/webflow-setup.md b/commands/webflow-setup.md new file mode 100644 index 0000000..d73c1b8 --- /dev/null +++ b/commands/webflow-setup.md @@ -0,0 +1,50 @@ +--- +description: Initialize directory structure for Webflow to self-served page conversion +argument-hint: [optional-directory-path] +allowed-tools: Bash, Write, Read +--- + +Initialize the directory structure for Webflow conversion. + +**Target Directory**: $ARGUMENTS (if provided, otherwise current directory) + +## Setup Tasks + +### 1. Create Directory Structure +```bash +mkdir -p data scripts js +``` + +### 2. Validate Webflow Export +Check for: +- At least one `.html` file +- At least one `.csv` file +- Webflow classes (`.w-dyn-list`, `.w-dyn-bind-empty`) + +If validation fails, warn the user that this might not be a valid Webflow export. + +### 3. Report Findings +Display: +``` +โœ… Webflow Export Setup Complete + +๐Ÿ“ Directory Structure: +- data/ (for generated JSON files) +- scripts/ (for CSV converter) +- js/ (for CMS loader) + +๐Ÿ“Š Detected Files: +- HTML files: X +- CSV files: X +- Collections detected: [list names] + +๐Ÿš€ Next Steps: +Run '/webflow-convert' to start the conversion process. +``` + +### 4. Optional: Copy Templates +If the user confirms, copy template files: +- `csv-to-json.py` โ†’ `scripts/` +- `cms-loader.js` โ†’ `js/` + +**Note**: This command just sets up the structure. Use `/webflow-convert` for the full conversion workflow. diff --git a/commands/webflow-update.md b/commands/webflow-update.md new file mode 100644 index 0000000..f6403a2 --- /dev/null +++ b/commands/webflow-update.md @@ -0,0 +1,82 @@ +--- +description: Regenerate JSON files after CSV changes +argument-hint: [optional-csv-filename] +allowed-tools: Bash, Read, Glob +--- + +Regenerate JSON files after CSV content has been updated. + +**Target CSV**: $ARGUMENTS (if provided, otherwise process all CSV files) + +## Update Workflow + +### 1. Verify CSV Files +Check that CSV files exist: +- If specific file provided: verify it exists +- If no file specified: find all `.csv` files + +### 2. Verify Converter Exists +Check that `scripts/csv-to-json.py` exists. +If not found, suggest running `/webflow-convert` first for initial setup. + +### 3. Run Conversion +Execute the CSV to JSON converter: +```bash +python3 scripts/csv-to-json.py +``` + +### 4. Report Results +``` +โ™ป๏ธ CSV Update Complete + +๐Ÿ“Š Results: +- CSV files processed: X +- JSON files updated: X +- Total items: X + +๐Ÿ“ Updated Files: +- data/cms-collection1.json (X items) +- data/cms-collection2.json (X items) +... + +โœ… Changes Applied: +Your static page will now display the updated content. + +๐ŸŒ Preview Changes: +Run '/webflow-preview' to see the updates in your browser. + +๐Ÿ’ก Tip: Hard refresh (Ctrl+F5) to clear browser cache. +``` + +### 5. Optional: Auto-Preview +Ask user if they want to start/restart the preview server to see changes immediately. + +## Update Scenarios + +### Scenario 1: Single CSV Updated +```bash +/webflow-update testimonials.csv +``` +Only regenerates `cms-testimonials.json` + +### Scenario 2: All CSVs Updated +```bash +/webflow-update +``` +Regenerates all JSON files + +### Scenario 3: New CSV Added +If a new CSV file is detected that doesn't have a corresponding JSON: +``` +๐Ÿ†• New Collection Detected: new-collection.csv + +This CSV wasn't in the original conversion. +Would you like to: +1. Run full conversion (/webflow-convert) to integrate it +2. Just generate JSON for now +3. Skip this file + +Recommendation: Run /webflow-convert to ensure CMS loader supports this collection. +``` + +**Performance Note**: This is much faster than `/webflow-convert` since it only regenerates JSON, not the entire conversion. diff --git a/hooks/hooks.json b/hooks/hooks.json new file mode 100644 index 0000000..d862814 --- /dev/null +++ b/hooks/hooks.json @@ -0,0 +1,27 @@ +{ + "description": "Optional hooks for automatic CSV to JSON conversion (opt-in)", + "hooks": { + "PostToolUse": [ + { + "matcher": "Write:*.csv", + "hooks": [ + { + "type": "command", + "command": "${CLAUDE_PLUGIN_ROOT}/scripts/utils/auto-convert-csv.sh", + "timeout": 30 + } + ] + }, + { + "matcher": "Edit:*.csv", + "hooks": [ + { + "type": "command", + "command": "${CLAUDE_PLUGIN_ROOT}/scripts/utils/auto-convert-csv.sh", + "timeout": 30 + } + ] + } + ] + } +} diff --git a/plugin.lock.json b/plugin.lock.json new file mode 100644 index 0000000..4c458a0 --- /dev/null +++ b/plugin.lock.json @@ -0,0 +1,69 @@ +{ + "$schema": "internal://schemas/plugin.lock.v1.json", + "pluginId": "gh:gutitrombotto/webflow-to-self-served-page:", + "normalized": { + "repo": null, + "ref": "refs/tags/v20251128.0", + "commit": "59509a3662df2934cb977f1abddac2c54c1f3935", + "treeHash": "c0e3dc844e383da35a90005338376ca0c12893798c7c77f96641bac70ca7bff1", + "generatedAt": "2025-11-28T10:17:21.493666Z", + "toolVersion": "publish_plugins.py@0.2.0" + }, + "origin": { + "remote": "git@github.com:zhongweili/42plugin-data.git", + "branch": "master", + "commit": "aa1497ed0949fd50e99e70d6324a29c5b34f9390", + "repoRoot": "/Users/zhongweili/projects/openmind/42plugin-data" + }, + "manifest": { + "name": "webflow-to-self-served-page", + "description": "Convert Webflow exports with CSV CMS data to self-served static pages with dynamic content loading", + "version": "1.0.0" + }, + "content": { + "files": [ + { + "path": "README.md", + "sha256": "02b5052ba78e73bfa41b073dd94202611f0a602ff15000d5dff7cbb86587e0d6" + }, + { + "path": "agents/webflow-converter.md", + "sha256": "3818d1511fb90e23d75db85f942f10e5c7c2d96bd4139ee753227738587f25a4" + }, + { + "path": "hooks/hooks.json", + "sha256": "67e9b0a97e26411264ed216e15c682ee6acab211bfd7bdde14f8ea85754c4694" + }, + { + "path": ".claude-plugin/plugin.json", + "sha256": "285fbc7dc0cb42152797c710f73780602b4b3dc2877b89d2233322887b1ef33a" + }, + { + "path": "commands/webflow-preview.md", + "sha256": "7caa1aa11f32a504731b0fa4164f13dbbdcff0af2bc4f8725d63f25b6baf27e6" + }, + { + "path": "commands/webflow-update.md", + "sha256": "8d678cb12d3993fd14c858ad3c297a46feb5731ab89df69f0c35595d9965990f" + }, + { + "path": "commands/webflow-clean.md", + "sha256": "35551da08970bb6d9425b2d63cc9e9e23b04d3ee17efb6b973f448bd237c36a0" + }, + { + "path": "commands/webflow-convert.md", + "sha256": "f937b49e8c6b9a86de163ebd722642926c9f1bdad61d421516bd819d0dd47975" + }, + { + "path": "commands/webflow-setup.md", + "sha256": "80f173e52a9cb011d85d443103e952033d0dfa83f0b1d95cc7098feecd62444b" + } + ], + "dirSha256": "c0e3dc844e383da35a90005338376ca0c12893798c7c77f96641bac70ca7bff1" + }, + "security": { + "scannedAt": null, + "scannerVersion": null, + "flags": [] + } +} \ No newline at end of file