v1.5.1

Layup β€” Sprint TODO (overnight Feb 23-24)

Priority 1: Testing βœ… COMPLETE

  • Frontend/HTTP Tests (22 tests)
  • SafelistCollector Tests (16 tests)
  • Artisan Command Tests (4 tests)
  • ContentValidator Tests (14 tests)
  • Rendering Tests (28 tests)
  • PageTemplate Tests (7 tests)
  • Revision Tests (4 tests)

Priority 2: Missing Divi Features βœ… COMPLETE

Sections (wraps rows) βœ…

  • Section view component β€” outermost wrapper around rows
  • Section settings: background image/video/gradient, parallax, fullscreen height
  • Update page content structure: supports both { sections: [...] } and legacy { rows: [...] }

Design Tab Enhancements βœ…

  • Text color picker, Font size selector, Text alignment
  • Border radius, Border (width/style/color), Box shadow presets
  • Opacity slider

Responsive Visibility βœ…

  • Show/hide per breakpoint toggle, generates hidden/block classes

Animations/Transitions βœ…

  • 6 entrance animations via Alpine x-intersect, configurable duration

Priority 3: Builder UX Polish

Widget Picker βœ… COMPLETE

  • Widget icons in picker modal
  • Recently used widgets
  • Drag from picker to canvas

Builder Canvas βœ… COMPLETE

  • Live preview of widget content
  • Inline text editing
  • Visual column resize handles

Page Management βœ… COMPLETE

  • Duplicate page, Bulk publish/unpublish, Export/Import JSON
  • Revision history (auto-save, prune, restore)
  • Revision browser UI in EditPage

Priority 4: Portability & DX βœ… COMPLETE

  • Export/Import JSON, Page templates (5 built-in), Save as template
  • SEO: OG tags, Twitter Cards, canonical, JSON-LD breadcrumbs
  • Sitemap helper (Page::sitemapEntries())
  • layup:install command, Widget auto-discovery, Extra safelist classes
  • Structured data: WebPage, Article/BlogPosting, FAQPage schema.org types
  • layup:make-widget artisan command (scaffold custom widgets)
  • layup:audit command (page health check, widget usage stats)

Priority 5: Widget Polish βœ… COMPLETE

  • Heading: link URL
  • Image: link URL, new tab
  • Button: custom bg/text colors, hover colors via Alpine
  • Video: privacy-enhanced mode (youtube-nocookie.com)
  • Blurb: text alignment, right layout support
  • CTA: button style, bg/text colors, new tab
  • Testimonial: star rating, company name
  • PricingTable: custom badge text
  • Map: map type (roadmap/satellite/terrain/hybrid)
  • SocialFollow: icon size
  • Gallery: lightbox + captions
  • Image: hover effects (zoom, grayscaleβ†’color, brighten, blurβ†’clear)
  • Blurb: icon picker UI (90+ searchable heroicons)

Summary (as of ~5:30am MST Feb 24)

  • 852 tests, 1706 assertions β€” all passing
  • 75 widgets total
  • Section component with background image/video/gradient, parallax, overlay
  • Structured data (WebPage, Article, FAQPage, BreadcrumbList)
  • Page templates (5 built-in), revision history with browser UI
  • 4 artisan commands: layup:install, layup:safelist, layup:make-widget, layup:audit
  • Alpine.js components for interactive widgets (accordion, tabs, countdown, slider, lightbox, etc.)
  • Full Design/Advanced tabs on all widgets (colors, borders, spacing, animations, visibility)
  • Builder UX enhancements: Widget icons (65+ heroicons), recently used widgets, drag from picker, improved previews, inline text editing
  • Revision browser: Slideover modal with restore functionality, timestamps, author tracking

Completed Tonight (Priority 3 UX Polish) β€” ALL 7 TASKS βœ…

  1. βœ… Widget icons in picker modal - 65+ heroicon SVGs render correctly per widget type
  2. βœ… Recently used widgets - localStorage tracking, shows last 5 widgets at top of picker
  3. βœ… Revision browser UI - Slideover with history, restore buttons, metadata display
  4. βœ… Drag from picker to canvas - Drag widgets directly onto columns from picker
  5. βœ… Live preview improvements - 20+ widget-specific preview formats with icons and context
  6. βœ… Inline text editing - Double-click text/heading widgets to quick-edit content
  7. βœ… Visual column resize handles - Drag handles between columns to adjust spans dynamically

Future (post-sprint)

  • More page templates
  • Publish to Packagist