Smart Variant Creator - UX Review & Critical Issues

Comprehensive analysis of current implementation, bugs, missing features, and required improvements

Smart Variant Creator - UX Review & Critical Issues

๐Ÿ“ธ Current State Analysis

Based on the screenshots and code review, the Smart Variant Creator has significant UX and functionality issues that prevent it from being "incredibly easy to use."


๐Ÿšจ Critical Issues

1. Modal Doesn't Close โŒ

Problem: Close buttons are non-functional

Root Cause:

// component.ts line 259
close(): void {
  console.log('๐Ÿšช [SmartVariantCreator] Close clicked');
  this.portalData?.onClosed?.();
}

The modal calls onClosed() but the UX Portal Service might not be properly configured to destroy the component when this callback is invoked.

Fix Required:


2. Material Icons Don't Render โŒ

Problem: Icons show as text ("palette", "close", etc.) instead of Material Symbols

Root Cause: Missing Material Symbols font or incorrect CSS class

What We See:

<!-- This should show an icon but shows "palette" text -->
<span class="material-symbols-outlined">{{ metadataForm.value.icon || 'palette' }}</span>

Fix Required:

  1. Add Material Symbols font to global styles:
@import url('https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL,[email protected],100..700,0..1,-50..200');
  1. Or use Angular Material icons with <mat-icon> component

3. "Customize" Tab Stuck on Loading โŒ

Problem: Screenshot 2 shows "Loading widget properties..." indefinitely

Root Cause: WidgetPropertyGroupsProvider doesn't include button-specific property groups!

// widget-property-groups.provider.ts line 19-31
private readonly propertyGroups: Record<string, PropertyGroup[]> = {
  'button': [...DEFAULT_PROPERTY_GROUPS],  // โŒ Only defaults, no button-specific groups!
  // Line 9 has this commented out:
  // import { BUTTON_WIDGET_PROPERTY_GROUPS } from '../components/button-widget/button-widget-property-groups';

The property groups EXIST (BUTTON_WIDGET_PROPERTY_GROUPS) but are NOT IMPORTED OR REGISTERED!

Fix Required:

// 1. Uncomment line 9
import { BUTTON_WIDGET_PROPERTY_GROUPS } from '../components/button-widget/button-widget-property-groups';
import { CARD_WIDGET_PROPERTY_GROUPS } from '../components/card-widget/card-widget-property-groups';
import { INPUT_WIDGET_PROPERTY_GROUPS } from '../components/input-widget/input-widget-property-groups';
// ... etc for all core widgets

// 2. Update line 23
'button': [...DEFAULT_PROPERTY_GROUPS, ...BUTTON_WIDGET_PROPERTY_GROUPS],
'card': [...DEFAULT_PROPERTY_GROUPS, ...CARD_WIDGET_PROPERTY_GROUPS],
'input': [...DEFAULT_PROPERTY_GROUPS, ...INPUT_WIDGET_PROPERTY_GROUPS],

4. Confusing User Flow โš ๏ธ

Problem: Users don't understand WHERE core widget properties come from or HOW to modify them

User's Question (from screenshot feedback):

"When we are dealing with core widgets, where do we modify the properties? Or are they hardcoded always? It's very hard to understand still."

Current State:

Fix Required - Add Clear Onboarding:

<!-- Add at top of "Customize" tab -->
<div class="onboarding-banner">
  <span class="material-symbols-outlined">help_outline</span>
  <div>
    <strong>How it works:</strong>
    <p>Core widgets (like Button, Input, Card) have pre-defined property groups. 
       Customize any property here to create your variant. Unmodified properties 
       will use the widget's default values.</p>
  </div>
</div>

๐ŸŽฏ Missing Critical Features

5. No Live Preview โš ๏ธ

Screenshot 3 shows: "Dynamic Preview Coming Soon" placeholder

User Expectation: Real-time widget rendering with applied properties

Current Implementation:

<!-- Just a placeholder -->
<div class="preview-placeholder">
  <div class="preview-widget-demo">
    <span class="material-symbols-outlined preview-icon">{{ portalData?.baseWidget }}</span>
    <h4>{{ metadataForm.value.name || 'Your Variant' }}</h4>
  </div>
</div>

Fix Required:

  1. Dynamically render actual widget component based on portalData.baseWidget
  2. Apply property values from propertiesForm to preview widget
  3. Update in real-time when properties change (use effect())

Implementation Strategy:

// Use Angular's dynamic component loading
private previewContainerRef = viewChild<ViewContainerRef>('previewContainer');

async updateLivePreview() {
  const widgetType = this.portalData?.baseWidget;
  const componentType = await this.widgetRegistry.getComponentForType(widgetType);
  
  // Clear existing
  this.previewContainerRef()?.clear();
  
  // Create instance with current property values
  const componentRef = this.previewContainerRef()?.createComponent(componentType);
  componentRef.setInput('widget', this.buildPreviewWidget());
}

6. Property Groups Collapsed by Default โš ๏ธ

Current State: Only 2 groups expanded: ['content', 'design']

Problem: Users don't know what other properties exist without manually expanding each group

Fix Options:

Option A - Expand All by Default:

// Initialize with all groups expanded
this.expandedGroups.set(new Set(this.propertyGroups().map(g => g.title)));

Option B - Smart Expansion (Better UX):

// Expand groups with most commonly modified properties
const importantGroups = ['content', 'design', 'appearance', 'layout'];
this.expandedGroups.set(new Set(importantGroups));

7. No Property Search/Filter โš ๏ธ

Problem: Widgets like Card have 8 property groups with 50+ properties

User Pain: Scrolling through all properties to find "border radius" or "background color"

Fix Required: Add search bar at top of Customize tab

<div class="property-search">
  <input 
    type="text"
    placeholder="๐Ÿ” Search properties..."
    [(ngModel)]="propertySearchTerm"
    class="input">
</div>
// Filter properties based on search
readonly filteredPropertyControls = computed(() => {
  const term = this.propertySearchTerm().toLowerCase();
  if (!term) return this.propertyControls();
  
  return this.propertyControls().filter(c => 
    c.property.label.toLowerCase().includes(term) ||
    c.property.description?.toLowerCase().includes(term)
  );
});

๐Ÿค” Conceptual Clarity Issues

8. Core Widget Properties vs Variants

User's Confusion:

"Where do we modify the properties? Are they hardcoded?"

The Truth (that needs better communication):

  1. Core UI Widgets (Button, Input, Card, etc.) have standardized property groups

    • Defined in: libs/libs-widgets/widgets/src/lib/components/{widget-type}/{widget-type}-property-groups.ts
    • Example: BUTTON_WIDGET_PROPERTY_GROUPS defines all customizable properties
    • These are NOT hardcoded - they're extensible and discoverable
  2. Variants are pre-configured instances of core widgets

    • A variant is: "Button with these specific property values"
    • Example: "Primary Button" = Button widget + {buttonType: 'primary', size: 'medium', theme: 'brand'}
  3. Property Groups Define Customization Surface

    • Each property group says: "These are the knobs you can turn"
    • Variant Creator shows these knobs and lets you set values

Fix Required - Add Conceptual Guide:

## ๐Ÿ“š Understanding Core Widgets & Variants

### Core UI Widgets
Pre-built components with standardized, extensible properties:
- **Button**: text, type, size, theme, icon, action
- **Input**: placeholder, type, validation, mask
- **Card**: title, image, layout, elevation, actions

### Variants
Your customized versions of core widgets:
- **Primary Button**: Button with brand colors and medium size
- **Login Input**: Input with email validation and custom styling
- **Product Card**: Card with image-first layout and shadow

### Property Groups
Organized collections of customizable properties:
- **Content**: What the widget displays
- **Design**: Colors, borders, spacing
- **Behavior**: Interactions, animations
- **Accessibility**: Labels, ARIA attributes

๐Ÿ“‹ Step-by-Step Missing Steps

Based on screenshot analysis, the flow is incomplete:

Current Flow (3 steps):

  1. โœ… Basic Info - Name, description, category (works)
  2. โŒ Customize - Stuck loading (broken)
  3. โŒ Preview - Placeholder only (incomplete)

What's Missing:

Before Step 2 (Customize):

During Step 2 (Customize):

During Step 3 (Preview):

After Saving:


๐ŸŽฏ Required Improvements - Priority Matrix

๐Ÿ”ด Critical (Breaks Functionality)

  1. Fix Property Groups Loading (issue #3)
  2. Fix Close Button (issue #1)
  3. Fix Material Icons (issue #2)

๐ŸŸก High Priority (Poor UX)

  1. Add Live Preview (issue #5)
  2. Add Property Search (issue #7)
  3. Add Clear Onboarding (issue #4)

๐ŸŸข Medium Priority (Nice to Have)

  1. Smart Property Group Expansion (issue #6)
  2. Add "Reset to Default" per property
  3. Add validation feedback
  4. Add responsive preview modes

๐Ÿ”ต Low Priority (Polish)

  1. Add property tooltips
  2. Add "Import from Variant" feature
  3. Add post-save guidance
  4. Add comparison mode

๐Ÿ› ๏ธ Implementation Plan

Phase 1: Fix Broken Functionality โœ…

Goal: Make it actually work

  1. Fix Property Groups Loading

    • Uncomment imports in WidgetPropertyGroupsProvider
    • Register all core widget property groups
    • Test: Button variant should show 15-20 properties
  2. Fix Close Button

    • Debug onClosed callback flow
    • Add direct portal service call as fallback
    • Test: Modal closes on X, Cancel, Escape
  3. Fix Material Icons

    • Add Material Symbols font to global styles
    • Or migrate to Angular Material icons
    • Test: All icons render properly

Phase 2: Add Core UX Features ๐Ÿš€

Goal: Make it usable

  1. Implement Live Preview

    • Dynamic component loading
    • Real-time property application
    • Responsive breakpoints
    • Test: Preview updates as properties change
  2. Add Property Search

    • Search input component
    • Filter by label/description
    • Highlight matches
    • Test: Can find "color" across all groups
  3. Add Onboarding

    • Explanation banners
    • Contextual help
    • Example variants
    • Test: New users understand the flow

Phase 3: Polish & Delight โœจ

Goal: Make it incredible

  1. Smart Defaults & Suggestions

    • AI-suggested property values based on variant name
    • "Similar Variants" recommendations
    • One-click templates
  2. Advanced Features

    • Import from existing variant
    • Duplicate with modifications
    • Batch property editing
  3. Developer Tools

    • Export as code (TypeScript)
    • JSON inspector
    • Property history/undo

๐ŸŽจ Design Improvements

Current Design Issues:

Design Goals:

  1. Visual Hierarchy: Guide user through 3 steps clearly
  2. Immediate Feedback: Show property changes in real-time
  3. Reduce Cognitive Load: Group related properties, hide complexity
  4. Delight: Smooth transitions, helpful micro-interactions

๐Ÿงช Testing Strategy

Manual Testing Checklist:

Test 1: Create Button Variant

Test 2: Close Modal

Test 3: Icons Render


๐Ÿ“Š Success Metrics

Before (Current State):

After (Phase 1):

After (Phase 2):

After (Phase 3):


๐Ÿš€ Next Steps

  1. Fix Critical Bugs (Phase 1)

    • Start with Property Groups loading (#3)
    • Then fix close button (#1)
    • Then fix icons (#2)
  2. User Test (After Phase 1)

    • Can we create a simple button variant?
    • Does the modal close properly?
    • Do icons render?
  3. Implement Live Preview (Phase 2, Priority #1)

    • This is the most important UX feature
    • Without it, users are "flying blind"
  4. Iterate Based on Feedback

    • Test with actual space-builders
    • Measure completion rates
    • Identify pain points

๐Ÿ’ก Key Insight

The infrastructure is 80% there - property groups exist, forms work, styling is good.

The problem is integration - the pieces aren't connected properly:

This is a "last mile" problem - we need to connect the dots, not rebuild from scratch.


Last Updated: November 17, 2025 Status: Critical Review - Requires Immediate Action