Skip to main content

RgbColor

Struct RgbColor 

Source
pub struct RgbColor {
    pub r: u8,
    pub g: u8,
    pub b: u8,
}
Expand description

RGB color (6-digit hex)

Fields§

§r: u8§g: u8§b: u8

Implementations§

Source§

impl RgbColor

Source

pub fn new(r: u8, g: u8, b: u8) -> Self

Create a new RGB color

Examples found in repository?
examples/comprehensive_demo.rs (line 1583)
69fn main() -> Result<(), Box<dyn std::error::Error>> {
70    println!("╔══════════════════════════════════════════════════════════════╗");
71    println!("║       PPTX-RS Element Showcase - Complete Coverage           ║");
72    println!("╚══════════════════════════════════════════════════════════════╝\n");
73
74    let mut slides = Vec::new();
75
76    // =========================================================================
77    // SLIDE 1: CenteredTitle Layout + Title Formatting
78    // =========================================================================
79    println!("📐 Slide 1: CenteredTitle Layout + Title Formatting");
80    slides.push(
81        SlideContent::new("PPTX-RS Element Showcase")
82            .layout(SlideLayout::CenteredTitle)
83            .title_size(54)
84            .title_bold(true)
85            .title_color("1F497D")
86    );
87
88    // =========================================================================
89    // SLIDE 2: TitleOnly Layout
90    // =========================================================================
91    println!("📐 Slide 2: TitleOnly Layout");
92    slides.push(
93        SlideContent::new("Section: Slide Layouts")
94            .layout(SlideLayout::TitleOnly)
95            .title_size(48)
96            .title_bold(true)
97            .title_color("C0504D")
98    );
99
100    // =========================================================================
101    // SLIDE 3: TitleAndContent Layout + All Text Formatting
102    // =========================================================================
103    println!("📝 Slide 3: TitleAndContent + Text Formatting");
104    slides.push(
105        SlideContent::new("Text Formatting Options")
106            .layout(SlideLayout::TitleAndContent)
107            .title_color("1F497D")
108            .title_bold(true)
109            .title_italic(true)
110            .title_underline(true)
111            .title_size(44)
112            .add_bullet("Normal text (default)")
113            .add_bullet("Bold content text")
114            .add_bullet("Italic content text")
115            .add_bullet("Underlined content")
116            .add_bullet("Custom font size (28pt)")
117            .add_bullet("Custom color (#4F81BD)")
118            .content_bold(true)
119            .content_italic(true)
120            .content_underline(true)
121            .content_size(28)
122            .content_color("4F81BD")
123    );
124
125    // =========================================================================
126    // SLIDE 4: TitleAndBigContent Layout
127    // =========================================================================
128    println!("📐 Slide 4: TitleAndBigContent Layout");
129    slides.push(
130        SlideContent::new("Key Highlights")
131            .layout(SlideLayout::TitleAndBigContent)
132            .title_color("1F497D")
133            .add_bullet("Large content area for emphasis")
134            .add_bullet("Perfect for key messages")
135            .add_bullet("Smaller title, bigger content")
136            .content_bold(true)
137            .content_size(32)
138    );
139
140    // =========================================================================
141    // SLIDE 5: TwoColumn Layout
142    // =========================================================================
143    println!("📐 Slide 5: TwoColumn Layout");
144    slides.push(
145        SlideContent::new("Two Column Comparison")
146            .layout(SlideLayout::TwoColumn)
147            .title_color("1F497D")
148            .add_bullet("Left Column Item 1")
149            .add_bullet("Left Column Item 2")
150            .add_bullet("Left Column Item 3")
151            .add_bullet("Right Column Item 1")
152            .add_bullet("Right Column Item 2")
153            .add_bullet("Right Column Item 3")
154            .content_size(24)
155    );
156
157    // =========================================================================
158    // SLIDE 6: Blank Layout
159    // =========================================================================
160    println!("📐 Slide 6: Blank Layout");
161    slides.push(
162        SlideContent::new("")
163            .layout(SlideLayout::Blank)
164    );
165
166    // =========================================================================
167    // SLIDE 7: Table with All Cell Styling Options
168    // =========================================================================
169    println!("📊 Slide 7: Table with Cell Styling");
170    let styled_table = TableBuilder::new(vec![1500000, 1500000, 1500000])
171        .add_row(TableRow::new(vec![
172            TableCell::new("Header 1").bold().background_color("1F497D"),
173            TableCell::new("Header 2").bold().background_color("4F81BD"),
174            TableCell::new("Header 3").bold().background_color("8064A2"),
175        ]))
176        .add_row(TableRow::new(vec![
177            TableCell::new("Bold Cell").bold(),
178            TableCell::new("Normal Cell"),
179            TableCell::new("Colored").background_color("9BBB59"),
180        ]))
181        .add_row(TableRow::new(vec![
182            TableCell::new("Red BG").background_color("C0504D"),
183            TableCell::new("Green BG").background_color("9BBB59"),
184            TableCell::new("Blue BG").background_color("4F81BD"),
185        ]))
186        .add_row(TableRow::new(vec![
187            TableCell::new("Row 3 Col 1"),
188            TableCell::new("Row 3 Col 2"),
189            TableCell::new("Row 3 Col 3").bold().background_color("F79646"),
190        ]))
191        .position(500000, 1800000)
192        .build();
193    
194    slides.push(
195        SlideContent::new("Table with Cell Styling")
196            .table(styled_table)
197            .title_color("1F497D")
198    );
199
200    // =========================================================================
201    // SLIDE 8: Charts (Bar, Line, Pie)
202    // =========================================================================
203    println!("📈 Slide 8: Chart Types");
204    
205    // Create chart data structures (for demonstration)
206    let _bar_chart = ChartBuilder::new("Sales by Region", ChartType::Bar)
207        .categories(vec!["North", "South", "East", "West"])
208        .add_series(ChartSeries::new("2023", vec![100.0, 80.0, 120.0, 90.0]))
209        .add_series(ChartSeries::new("2024", vec![120.0, 95.0, 140.0, 110.0]))
210        .build();
211    
212    let _line_chart = ChartBuilder::new("Monthly Trend", ChartType::Line)
213        .categories(vec!["Jan", "Feb", "Mar", "Apr", "May", "Jun"])
214        .add_series(ChartSeries::new("Revenue", vec![10.0, 12.0, 15.0, 14.0, 18.0, 22.0]))
215        .build();
216    
217    let _pie_chart = ChartBuilder::new("Market Share", ChartType::Pie)
218        .categories(vec!["Product A", "Product B", "Product C", "Others"])
219        .add_series(ChartSeries::new("Share", vec![40.0, 30.0, 20.0, 10.0]))
220        .build();
221    
222    slides.push(
223        SlideContent::new("Chart Types: Bar, Line, Pie")
224            .with_chart()
225            .title_color("1F497D")
226            .add_bullet("Bar Chart: Compare categories")
227            .add_bullet("Line Chart: Show trends over time")
228            .add_bullet("Pie Chart: Show proportions")
229            .content_size(24)
230    );
231
232    // =========================================================================
233    // SLIDE 9: Shapes with Different Fills
234    // =========================================================================
235    println!("🔷 Slide 9: Shapes with Fills");
236    
237    let rect = Shape::new(ShapeType::Rectangle, 500000, 1600000, 2000000, 1000000)
238        .with_fill(ShapeFill::new("4F81BD"))
239        .with_text("Rectangle");
240    
241    let ellipse = Shape::new(ShapeType::Ellipse, 3000000, 1600000, 2000000, 1000000)
242        .with_fill(ShapeFill::new("9BBB59"))
243        .with_text("Ellipse");
244    
245    let rounded = Shape::new(ShapeType::RoundedRectangle, 5500000, 1600000, 2000000, 1000000)
246        .with_fill(ShapeFill::new("C0504D"))
247        .with_text("Rounded");
248    
249    let triangle = Shape::new(ShapeType::Triangle, 1500000, 3000000, 1500000, 1200000)
250        .with_fill(ShapeFill::new("8064A2"))
251        .with_text("Triangle");
252    
253    let diamond = Shape::new(ShapeType::Diamond, 4000000, 3000000, 1500000, 1200000)
254        .with_fill(ShapeFill::new("F79646"))
255        .with_text("Diamond");
256    
257    slides.push(
258        SlideContent::new("Shape Types with Color Fills")
259            .add_shape(rect)
260            .add_shape(ellipse)
261            .add_shape(rounded)
262            .add_shape(triangle)
263            .add_shape(diamond)
264            .title_color("1F497D")
265    );
266
267    // =========================================================================
268    // SLIDE 10: Gradient Fills (NEW)
269    // =========================================================================
270    println!("🌈 Slide 10: Gradient Fills");
271    
272    // Horizontal gradient
273    let gradient_h = Shape::new(ShapeType::Rectangle, 500000, 1600000, 2500000, 1200000)
274        .with_gradient(GradientFill::linear("1565C0", "42A5F5", GradientDirection::Horizontal))
275        .with_text("Horizontal");
276    
277    // Vertical gradient
278    let gradient_v = Shape::new(ShapeType::Rectangle, 3200000, 1600000, 2500000, 1200000)
279        .with_gradient(GradientFill::linear("2E7D32", "81C784", GradientDirection::Vertical))
280        .with_text("Vertical");
281    
282    // Diagonal gradient
283    let gradient_d = Shape::new(ShapeType::RoundedRectangle, 5900000, 1600000, 2500000, 1200000)
284        .with_gradient(GradientFill::linear("C62828", "EF9A9A", GradientDirection::DiagonalDown))
285        .with_text("Diagonal");
286    
287    // Three-color gradient
288    let gradient_3 = Shape::new(ShapeType::Ellipse, 1800000, 3200000, 2500000, 1200000)
289        .with_gradient(GradientFill::three_color("FF6F00", "FFC107", "FFEB3B", GradientDirection::Horizontal))
290        .with_text("3-Color");
291    
292    // Custom angle gradient
293    let gradient_angle = Shape::new(ShapeType::RoundedRectangle, 4800000, 3200000, 2500000, 1200000)
294        .with_gradient(GradientFill::linear("7B1FA2", "E1BEE7", GradientDirection::Angle(135)))
295        .with_text("135° Angle");
296    
297    slides.push(
298        SlideContent::new("Gradient Fills - Multiple Directions")
299            .add_shape(gradient_h)
300            .add_shape(gradient_v)
301            .add_shape(gradient_d)
302            .add_shape(gradient_3)
303            .add_shape(gradient_angle)
304            .title_color("1F497D")
305    );
306
307    // =========================================================================
308    // SLIDE 11: Transparency (NEW)
309    // =========================================================================
310    println!("👻 Slide 11: Transparency Effects");
311    
312    // Base shape (fully opaque)
313    let base = Shape::new(ShapeType::Rectangle, 1000000, 1800000, 3000000, 2000000)
314        .with_fill(ShapeFill::new("1565C0"))
315        .with_text("Base (100%)");
316    
317    // 25% transparent overlay
318    let trans_25 = Shape::new(ShapeType::Rectangle, 2000000, 2200000, 2500000, 1500000)
319        .with_fill(ShapeFill::new("F44336").with_transparency(25))
320        .with_line(ShapeLine::new("B71C1C", 25400))
321        .with_text("25% Transparent");
322    
323    // 50% transparent overlay
324    let trans_50 = Shape::new(ShapeType::Ellipse, 4500000, 1800000, 2500000, 2000000)
325        .with_fill(ShapeFill::new("4CAF50").with_transparency(50))
326        .with_line(ShapeLine::new("1B5E20", 25400))
327        .with_text("50% Transparent");
328    
329    // 75% transparent overlay
330    let trans_75 = Shape::new(ShapeType::RoundedRectangle, 5500000, 2500000, 2500000, 1500000)
331        .with_fill(ShapeFill::new("FF9800").with_transparency(75))
332        .with_line(ShapeLine::new("E65100", 25400))
333        .with_text("75% Transparent");
334    
335    slides.push(
336        SlideContent::new("Transparency Effects - Overlapping Shapes")
337            .add_shape(base)
338            .add_shape(trans_25)
339            .add_shape(trans_50)
340            .add_shape(trans_75)
341            .title_color("1F497D")
342    );
343
344    // =========================================================================
345    // SLIDE 12: Styled Connectors (NEW)
346    // =========================================================================
347    println!("🔗 Slide 12: Styled Connectors");
348    
349    // Create shapes to connect
350    let box1 = Shape::new(ShapeType::RoundedRectangle, 500000, 1800000, 1800000, 800000)
351        .with_id(100)
352        .with_fill(ShapeFill::new("1565C0"))
353        .with_text("Start");
354    
355    let box2 = Shape::new(ShapeType::RoundedRectangle, 3500000, 1800000, 1800000, 800000)
356        .with_id(101)
357        .with_fill(ShapeFill::new("2E7D32"))
358        .with_text("Process");
359    
360    let box3 = Shape::new(ShapeType::RoundedRectangle, 6500000, 1800000, 1800000, 800000)
361        .with_id(102)
362        .with_fill(ShapeFill::new("C62828"))
363        .with_text("End");
364    
365    // Straight connector with arrow
366    let conn1 = Connector::straight(2300000, 2200000, 3500000, 2200000)
367        .with_line(ConnectorLine::new("1565C0", 25400))
368        .with_end_arrow(ArrowType::Triangle)
369        .with_arrow_size(ArrowSize::Large);
370    
371    // Elbow connector with stealth arrow
372    let conn2 = Connector::elbow(5300000, 2200000, 6500000, 2200000)
373        .with_line(ConnectorLine::new("2E7D32", 38100).with_dash(LineDash::Dash))
374        .with_end_arrow(ArrowType::Stealth)
375        .with_arrow_size(ArrowSize::Medium);
376    
377    // Curved connector examples
378    let box4 = Shape::new(ShapeType::Ellipse, 1000000, 3200000, 1500000, 800000)
379        .with_id(103)
380        .with_fill(ShapeFill::new("7B1FA2"))
381        .with_text("A");
382    
383    let box5 = Shape::new(ShapeType::Ellipse, 4000000, 3200000, 1500000, 800000)
384        .with_id(104)
385        .with_fill(ShapeFill::new("00838F"))
386        .with_text("B");
387    
388    let box6 = Shape::new(ShapeType::Ellipse, 7000000, 3200000, 1500000, 800000)
389        .with_id(105)
390        .with_fill(ShapeFill::new("EF6C00"))
391        .with_text("C");
392    
393    // Curved connector with diamond arrow
394    let conn3 = Connector::curved(2500000, 3600000, 4000000, 3600000)
395        .with_line(ConnectorLine::new("7B1FA2", 19050).with_dash(LineDash::DashDot))
396        .with_arrows(ArrowType::Oval, ArrowType::Diamond);
397    
398    // Dotted connector
399    let conn4 = Connector::straight(5500000, 3600000, 7000000, 3600000)
400        .with_line(ConnectorLine::new("00838F", 12700).with_dash(LineDash::Dot))
401        .with_end_arrow(ArrowType::Open);
402    
403    slides.push(
404        SlideContent::new("Styled Connectors - Types, Arrows, Dashes")
405            .add_shape(box1)
406            .add_shape(box2)
407            .add_shape(box3)
408            .add_shape(box4)
409            .add_shape(box5)
410            .add_shape(box6)
411            .add_connector(conn1)
412            .add_connector(conn2)
413            .add_connector(conn3)
414            .add_connector(conn4)
415            .title_color("1F497D")
416    );
417
418    // =========================================================================
419    // SLIDE 13: Images
420    // =========================================================================
421    println!("🖼️  Slide 13: Image Placeholders");
422    
423    let img1 = Image::new("logo.png", 2500000, 1800000, "png")
424        .position(500000, 1600000);
425    let img2 = Image::new("photo.jpg", 2500000, 1800000, "jpg")
426        .position(3500000, 1600000);
427    let img3 = Image::new("diagram.png", 2000000, 1800000, "png")
428        .position(6500000, 1600000);
429    
430    slides.push(
431        SlideContent::new("Image Placeholders")
432            .add_image(img1)
433            .add_image(img2)
434            .add_image(img3)
435            .title_color("1F497D")
436    );
437
438    // =========================================================================
439    // SLIDE 11: Advanced Table with Borders & Alignment (NEW)
440    // =========================================================================
441    println!("📊 Slide 11: Advanced Table (borders, alignment, merged cells)");
442    
443    // Build advanced table using generator's TableBuilder with alignment
444    let advanced_table = TableBuilder::new(vec![2000000, 2000000, 2000000, 2000000])
445        .add_row(TableRow::new(vec![
446            TableCell::new("Q1 2024 Financial Report").bold().background_color("1F4E79").text_color("FFFFFF").align_center().font_size(14),
447            TableCell::new("").background_color("1F4E79"),
448            TableCell::new("").background_color("1F4E79"),
449            TableCell::new("").background_color("1F4E79"),
450        ]))
451        .add_row(TableRow::new(vec![
452            TableCell::new("Category").bold().background_color("2E75B6").text_color("FFFFFF").align_center(),
453            TableCell::new("Revenue").bold().background_color("2E75B6").text_color("FFFFFF").align_center(),
454            TableCell::new("Expenses").bold().background_color("2E75B6").text_color("FFFFFF").align_center(),
455            TableCell::new("Profit").bold().background_color("2E75B6").text_color("FFFFFF").align_center(),
456        ]))
457        .add_row(TableRow::new(vec![
458            TableCell::new("Product Sales").text_color("000000").align_left(),
459            TableCell::new("$1,250,000").text_color("2E7D32").align_right(),
460            TableCell::new("$450,000").text_color("C62828").align_right(),
461            TableCell::new("$800,000").bold().text_color("2E7D32").align_right(),
462        ]))
463        .add_row(TableRow::new(vec![
464            TableCell::new("Services").text_color("000000").align_left(),
465            TableCell::new("$890,000").text_color("2E7D32").align_right(),
466            TableCell::new("$320,000").text_color("C62828").align_right(),
467            TableCell::new("$570,000").bold().text_color("2E7D32").align_right(),
468        ]))
469        .add_row(TableRow::new(vec![
470            TableCell::new("Total").bold().background_color("E7E6E6").text_color("000000").align_left(),
471            TableCell::new("$2,140,000").bold().background_color("E7E6E6").text_color("000000").align_right(),
472            TableCell::new("$770,000").bold().background_color("E7E6E6").text_color("000000").align_right(),
473            TableCell::new("$1,370,000").bold().background_color("C6EFCE").text_color("006100").align_right(),
474        ]))
475        .position(300000, 1600000)
476        .build();
477    
478    slides.push(
479        SlideContent::new("Financial Report - Advanced Table")
480            .table(advanced_table)
481            .title_color("1F4E79")
482            .title_bold(true)
483    );
484
485    // =========================================================================
486    // SLIDE 12: Comparison Matrix Table (NEW)
487    // =========================================================================
488    println!("📊 Slide 12: Comparison Matrix Table");
489    
490    let comparison_table = TableBuilder::new(vec![2000000, 1500000, 1500000, 1500000])
491        .add_row(TableRow::new(vec![
492            TableCell::new("Feature").bold().background_color("4472C4").text_color("FFFFFF"),
493            TableCell::new("Basic").bold().background_color("4472C4").text_color("FFFFFF"),
494            TableCell::new("Pro").bold().background_color("4472C4").text_color("FFFFFF"),
495            TableCell::new("Enterprise").bold().background_color("4472C4").text_color("FFFFFF"),
496        ]))
497        .add_row(TableRow::new(vec![
498            TableCell::new("Storage").text_color("000000"),
499            TableCell::new("5 GB").text_color("000000"),
500            TableCell::new("50 GB").text_color("000000"),
501            TableCell::new("Unlimited").bold().text_color("2E7D32"),
502        ]))
503        .add_row(TableRow::new(vec![
504            TableCell::new("Users").text_color("000000"),
505            TableCell::new("1").text_color("000000"),
506            TableCell::new("10").text_color("000000"),
507            TableCell::new("Unlimited").bold().text_color("2E7D32"),
508        ]))
509        .add_row(TableRow::new(vec![
510            TableCell::new("Support").text_color("000000"),
511            TableCell::new("Email").text_color("000000"),
512            TableCell::new("24/7 Chat").text_color("000000"),
513            TableCell::new("Dedicated").bold().text_color("2E7D32"),
514        ]))
515        .add_row(TableRow::new(vec![
516            TableCell::new("API Access").text_color("000000"),
517            TableCell::new("No").text_color("C62828"),
518            TableCell::new("Yes").text_color("2E7D32"),
519            TableCell::new("Yes + Priority").bold().text_color("2E7D32"),
520        ]))
521        .add_row(TableRow::new(vec![
522            TableCell::new("Price/month").bold().background_color("F2F2F2").text_color("000000"),
523            TableCell::new("$9").bold().background_color("F2F2F2").text_color("000000"),
524            TableCell::new("$29").bold().background_color("F2F2F2").text_color("000000"),
525            TableCell::new("$99").bold().background_color("F2F2F2").text_color("000000"),
526        ]))
527        .position(500000, 1600000)
528        .build();
529    
530    slides.push(
531        SlideContent::new("Pricing Comparison Matrix")
532            .table(comparison_table)
533            .title_color("4472C4")
534            .title_bold(true)
535    );
536
537    // =========================================================================
538    // SLIDE 13: Process Flow with Shapes (NEW - SmartArt-like)
539    // =========================================================================
540    println!("🔷 Slide 13: Process Flow (SmartArt-style)");
541    
542    // Create process flow using shapes
543    let step1 = Shape::new(ShapeType::RoundedRectangle, 300000, 2000000, 1400000, 800000)
544        .with_fill(ShapeFill::new("4472C4"))
545        .with_text("1. Research");
546    let arrow1 = Shape::new(ShapeType::RightArrow, 1800000, 2200000, 400000, 400000)
547        .with_fill(ShapeFill::new("A5A5A5"));
548    let step2 = Shape::new(ShapeType::RoundedRectangle, 2300000, 2000000, 1400000, 800000)
549        .with_fill(ShapeFill::new("ED7D31"))
550        .with_text("2. Design");
551    let arrow2 = Shape::new(ShapeType::RightArrow, 3800000, 2200000, 400000, 400000)
552        .with_fill(ShapeFill::new("A5A5A5"));
553    let step3 = Shape::new(ShapeType::RoundedRectangle, 4300000, 2000000, 1400000, 800000)
554        .with_fill(ShapeFill::new("70AD47"))
555        .with_text("3. Develop");
556    let arrow3 = Shape::new(ShapeType::RightArrow, 5800000, 2200000, 400000, 400000)
557        .with_fill(ShapeFill::new("A5A5A5"));
558    let step4 = Shape::new(ShapeType::RoundedRectangle, 6300000, 2000000, 1400000, 800000)
559        .with_fill(ShapeFill::new("5B9BD5"))
560        .with_text("4. Deploy");
561    
562    slides.push(
563        SlideContent::new("Development Process Flow")
564            .add_shape(step1)
565            .add_shape(arrow1)
566            .add_shape(step2)
567            .add_shape(arrow2)
568            .add_shape(step3)
569            .add_shape(arrow3)
570            .add_shape(step4)
571            .title_color("1F497D")
572            .title_bold(true)
573    );
574
575    // =========================================================================
576    // SLIDE 14: Organization Chart with Shapes (NEW)
577    // =========================================================================
578    println!("🔷 Slide 14: Organization Chart");
579    
580    // CEO at top
581    let ceo = Shape::new(ShapeType::RoundedRectangle, 3500000, 1400000, 2000000, 600000)
582        .with_fill(ShapeFill::new("1F4E79"))
583        .with_text("CEO");
584    
585    // Vertical line from CEO
586    let line1 = Shape::new(ShapeType::Rectangle, 4450000, 2000000, 100000, 400000)
587        .with_fill(ShapeFill::new("A5A5A5"));
588    
589    // Horizontal connector
590    let hline = Shape::new(ShapeType::Rectangle, 1950000, 2400000, 5100000, 50000)
591        .with_fill(ShapeFill::new("A5A5A5"));
592    
593    // CTO, CFO, COO
594    let cto = Shape::new(ShapeType::RoundedRectangle, 1000000, 2600000, 1800000, 500000)
595        .with_fill(ShapeFill::new("2E75B6"))
596        .with_text("CTO");
597    let cfo = Shape::new(ShapeType::RoundedRectangle, 3600000, 2600000, 1800000, 500000)
598        .with_fill(ShapeFill::new("2E75B6"))
599        .with_text("CFO");
600    let coo = Shape::new(ShapeType::RoundedRectangle, 6200000, 2600000, 1800000, 500000)
601        .with_fill(ShapeFill::new("2E75B6"))
602        .with_text("COO");
603    
604    // Vertical lines to departments
605    let vline1 = Shape::new(ShapeType::Rectangle, 1850000, 2450000, 50000, 150000)
606        .with_fill(ShapeFill::new("A5A5A5"));
607    let vline2 = Shape::new(ShapeType::Rectangle, 4450000, 2450000, 50000, 150000)
608        .with_fill(ShapeFill::new("A5A5A5"));
609    let vline3 = Shape::new(ShapeType::Rectangle, 7050000, 2450000, 50000, 150000)
610        .with_fill(ShapeFill::new("A5A5A5"));
611    
612    // Teams under CTO
613    let eng = Shape::new(ShapeType::Rectangle, 500000, 3300000, 1200000, 400000)
614        .with_fill(ShapeFill::new("BDD7EE"))
615        .with_text("Engineering");
616    let product = Shape::new(ShapeType::Rectangle, 1800000, 3300000, 1200000, 400000)
617        .with_fill(ShapeFill::new("BDD7EE"))
618        .with_text("Product");
619    
620    slides.push(
621        SlideContent::new("Organization Structure")
622            .add_shape(ceo)
623            .add_shape(line1)
624            .add_shape(hline)
625            .add_shape(cto)
626            .add_shape(cfo)
627            .add_shape(coo)
628            .add_shape(vline1)
629            .add_shape(vline2)
630            .add_shape(vline3)
631            .add_shape(eng)
632            .add_shape(product)
633            .title_color("1F4E79")
634            .title_bold(true)
635    );
636
637    // =========================================================================
638    // SLIDE 15: PDCA Cycle Diagram (NEW)
639    // =========================================================================
640    println!("🔷 Slide 15: PDCA Cycle Diagram");
641    
642    // Four quadrants for PDCA
643    let plan = Shape::new(ShapeType::RoundedRectangle, 1500000, 1600000, 2500000, 1500000)
644        .with_fill(ShapeFill::new("4472C4"))
645        .with_text("PLAN\n\nDefine goals\nand strategy");
646    let do_box = Shape::new(ShapeType::RoundedRectangle, 4500000, 1600000, 2500000, 1500000)
647        .with_fill(ShapeFill::new("ED7D31"))
648        .with_text("DO\n\nImplement\nthe plan");
649    let check = Shape::new(ShapeType::RoundedRectangle, 4500000, 3300000, 2500000, 1500000)
650        .with_fill(ShapeFill::new("70AD47"))
651        .with_text("CHECK\n\nMeasure\nresults");
652    let act = Shape::new(ShapeType::RoundedRectangle, 1500000, 3300000, 2500000, 1500000)
653        .with_fill(ShapeFill::new("FFC000"))
654        .with_text("ACT\n\nAdjust and\nimprove");
655    
656    // Arrows between quadrants
657    let arr1 = Shape::new(ShapeType::RightArrow, 4100000, 2100000, 300000, 300000)
658        .with_fill(ShapeFill::new("A5A5A5"));
659    let arr2 = Shape::new(ShapeType::DownArrow, 5600000, 3200000, 300000, 200000)
660        .with_fill(ShapeFill::new("A5A5A5"));
661    let arr3 = Shape::new(ShapeType::LeftArrow, 4100000, 3800000, 300000, 300000)
662        .with_fill(ShapeFill::new("A5A5A5"));
663    let arr4 = Shape::new(ShapeType::UpArrow, 2600000, 3200000, 300000, 200000)
664        .with_fill(ShapeFill::new("A5A5A5"));
665    
666    slides.push(
667        SlideContent::new("PDCA Continuous Improvement Cycle")
668            .add_shape(plan)
669            .add_shape(do_box)
670            .add_shape(check)
671            .add_shape(act)
672            .add_shape(arr1)
673            .add_shape(arr2)
674            .add_shape(arr3)
675            .add_shape(arr4)
676            .title_color("1F497D")
677            .title_bold(true)
678    );
679
680    // =========================================================================
681    // SLIDE 16: Pyramid Diagram (Maslow's Hierarchy) (NEW)
682    // =========================================================================
683    println!("🔷 Slide 16: Pyramid Diagram");
684    
685    // Build pyramid from bottom to top
686    let level5 = Shape::new(ShapeType::Trapezoid, 500000, 4000000, 8000000, 600000)
687        .with_fill(ShapeFill::new("C00000"))
688        .with_text("Physiological Needs - Food, Water, Shelter");
689    let level4 = Shape::new(ShapeType::Trapezoid, 1000000, 3400000, 7000000, 600000)
690        .with_fill(ShapeFill::new("ED7D31"))
691        .with_text("Safety Needs - Security, Stability");
692    let level3 = Shape::new(ShapeType::Trapezoid, 1500000, 2800000, 6000000, 600000)
693        .with_fill(ShapeFill::new("FFC000"))
694        .with_text("Love & Belonging - Relationships");
695    let level2 = Shape::new(ShapeType::Trapezoid, 2000000, 2200000, 5000000, 600000)
696        .with_fill(ShapeFill::new("70AD47"))
697        .with_text("Esteem - Achievement, Respect");
698    let level1 = Shape::new(ShapeType::Triangle, 2500000, 1500000, 4000000, 700000)
699        .with_fill(ShapeFill::new("4472C4"))
700        .with_text("Self-Actualization");
701    
702    slides.push(
703        SlideContent::new("Maslow's Hierarchy of Needs")
704            .add_shape(level5)
705            .add_shape(level4)
706            .add_shape(level3)
707            .add_shape(level2)
708            .add_shape(level1)
709            .title_color("1F497D")
710            .title_bold(true)
711    );
712
713    // =========================================================================
714    // SLIDE 17: Venn Diagram (NEW)
715    // =========================================================================
716    println!("🔷 Slide 17: Venn Diagram");
717    
718    // Three overlapping circles
719    let circle1 = Shape::new(ShapeType::Ellipse, 1500000, 1800000, 3000000, 3000000)
720        .with_fill(ShapeFill::new("4472C4"))
721        .with_text("Skills");
722    let circle2 = Shape::new(ShapeType::Ellipse, 3500000, 1800000, 3000000, 3000000)
723        .with_fill(ShapeFill::new("ED7D31"))
724        .with_text("Passion");
725    let circle3 = Shape::new(ShapeType::Ellipse, 2500000, 3200000, 3000000, 3000000)
726        .with_fill(ShapeFill::new("70AD47"))
727        .with_text("Market Need");
728    
729    // Center label
730    let center = Shape::new(ShapeType::Ellipse, 3200000, 2800000, 1600000, 800000)
731        .with_fill(ShapeFill::new("FFFFFF"))
732        .with_text("IKIGAI");
733    
734    slides.push(
735        SlideContent::new("Finding Your Ikigai - Venn Diagram")
736            .add_shape(circle1)
737            .add_shape(circle2)
738            .add_shape(circle3)
739            .add_shape(center)
740            .title_color("1F497D")
741            .title_bold(true)
742    );
743
744    // =========================================================================
745    // SLIDE 18: Timeline/Roadmap (NEW)
746    // =========================================================================
747    println!("📊 Slide 18: Project Timeline");
748    
749    let timeline_table = TableBuilder::new(vec![1500000, 1500000, 1500000, 1500000, 1500000])
750        .add_row(TableRow::new(vec![
751            TableCell::new("Q1 2024").bold().background_color("4472C4").text_color("FFFFFF"),
752            TableCell::new("Q2 2024").bold().background_color("4472C4").text_color("FFFFFF"),
753            TableCell::new("Q3 2024").bold().background_color("4472C4").text_color("FFFFFF"),
754            TableCell::new("Q4 2024").bold().background_color("4472C4").text_color("FFFFFF"),
755            TableCell::new("Q1 2025").bold().background_color("4472C4").text_color("FFFFFF"),
756        ]))
757        .add_row(TableRow::new(vec![
758            TableCell::new("Research\n& Planning").background_color("BDD7EE").text_color("1F497D"),
759            TableCell::new("Design\nPhase").background_color("BDD7EE").text_color("1F497D"),
760            TableCell::new("Development\nSprint 1-3").background_color("C6EFCE").text_color("006100"),
761            TableCell::new("Testing\n& QA").background_color("FCE4D6").text_color("C65911"),
762            TableCell::new("Launch\n& Support").background_color("E2EFDA").text_color("375623"),
763        ]))
764        .add_row(TableRow::new(vec![
765            TableCell::new("✓ Complete").bold().text_color("2E7D32"),
766            TableCell::new("✓ Complete").bold().text_color("2E7D32"),
767            TableCell::new("In Progress").text_color("ED7D31"),
768            TableCell::new("Planned").text_color("7F7F7F"),
769            TableCell::new("Planned").text_color("7F7F7F"),
770        ]))
771        .position(300000, 2000000)
772        .build();
773    
774    slides.push(
775        SlideContent::new("Project Roadmap 2024-2025")
776            .table(timeline_table)
777            .title_color("1F497D")
778            .title_bold(true)
779    );
780
781    // =========================================================================
782    // SLIDE 19: Dashboard Summary (NEW - using Dimension API)
783    // =========================================================================
784    println!("🔷 Slide 19: Dashboard with KPIs (Dimension API)");
785    
786    // KPI boxes using ratio-based positioning — automatically adapts to any slide size
787    let kpi1 = Shape::from_dimensions(ShapeType::RoundedRectangle,
788        Dimension::percent(3.0), Dimension::percent(23.0),
789        Dimension::percent(22.0), Dimension::percent(18.0),
790    ).with_fill(ShapeFill::new("4472C4")).with_text("Revenue\n\n$2.14M\n+15% YoY");
791
792    let kpi2 = Shape::from_dimensions(ShapeType::RoundedRectangle,
793        Dimension::percent(27.0), Dimension::percent(23.0),
794        Dimension::percent(22.0), Dimension::percent(18.0),
795    ).with_fill(ShapeFill::new("70AD47")).with_text("Customers\n\n12,450\n+22% YoY");
796
797    let kpi3 = Shape::from_dimensions(ShapeType::RoundedRectangle,
798        Dimension::percent(51.0), Dimension::percent(23.0),
799        Dimension::percent(22.0), Dimension::percent(18.0),
800    ).with_fill(ShapeFill::new("ED7D31")).with_text("NPS Score\n\n72\n+8 pts");
801
802    let kpi4 = Shape::from_dimensions(ShapeType::RoundedRectangle,
803        Dimension::percent(75.0), Dimension::percent(23.0),
804        Dimension::percent(22.0), Dimension::percent(18.0),
805    ).with_fill(ShapeFill::new("5B9BD5")).with_text("Retention\n\n94%\n+3% YoY");
806    
807    // Status indicators using mixed units: percent for X, inches for size
808    let status1 = Shape::new(ShapeType::Ellipse, 0, 0, 0, 0)
809        .at(Dimension::percent(14.0), Dimension::percent(42.0))
810        .with_dimensions(Dimension::Inches(0.3), Dimension::Inches(0.3))
811        .with_fill(ShapeFill::new("70AD47"));
812    let status2 = Shape::new(ShapeType::Ellipse, 0, 0, 0, 0)
813        .at(Dimension::percent(38.0), Dimension::percent(42.0))
814        .with_dimensions(Dimension::Inches(0.3), Dimension::Inches(0.3))
815        .with_fill(ShapeFill::new("70AD47"));
816    let status3 = Shape::new(ShapeType::Ellipse, 0, 0, 0, 0)
817        .at(Dimension::percent(62.0), Dimension::percent(42.0))
818        .with_dimensions(Dimension::Inches(0.3), Dimension::Inches(0.3))
819        .with_fill(ShapeFill::new("FFC000"));
820    let status4 = Shape::new(ShapeType::Ellipse, 0, 0, 0, 0)
821        .at(Dimension::percent(86.0), Dimension::percent(42.0))
822        .with_dimensions(Dimension::Inches(0.3), Dimension::Inches(0.3))
823        .with_fill(ShapeFill::new("70AD47"));
824    
825    slides.push(
826        SlideContent::new("Executive Dashboard - Q1 2024")
827            .add_shape(kpi1)
828            .add_shape(kpi2)
829            .add_shape(kpi3)
830            .add_shape(kpi4)
831            .add_shape(status1)
832            .add_shape(status2)
833            .add_shape(status3)
834            .add_shape(status4)
835            .title_color("1F497D")
836            .title_bold(true)
837    );
838
839    // =========================================================================
840    // SLIDE 20: Summary Slide (NEW)
841    // =========================================================================
842    println!("📝 Slide 20: Summary with Speaker Notes");
843    
844    slides.push(
845        SlideContent::new("Summary & Next Steps")
846            .layout(SlideLayout::TitleAndContent)
847            .title_color("1F497D")
848            .title_bold(true)
849            .add_bullet("Completed: Research, Design, Initial Development")
850            .add_bullet("In Progress: Sprint 3 Development")
851            .add_bullet("Next: QA Testing Phase (Q4 2024)")
852            .add_bullet("Launch Target: Q1 2025")
853            .add_bullet("Key Risks: Resource constraints, Timeline pressure")
854            .content_size(24)
855            .notes("Speaker Notes:\n\n1. Emphasize the progress made\n2. Highlight key achievements\n3. Address any concerns about timeline\n4. Open for Q&A")
856    );
857
858    // =========================================================================
859    // SLIDE 21: Bullet Styles (NEW v0.2.1)
860    // =========================================================================
861    println!("🔢 Slide 21: Bullet Styles (NEW)");
862    
863    // Numbered list
864    slides.push(
865        SlideContent::new("Bullet Styles - Numbered List")
866            .layout(SlideLayout::TitleAndContent)
867            .title_color("1F497D")
868            .title_bold(true)
869            .with_bullet_style(BulletStyle::Number)
870            .add_bullet("First numbered item")
871            .add_bullet("Second numbered item")
872            .add_bullet("Third numbered item")
873            .add_bullet("Fourth numbered item")
874            .content_size(28)
875    );
876
877    // =========================================================================
878    // SLIDE 22: Lettered Lists (NEW v0.2.1)
879    // =========================================================================
880    println!("🔤 Slide 22: Lettered Lists (NEW)");
881    
882    slides.push(
883        SlideContent::new("Bullet Styles - Lettered Lists")
884            .layout(SlideLayout::TitleAndContent)
885            .title_color("1F497D")
886            .title_bold(true)
887            .add_lettered("Option A - First choice")
888            .add_lettered("Option B - Second choice")
889            .add_lettered("Option C - Third choice")
890            .add_lettered("Option D - Fourth choice")
891            .content_size(28)
892    );
893
894    // =========================================================================
895    // SLIDE 23: Roman Numerals (NEW v0.2.1)
896    // =========================================================================
897    println!("🏛️ Slide 23: Roman Numerals (NEW)");
898    
899    slides.push(
900        SlideContent::new("Bullet Styles - Roman Numerals")
901            .layout(SlideLayout::TitleAndContent)
902            .title_color("1F497D")
903            .title_bold(true)
904            .with_bullet_style(BulletStyle::RomanUpper)
905            .add_bullet("Chapter I - Introduction")
906            .add_bullet("Chapter II - Background")
907            .add_bullet("Chapter III - Methodology")
908            .add_bullet("Chapter IV - Results")
909            .add_bullet("Chapter V - Conclusion")
910            .content_size(28)
911    );
912
913    // =========================================================================
914    // SLIDE 24: Custom Bullets (NEW v0.2.1)
915    // =========================================================================
916    println!("⭐ Slide 24: Custom Bullets (NEW)");
917    
918    slides.push(
919        SlideContent::new("Bullet Styles - Custom Characters")
920            .layout(SlideLayout::TitleAndContent)
921            .title_color("1F497D")
922            .title_bold(true)
923            .add_styled_bullet("Star bullet point", BulletStyle::Custom('★'))
924            .add_styled_bullet("Arrow bullet point", BulletStyle::Custom('→'))
925            .add_styled_bullet("Check bullet point", BulletStyle::Custom('✓'))
926            .add_styled_bullet("Diamond bullet point", BulletStyle::Custom('◆'))
927            .add_styled_bullet("Heart bullet point", BulletStyle::Custom('♥'))
928            .content_size(28)
929    );
930
931    // =========================================================================
932    // SLIDE 25: Sub-bullets / Hierarchy (NEW v0.2.1)
933    // =========================================================================
934    println!("📊 Slide 25: Sub-bullets Hierarchy (NEW)");
935    
936    slides.push(
937        SlideContent::new("Bullet Styles - Hierarchical Lists")
938            .layout(SlideLayout::TitleAndContent)
939            .title_color("1F497D")
940            .title_bold(true)
941            .add_bullet("Main Topic 1")
942            .add_sub_bullet("Supporting detail A")
943            .add_sub_bullet("Supporting detail B")
944            .add_bullet("Main Topic 2")
945            .add_sub_bullet("Supporting detail C")
946            .add_sub_bullet("Supporting detail D")
947            .add_bullet("Main Topic 3")
948            .content_size(24)
949    );
950
951    // =========================================================================
952    // SLIDE 26: Text Enhancements (NEW v0.2.1)
953    // =========================================================================
954    println!("✏️ Slide 26: Text Enhancements (NEW)");
955    
956    // Use BulletPoint with formatting
957    let strikethrough_bullet = BulletPoint::new("Strikethrough: This text is crossed out").strikethrough();
958    let highlight_bullet = BulletPoint::new("Highlight: Yellow background for emphasis").highlight("FFFF00");
959    let subscript_bullet = BulletPoint::new("Subscript: H₂O - for chemical formulas").subscript();
960    let superscript_bullet = BulletPoint::new("Superscript: x² - for math expressions").superscript();
961    let bold_colored = BulletPoint::new("Combined: Bold + Red color").bold().color("FF0000");
962    
963    let mut text_enhancements_slide = SlideContent::new("Text Enhancements - New Formatting")
964        .layout(SlideLayout::TitleAndContent)
965        .title_color("1F497D")
966        .title_bold(true)
967        .content_size(24);
968    text_enhancements_slide.bullets.push(strikethrough_bullet);
969    text_enhancements_slide.bullets.push(highlight_bullet);
970    text_enhancements_slide.bullets.push(subscript_bullet);
971    text_enhancements_slide.bullets.push(superscript_bullet);
972    text_enhancements_slide.bullets.push(bold_colored);
973    
974    slides.push(text_enhancements_slide);
975
976    // =========================================================================
977    // SLIDE 27: Font Size Presets (NEW v0.2.1)
978    // =========================================================================
979    println!("🔤 Slide 27: Font Size Presets (NEW)");
980    
981    // Demonstrate different font sizes per bullet
982    let large_bullet = BulletPoint::new(&format!("LARGE: {}pt - Extra large text", font_sizes::LARGE)).font_size(font_sizes::LARGE);
983    let heading_bullet = BulletPoint::new(&format!("HEADING: {}pt - Section headers", font_sizes::HEADING)).font_size(font_sizes::HEADING);
984    let body_bullet = BulletPoint::new(&format!("BODY: {}pt - Regular content", font_sizes::BODY)).font_size(font_sizes::BODY);
985    let small_bullet = BulletPoint::new(&format!("SMALL: {}pt - Smaller text", font_sizes::SMALL)).font_size(font_sizes::SMALL);
986    let caption_bullet = BulletPoint::new(&format!("CAPTION: {}pt - Captions and notes", font_sizes::CAPTION)).font_size(font_sizes::CAPTION);
987    
988    let mut font_size_slide = SlideContent::new("Font Size Presets - Each line different size")
989        .layout(SlideLayout::TitleAndContent)
990        .title_color("1F497D")
991        .title_bold(true)
992        .title_size(font_sizes::TITLE);
993    font_size_slide.bullets.push(large_bullet);
994    font_size_slide.bullets.push(heading_bullet);
995    font_size_slide.bullets.push(body_bullet);
996    font_size_slide.bullets.push(small_bullet);
997    font_size_slide.bullets.push(caption_bullet);
998    
999    slides.push(font_size_slide);
1000
1001    // =========================================================================
1002    // SLIDE 28: Theme Colors (NEW v0.2.1)
1003    // =========================================================================
1004    println!("🎨 Slide 28: Theme Colors (NEW)");
1005    
1006    // Create shapes with theme colors
1007    let corporate_shape = Shape::new(ShapeType::Rectangle, 500000, 1600000, 1800000, 800000)
1008        .with_fill(ShapeFill::new(themes::CORPORATE.primary))
1009        .with_text("Corporate");
1010    
1011    let modern_shape = Shape::new(ShapeType::Rectangle, 2500000, 1600000, 1800000, 800000)
1012        .with_fill(ShapeFill::new(themes::MODERN.primary))
1013        .with_text("Modern");
1014    
1015    let vibrant_shape = Shape::new(ShapeType::Rectangle, 4500000, 1600000, 1800000, 800000)
1016        .with_fill(ShapeFill::new(themes::VIBRANT.primary))
1017        .with_text("Vibrant");
1018    
1019    let dark_shape = Shape::new(ShapeType::Rectangle, 6500000, 1600000, 1800000, 800000)
1020        .with_fill(ShapeFill::new(themes::DARK.primary))
1021        .with_text("Dark");
1022    
1023    let nature_shape = Shape::new(ShapeType::Rectangle, 500000, 2700000, 1800000, 800000)
1024        .with_fill(ShapeFill::new(themes::NATURE.primary))
1025        .with_text("Nature");
1026    
1027    let tech_shape = Shape::new(ShapeType::Rectangle, 2500000, 2700000, 1800000, 800000)
1028        .with_fill(ShapeFill::new(themes::TECH.primary))
1029        .with_text("Tech");
1030    
1031    let carbon_shape = Shape::new(ShapeType::Rectangle, 4500000, 2700000, 1800000, 800000)
1032        .with_fill(ShapeFill::new(themes::CARBON.primary))
1033        .with_text("Carbon");
1034    
1035    slides.push(
1036        SlideContent::new("Theme Color Palettes")
1037            .layout(SlideLayout::TitleAndContent)
1038            .title_color("1F497D")
1039            .title_bold(true)
1040            .add_shape(corporate_shape)
1041            .add_shape(modern_shape)
1042            .add_shape(vibrant_shape)
1043            .add_shape(dark_shape)
1044            .add_shape(nature_shape)
1045            .add_shape(tech_shape)
1046            .add_shape(carbon_shape)
1047    );
1048
1049    // =========================================================================
1050    // SLIDE 29: Material & Carbon Design Colors (NEW v0.2.1)
1051    // =========================================================================
1052    println!("🌈 Slide 29: Material & Carbon Colors (NEW)");
1053    
1054    // Material Design colors
1055    let material_red = Shape::new(ShapeType::Rectangle, 500000, 1600000, 1200000, 600000)
1056        .with_fill(ShapeFill::new(colors::MATERIAL_RED))
1057        .with_text("M-Red");
1058    
1059    let material_blue = Shape::new(ShapeType::Rectangle, 1900000, 1600000, 1200000, 600000)
1060        .with_fill(ShapeFill::new(colors::MATERIAL_BLUE))
1061        .with_text("M-Blue");
1062    
1063    let material_green = Shape::new(ShapeType::Rectangle, 3300000, 1600000, 1200000, 600000)
1064        .with_fill(ShapeFill::new(colors::MATERIAL_GREEN))
1065        .with_text("M-Green");
1066    
1067    let material_orange = Shape::new(ShapeType::Rectangle, 4700000, 1600000, 1200000, 600000)
1068        .with_fill(ShapeFill::new(colors::MATERIAL_ORANGE))
1069        .with_text("M-Orange");
1070    
1071    let material_purple = Shape::new(ShapeType::Rectangle, 6100000, 1600000, 1200000, 600000)
1072        .with_fill(ShapeFill::new(colors::MATERIAL_PURPLE))
1073        .with_text("M-Purple");
1074    
1075    // Carbon Design colors
1076    let carbon_blue = Shape::new(ShapeType::Rectangle, 500000, 2500000, 1200000, 600000)
1077        .with_fill(ShapeFill::new(colors::CARBON_BLUE_60))
1078        .with_text("C-Blue");
1079    
1080    let carbon_green = Shape::new(ShapeType::Rectangle, 1900000, 2500000, 1200000, 600000)
1081        .with_fill(ShapeFill::new(colors::CARBON_GREEN_50))
1082        .with_text("C-Green");
1083    
1084    let carbon_red = Shape::new(ShapeType::Rectangle, 3300000, 2500000, 1200000, 600000)
1085        .with_fill(ShapeFill::new(colors::CARBON_RED_60))
1086        .with_text("C-Red");
1087    
1088    let carbon_purple = Shape::new(ShapeType::Rectangle, 4700000, 2500000, 1200000, 600000)
1089        .with_fill(ShapeFill::new(colors::CARBON_PURPLE_60))
1090        .with_text("C-Purple");
1091    
1092    let carbon_gray = Shape::new(ShapeType::Rectangle, 6100000, 2500000, 1200000, 600000)
1093        .with_fill(ShapeFill::new(colors::CARBON_GRAY_100))
1094        .with_text("C-Gray");
1095    
1096    slides.push(
1097        SlideContent::new("Material & Carbon Design Colors")
1098            .layout(SlideLayout::TitleAndContent)
1099            .title_color("1F497D")
1100            .title_bold(true)
1101            .add_shape(material_red)
1102            .add_shape(material_blue)
1103            .add_shape(material_green)
1104            .add_shape(material_orange)
1105            .add_shape(material_purple)
1106            .add_shape(carbon_blue)
1107            .add_shape(carbon_green)
1108            .add_shape(carbon_red)
1109            .add_shape(carbon_purple)
1110            .add_shape(carbon_gray)
1111    );
1112
1113    // =========================================================================
1114    // SLIDE 30: Image from Base64 (NEW v0.2.1)
1115    // =========================================================================
1116    println!("🖼️ Slide 30: Image from Base64 (NEW)");
1117    
1118    // 1x1 red PNG pixel in base64
1119    let _red_pixel_base64 = "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8z8DwHwAFBQIAX8jx0gAAAABJRU5ErkJggg==";
1120    
1121    // Create image from base64 (demonstrating the API)
1122    let _base64_image = ImageBuilder::from_base64(_red_pixel_base64, 914400, 914400, "PNG")
1123        .position(4000000, 2500000)
1124        .build();
1125    
1126    slides.push(
1127        SlideContent::new("Image Loading - New Methods")
1128            .layout(SlideLayout::TitleAndContent)
1129            .title_color("1F497D")
1130            .title_bold(true)
1131            .add_bullet("Image::new(path) - Load from file path")
1132            .add_bullet("Image::from_base64(data) - Load from base64 string")
1133            .add_bullet("Image::from_bytes(data) - Load from raw bytes")
1134            .add_bullet("ImageBuilder for fluent API configuration")
1135            .add_bullet("Built-in base64 decoder (no external deps)")
1136            .content_size(24)
1137    );
1138
1139    // =========================================================================
1140    // SLIDE 31: Feature Summary (NEW v0.2.1)
1141    // =========================================================================
1142    println!("📋 Slide 31: v0.2.1 Feature Summary (NEW)");
1143    
1144    slides.push(
1145        SlideContent::new("New Features in v0.2.1")
1146            .layout(SlideLayout::TitleAndContent)
1147            .title_color("1F497D")
1148            .title_bold(true)
1149            .add_numbered("BulletStyle: Number, Letter, Roman, Custom")
1150            .add_numbered("TextFormat: Strikethrough, Highlight")
1151            .add_numbered("TextFormat: Subscript, Superscript")
1152            .add_numbered("Font size presets in prelude")
1153            .add_numbered("Image::from_base64 and from_bytes")
1154            .add_numbered("Theme color palettes (7 themes)")
1155            .add_numbered("Material & Carbon Design colors")
1156            .content_size(24)
1157    );
1158
1159    // =========================================================================
1160    // SLIDE 32: Slide Show Settings - Comparison Table (REAL: embedded in presProps.xml)
1161    // =========================================================================
1162    println!("🎬 Slide 34: Slide Show Settings (Visual)");
1163
1164    let show_speaker = SlideShowSettings::new().pen_color(PenColor::red());
1165    let show_kiosk = SlideShowSettings::kiosk();
1166    let _show_range = SlideShowSettings::new()
1167        .show_type(ShowType::Browsed)
1168        .slide_range(SlideRange::Range { start: 1, end: 10 })
1169        .without_animation(true);
1170    let _speaker_xml = show_speaker.to_xml();
1171    let _kiosk_xml = show_kiosk.to_xml();
1172
1173    let show_table = TableBuilder::new(vec![2000000, 2000000, 2000000, 2000000])
1174        .add_row(TableRow::new(vec![
1175            TableCell::new("Setting").bold().background_color("1F4E79").text_color("FFFFFF"),
1176            TableCell::new("Speaker").bold().background_color("4472C4").text_color("FFFFFF"),
1177            TableCell::new("Kiosk").bold().background_color("ED7D31").text_color("FFFFFF"),
1178            TableCell::new("Browsed").bold().background_color("70AD47").text_color("FFFFFF"),
1179        ]))
1180        .add_row(TableRow::new(vec![
1181            TableCell::new("Loop").bold().background_color("D6E4F0"),
1182            TableCell::new("No"), TableCell::new("Yes").bold().text_color("2E7D32"),
1183            TableCell::new("No"),
1184        ]))
1185        .add_row(TableRow::new(vec![
1186            TableCell::new("Narration").bold().background_color("D6E4F0"),
1187            TableCell::new("Yes"), TableCell::new("No").text_color("C62828"),
1188            TableCell::new("Yes"),
1189        ]))
1190        .add_row(TableRow::new(vec![
1191            TableCell::new("Animation").bold().background_color("D6E4F0"),
1192            TableCell::new("Yes"), TableCell::new("Yes"),
1193            TableCell::new("No").text_color("C62828"),
1194        ]))
1195        .add_row(TableRow::new(vec![
1196            TableCell::new("Timings").bold().background_color("D6E4F0"),
1197            TableCell::new("Yes"), TableCell::new("Auto"),
1198            TableCell::new("Yes"),
1199        ]))
1200        .add_row(TableRow::new(vec![
1201            TableCell::new("Slide Range").bold().background_color("D6E4F0"),
1202            TableCell::new("All"), TableCell::new("All"),
1203            TableCell::new("1-10"),
1204        ]))
1205        .add_row(TableRow::new(vec![
1206            TableCell::new("Pen Color").bold().background_color("D6E4F0"),
1207            TableCell::new("Red").text_color("FF0000"),
1208            TableCell::new("Red").text_color("FF0000"),
1209            TableCell::new("Red").text_color("FF0000"),
1210        ]))
1211        .position(300000, 1600000)
1212        .build();
1213
1214    // Mode icons
1215    let icon_speaker = Shape::new(ShapeType::RoundedRectangle, 300000, 4200000, 2500000, 600000)
1216        .with_fill(ShapeFill::new("4472C4"))
1217        .with_text("Speaker: Full control");
1218    let icon_kiosk = Shape::new(ShapeType::RoundedRectangle, 3100000, 4200000, 2500000, 600000)
1219        .with_fill(ShapeFill::new("ED7D31"))
1220        .with_text("Kiosk: Auto-loop");
1221    let icon_browsed = Shape::new(ShapeType::RoundedRectangle, 5900000, 4200000, 2500000, 600000)
1222        .with_fill(ShapeFill::new("70AD47"))
1223        .with_text("Browsed: Scrollbar");
1224
1225    slides.push(
1226        SlideContent::new("Slide Show Settings - Mode Comparison")
1227            .table(show_table)
1228            .add_shape(icon_speaker)
1229            .add_shape(icon_kiosk)
1230            .add_shape(icon_browsed)
1231            .title_color("1F497D")
1232            .title_bold(true)
1233    );
1234
1235    // =========================================================================
1236    // SLIDE 35: Print Settings - Visual Handout Grid
1237    // =========================================================================
1238    println!("🖨️  Slide 35: Print Settings & Handouts (Visual)");
1239
1240    let print = PrintSettings::new()
1241        .print_what(PrintWhat::Handouts)
1242        .color_mode(PrintColorMode::Grayscale)
1243        .handout_layout(GenHandoutLayout::SlidesPerPage6)
1244        .frame_slides(true)
1245        .header("Q1 2025 Strategy Review")
1246        .footer("Confidential - Internal Use Only")
1247        .print_date(true)
1248        .print_page_numbers(true);
1249    let _prnpr_xml = print.to_prnpr_xml();
1250    let _handout_xml = print.to_handout_master_xml();
1251
1252    // Visual: 6-slide handout grid (2 cols x 3 rows)
1253    let hdr = Shape::new(ShapeType::Rectangle, 300000, 1500000, 4200000, 300000)
1254        .with_fill(ShapeFill::new("E7E6E6"))
1255        .with_text("Q1 2025 Strategy Review");
1256    // Row 1
1257    let s1 = Shape::new(ShapeType::Rectangle, 400000, 2000000, 1800000, 1100000)
1258        .with_line(ShapeLine::new("999999", 12700))
1259        .with_text("Slide 1");
1260    let s2 = Shape::new(ShapeType::Rectangle, 2500000, 2000000, 1800000, 1100000)
1261        .with_line(ShapeLine::new("999999", 12700))
1262        .with_text("Slide 2");
1263    // Row 2
1264    let s3 = Shape::new(ShapeType::Rectangle, 400000, 3200000, 1800000, 1100000)
1265        .with_line(ShapeLine::new("999999", 12700))
1266        .with_text("Slide 3");
1267    let s4 = Shape::new(ShapeType::Rectangle, 2500000, 3200000, 1800000, 1100000)
1268        .with_line(ShapeLine::new("999999", 12700))
1269        .with_text("Slide 4");
1270    // Row 3
1271    let s5 = Shape::new(ShapeType::Rectangle, 400000, 4400000, 1800000, 1100000)
1272        .with_line(ShapeLine::new("999999", 12700))
1273        .with_text("Slide 5");
1274    let s6 = Shape::new(ShapeType::Rectangle, 2500000, 4400000, 1800000, 1100000)
1275        .with_line(ShapeLine::new("999999", 12700))
1276        .with_text("Slide 6");
1277    let ftr = Shape::new(ShapeType::Rectangle, 300000, 5600000, 4200000, 300000)
1278        .with_fill(ShapeFill::new("E7E6E6"))
1279        .with_text("Confidential - Internal Use Only");
1280
1281    // Settings summary table on the right
1282    let print_table = TableBuilder::new(vec![1800000, 2000000])
1283        .add_row(TableRow::new(vec![
1284            TableCell::new("Print Settings").bold().background_color("1F4E79").text_color("FFFFFF"),
1285            TableCell::new("").background_color("1F4E79"),
1286        ]))
1287        .add_row(TableRow::new(vec![
1288            TableCell::new("Print What").bold().background_color("D6E4F0"),
1289            TableCell::new("Handouts"),
1290        ]))
1291        .add_row(TableRow::new(vec![
1292            TableCell::new("Color Mode").bold().background_color("D6E4F0"),
1293            TableCell::new("Grayscale"),
1294        ]))
1295        .add_row(TableRow::new(vec![
1296            TableCell::new("Layout").bold().background_color("D6E4F0"),
1297            TableCell::new("6 slides/page"),
1298        ]))
1299        .add_row(TableRow::new(vec![
1300            TableCell::new("Frame Slides").bold().background_color("D6E4F0"),
1301            TableCell::new("Yes"),
1302        ]))
1303        .add_row(TableRow::new(vec![
1304            TableCell::new("Date").bold().background_color("D6E4F0"),
1305            TableCell::new("Yes"),
1306        ]))
1307        .add_row(TableRow::new(vec![
1308            TableCell::new("Page Numbers").bold().background_color("D6E4F0"),
1309            TableCell::new("Yes"),
1310        ]))
1311        .position(5000000, 1800000)
1312        .build();
1313
1314    slides.push(
1315        SlideContent::new("Print Handout - 6 Slides Per Page")
1316            .table(print_table)
1317            .add_shape(hdr)
1318            .add_shape(s1).add_shape(s2)
1319            .add_shape(s3).add_shape(s4)
1320            .add_shape(s5).add_shape(s6)
1321            .add_shape(ftr)
1322            .title_color("1F497D")
1323            .title_bold(true)
1324    );
1325
1326    // =========================================================================
1327    // SLIDE 36: Advanced Table Merging - Actual Merged Table
1328    // =========================================================================
1329    println!("📊 Slide 36: Advanced Table Merging (Visual)");
1330
1331    // Use TableMergeMap to compute states, then build a visual table
1332    let mut merge_map = TableMergeMap::new(5, 4);
1333    merge_map.merge_cells(0, 0, 1, 4).unwrap(); // Title row spans all 4 cols
1334    merge_map.merge_cells(1, 0, 2, 1).unwrap(); // "Products" spans 2 rows
1335    merge_map.merge_cells(3, 0, 2, 1).unwrap(); // "Services" spans 2 rows
1336
1337    // Show merge state labels
1338    let state_00 = merge_map.cell_state(0, 0); // Anchor gridSpan=4
1339    let state_01 = merge_map.cell_state(0, 1); // HMerge
1340    let state_10 = merge_map.cell_state(1, 0); // Anchor rowSpan=2
1341    let state_20 = merge_map.cell_state(2, 0); // VMerge
1342    println!("   ├── (0,0): {}", state_00.to_xml_attrs().trim());
1343    println!("   ├── (0,1): {}", state_01.to_xml_attrs().trim());
1344    println!("   ├── (1,0): {}", state_10.to_xml_attrs().trim());
1345    println!("   └── (2,0): {}", state_20.to_xml_attrs().trim());
1346
1347    // Build the table with REAL merge attributes (gridSpan, rowSpan, hMerge, vMerge)
1348    let merge_table = TableBuilder::new(vec![1500000, 2000000, 2000000, 2000000])
1349        .add_row(TableRow::new(vec![
1350            TableCell::new("Q1 2025 Revenue Report").bold().background_color("1F4E79").text_color("FFFFFF").grid_span(4),
1351            TableCell::new("").background_color("1F4E79").h_merge(),
1352            TableCell::new("").background_color("1F4E79").h_merge(),
1353            TableCell::new("").background_color("1F4E79").h_merge(),
1354        ]))
1355        .add_row(TableRow::new(vec![
1356            TableCell::new("Products").bold().background_color("BDD7EE").text_color("1F497D").row_span(2),
1357            TableCell::new("Hardware").background_color("E2EFDA"),
1358            TableCell::new("$450,000").text_color("2E7D32").align_right(),
1359            TableCell::new("+12%").bold().text_color("2E7D32").align_right(),
1360        ]))
1361        .add_row(TableRow::new(vec![
1362            TableCell::new("").background_color("BDD7EE").v_merge(),
1363            TableCell::new("Software").background_color("E2EFDA"),
1364            TableCell::new("$680,000").text_color("2E7D32").align_right(),
1365            TableCell::new("+25%").bold().text_color("2E7D32").align_right(),
1366        ]))
1367        .add_row(TableRow::new(vec![
1368            TableCell::new("Services").bold().background_color("FCE4D6").text_color("C65911").row_span(2),
1369            TableCell::new("Consulting").background_color("FFF2CC"),
1370            TableCell::new("$320,000").text_color("2E7D32").align_right(),
1371            TableCell::new("+8%").bold().text_color("2E7D32").align_right(),
1372        ]))
1373        .add_row(TableRow::new(vec![
1374            TableCell::new("").background_color("FCE4D6").v_merge(),
1375            TableCell::new("Support").background_color("FFF2CC"),
1376            TableCell::new("$190,000").text_color("2E7D32").align_right(),
1377            TableCell::new("+5%").bold().text_color("2E7D32").align_right(),
1378        ]))
1379        .position(300000, 1600000)
1380        .build();
1381
1382    // Legend shapes
1383    let legend_anchor = Shape::new(ShapeType::RoundedRectangle, 300000, 4400000, 2000000, 400000)
1384        .with_fill(ShapeFill::new("4472C4"))
1385        .with_text("Anchor (gridSpan/rowSpan)");
1386    let legend_hmerge = Shape::new(ShapeType::RoundedRectangle, 2500000, 4400000, 2000000, 400000)
1387        .with_fill(ShapeFill::new("ED7D31"))
1388        .with_text("hMerge (col covered)");
1389    let legend_vmerge = Shape::new(ShapeType::RoundedRectangle, 4700000, 4400000, 2000000, 400000)
1390        .with_fill(ShapeFill::new("70AD47"))
1391        .with_text("vMerge (row covered)");
1392    let legend_normal = Shape::new(ShapeType::RoundedRectangle, 6900000, 4400000, 2000000, 400000)
1393        .with_fill(ShapeFill::new("A5A5A5"))
1394        .with_text("Normal (no merge)");
1395
1396    slides.push(
1397        SlideContent::new("Advanced Table Merging - Merged Cells")
1398            .table(merge_table)
1399            .add_shape(legend_anchor)
1400            .add_shape(legend_hmerge)
1401            .add_shape(legend_vmerge)
1402            .add_shape(legend_normal)
1403            .title_color("1F497D")
1404            .title_bold(true)
1405    );
1406
1407    // =========================================================================
1408    // Build PresentationSettings with all advanced features
1409    // =========================================================================
1410    println!("\n⚙️  Building Presentation Settings...");
1411
1412    // Slide show settings (embedded in presProps.xml as <p:showPr>)
1413    let show_settings = SlideShowSettings::new()
1414        .show_type(ShowType::Speaker)
1415        .pen_color(PenColor::red())
1416        .use_timings(true);
1417    println!("   ├── Slide Show: Speaker mode, red pen, timings enabled");
1418    println!("   │   └── XML: {} bytes", show_settings.to_xml().len());
1419
1420    // Print settings (embedded in presProps.xml as <p:prnPr>)
1421    let print_settings = PrintSettings::new()
1422        .print_what(PrintWhat::Handouts)
1423        .color_mode(PrintColorMode::Grayscale)
1424        .handout_layout(GenHandoutLayout::SlidesPerPage6)
1425        .frame_slides(true)
1426        .header("Q1 2025 Strategy Review")
1427        .footer("Confidential - Internal Use Only")
1428        .print_date(true)
1429        .print_page_numbers(true);
1430    println!("   └── Print: Handouts, 6/page, grayscale, framed");
1431    println!("       └── XML: {} bytes", print_settings.to_prnpr_xml().len());
1432
1433    let pres_settings = PresentationSettings::new()
1434        .slide_show(show_settings)
1435        .print(print_settings);
1436    println!("   All settings configured → presProps.xml");
1437
1438    // =========================================================================
1439    // Generate PPTX with real integrated features
1440    // =========================================================================
1441    println!("\n📦 Generating PPTX with integrated features...");
1442    let pptx_data = create_pptx_with_settings(
1443        "PPTX-RS Element Showcase",
1444        slides.clone(),
1445        Some(pres_settings),
1446    )?;
1447    fs::write("comprehensive_demo.pptx", &pptx_data)?;
1448    println!("   ✓ Created comprehensive_demo.pptx ({} slides, {} bytes)", 
1449             slides.len(), pptx_data.len());
1450
1451    // =========================================================================
1452    // Package Analysis - Demonstrate Reading
1453    // =========================================================================
1454    println!("\n📖 Package Analysis (Read Capability):");
1455    
1456    let package = Package::open("comprehensive_demo.pptx")?;
1457    let paths = package.part_paths();
1458    
1459    let slide_count = paths.iter()
1460        .filter(|p| p.starts_with("ppt/slides/slide") && p.ends_with(".xml"))
1461        .count();
1462    
1463    println!("   ├── Total parts: {}", package.part_count());
1464    println!("   ├── Slides: {}", slide_count);
1465    println!("   └── Package opened and analyzed successfully");
1466
1467    // =========================================================================
1468    // NEW: Parts API Demonstration
1469    // =========================================================================
1470    println!("\n🧩 Parts API Demonstration:");
1471    
1472    // SlideLayoutPart - 11 layout types
1473    println!("   ┌── SlideLayoutPart (11 layout types):");
1474    let layouts = [
1475        LayoutType::Title,
1476        LayoutType::TitleAndContent,
1477        LayoutType::SectionHeader,
1478        LayoutType::TwoContent,
1479        LayoutType::Comparison,
1480        LayoutType::TitleOnly,
1481        LayoutType::Blank,
1482        LayoutType::ContentWithCaption,
1483        LayoutType::PictureWithCaption,
1484        LayoutType::TitleAndVerticalText,
1485        LayoutType::VerticalTitleAndText,
1486    ];
1487    for (i, layout_type) in layouts.iter().enumerate() {
1488        let layout = SlideLayoutPart::new(i + 1, *layout_type);
1489        if i < 3 {
1490            println!("   │   ├── {}: {} ({})", i + 1, layout_type.name(), layout.path());
1491        }
1492    }
1493    println!("   │   └── ... and {} more layout types", layouts.len() - 3);
1494    
1495    // SlideMasterPart
1496    println!("   ├── SlideMasterPart:");
1497    let mut master = SlideMasterPart::new(1);
1498    master.set_name("Custom Master");
1499    master.add_layout_rel_id("rId2");
1500    master.add_layout_rel_id("rId3");
1501    println!("   │   ├── Name: {}", master.name());
1502    println!("   │   ├── Path: {}", master.path());
1503    println!("   │   └── Layouts: {} linked", master.layout_rel_ids().len());
1504    
1505    // ThemePart - Colors and Fonts
1506    println!("   ├── ThemePart (colors & fonts):");
1507    let mut theme = ThemePart::new(1);
1508    theme.set_name("Corporate Theme");
1509    theme.set_major_font("Arial");
1510    theme.set_minor_font("Calibri");
1511    theme.set_color("accent1", "FF5733");
1512    theme.set_color("accent2", "33FF57");
1513    let theme_xml = theme.to_xml()?;
1514    println!("   │   ├── Name: {}", theme.name());
1515    println!("   │   ├── Major Font: Arial");
1516    println!("   │   ├── Minor Font: Calibri");
1517    println!("   │   └── XML size: {} bytes", theme_xml.len());
1518    
1519    // NotesSlidePart - Speaker notes
1520    println!("   ├── NotesSlidePart (speaker notes):");
1521    let notes = NotesSlidePart::with_text(1, "Remember to:\n- Introduce yourself\n- Explain the agenda\n- Ask for questions");
1522    let notes_xml = notes.to_xml()?;
1523    println!("   │   ├── Path: {}", notes.path());
1524    println!("   │   ├── Text: \"{}...\"", &notes.notes_text()[..20.min(notes.notes_text().len())]);
1525    println!("   │   └── XML size: {} bytes", notes_xml.len());
1526    
1527    // AppPropertiesPart - Application metadata
1528    println!("   ├── AppPropertiesPart (metadata):");
1529    let mut app_props = AppPropertiesPart::new();
1530    app_props.set_company("Acme Corporation");
1531    app_props.set_slides(slides.len() as u32);
1532    let app_xml = app_props.to_xml()?;
1533    println!("   │   ├── Company: Acme Corporation");
1534    println!("   │   ├── Slides: {}", slides.len());
1535    println!("   │   └── XML size: {} bytes", app_xml.len());
1536    
1537    // MediaPart - Video/Audio formats
1538    println!("   ├── MediaPart (10 media formats):");
1539    println!("   │   ├── Video: mp4, webm, avi, wmv, mov");
1540    println!("   │   ├── Audio: mp3, wav, wma, m4a, ogg");
1541    let sample_media = MediaPart::new(1, MediaFormat::Mp4, vec![0; 100]);
1542    println!("   │   └── Sample: {} ({})", sample_media.path(), sample_media.format().mime_type());
1543    
1544    // TablePart - Table with formatting
1545    println!("   ├── TablePart (cell formatting):");
1546    let table_part = TablePart::new()
1547        .add_row(TableRowPart::new(vec![
1548            TableCellPart::new("Header 1").bold().background("4472C4"),
1549            TableCellPart::new("Header 2").bold().background("4472C4"),
1550        ]))
1551        .add_row(TableRowPart::new(vec![
1552            TableCellPart::new("Data 1").color("333333"),
1553            TableCellPart::new("Data 2").italic(),
1554        ]))
1555        .position(EMU_PER_INCH, EMU_PER_INCH * 2)
1556        .size(EMU_PER_INCH * 6, EMU_PER_INCH * 2);
1557    let table_xml = table_part.to_slide_xml(10);
1558    println!("   │   ├── Rows: {}", table_part.rows.len());
1559    println!("   │   ├── Features: bold, italic, colors, backgrounds");
1560    println!("   │   └── XML size: {} bytes", table_xml.len());
1561    
1562    // ContentTypesPart
1563    println!("   └── ContentTypesPart:");
1564    let mut content_types = ContentTypesPart::new();
1565    content_types.add_presentation();
1566    content_types.add_slide(1);
1567    content_types.add_slide_layout(1);
1568    content_types.add_slide_master(1);
1569    content_types.add_theme(1);
1570    content_types.add_core_properties();
1571    content_types.add_app_properties();
1572    let ct_xml = content_types.to_xml()?;
1573    println!("       ├── Path: {}", content_types.path());
1574    println!("       └── XML size: {} bytes", ct_xml.len());
1575
1576    // =========================================================================
1577    // NEW: Elements API Demonstration
1578    // =========================================================================
1579    println!("\n🎨 Elements API Demonstration:");
1580    
1581    // Color types
1582    println!("   ┌── Color Types:");
1583    let rgb = RgbColor::new(255, 87, 51);
1584    let rgb_hex = RgbColor::from_hex("#4472C4").unwrap();
1585    let scheme = SchemeColor::Accent1;
1586    let color = Color::rgb(100, 149, 237);
1587    println!("   │   ├── RgbColor::new(255, 87, 51) → {}", rgb.to_hex());
1588    println!("   │   ├── RgbColor::from_hex(\"#4472C4\") → {}", rgb_hex.to_hex());
1589    println!("   │   ├── SchemeColor::Accent1 → {}", scheme.as_str());
1590    println!("   │   └── Color::rgb(100, 149, 237) → XML: {}", color.to_xml().chars().take(30).collect::<String>());
1591    
1592    // Position and Size
1593    println!("   ├── Position & Size (EMU units):");
1594    let pos = Position::from_inches(1.0, 2.0);
1595    let size = Size::from_inches(4.0, 3.0);
1596    println!("   │   ├── Position::from_inches(1.0, 2.0) → x={}, y={}", pos.x, pos.y);
1597    println!("   │   ├── Size::from_inches(4.0, 3.0) → w={}, h={}", size.width, size.height);
1598    println!("   │   └── EMU_PER_INCH = {}", EMU_PER_INCH);
1599    
1600    // Transform
1601    println!("   └── Transform (position + size + rotation):");
1602    let transform = Transform::from_inches(1.0, 1.5, 3.0, 2.0).with_rotation(45.0);
1603    let transform_xml = transform.to_xml();
1604    println!("       ├── Transform::from_inches(1.0, 1.5, 3.0, 2.0)");
1605    println!("       ├── .with_rotation(45.0)");
1606    println!("       └── XML: {}...", &transform_xml[..50.min(transform_xml.len())]);
1607
1608    // =========================================================================
1609    // NEW: Advanced Features Demonstration
1610    // =========================================================================
1611    println!("\n🚀 Advanced Features Demonstration:");
1612
1613    // -------------------------------------------------------------------------
1614    // Complex Table Examples
1615    // -------------------------------------------------------------------------
1616    println!("   ┌── Complex Table Examples:");
1617    
1618    // Example 1: Financial Report Table
1619    println!("   │   ┌── Financial Report Table (5x4 with formatting):");
1620    let financial_table = TablePart::new()
1621        .add_row(TableRowPart::new(vec![
1622            TableCellPart::new("Q1 2024 Financial Summary")
1623                .col_span(4)
1624                .bold()
1625                .center()
1626                .background("1F4E79")
1627                .color("FFFFFF")
1628                .font_size(14)
1629                .font("Arial Black"),
1630        ]))
1631        .add_row(TableRowPart::new(vec![
1632            TableCellPart::new("Category").bold().center().background("2E75B6").color("FFFFFF"),
1633            TableCellPart::new("Revenue").bold().center().background("2E75B6").color("FFFFFF"),
1634            TableCellPart::new("Expenses").bold().center().background("2E75B6").color("FFFFFF"),
1635            TableCellPart::new("Profit").bold().center().background("2E75B6").color("FFFFFF"),
1636        ]))
1637        .add_row(TableRowPart::new(vec![
1638            TableCellPart::new("Product Sales").align(HorizontalAlign::Left),
1639            TableCellPart::new("$1,250,000").align(HorizontalAlign::Right).color("2E7D32"),
1640            TableCellPart::new("$450,000").align(HorizontalAlign::Right).color("C62828"),
1641            TableCellPart::new("$800,000").align(HorizontalAlign::Right).bold().color("2E7D32"),
1642        ]))
1643        .add_row(TableRowPart::new(vec![
1644            TableCellPart::new("Services").align(HorizontalAlign::Left),
1645            TableCellPart::new("$890,000").align(HorizontalAlign::Right).color("2E7D32"),
1646            TableCellPart::new("$320,000").align(HorizontalAlign::Right).color("C62828"),
1647            TableCellPart::new("$570,000").align(HorizontalAlign::Right).bold().color("2E7D32"),
1648        ]))
1649        .add_row(TableRowPart::new(vec![
1650            TableCellPart::new("Total").bold().background("E7E6E6"),
1651            TableCellPart::new("$2,140,000").bold().align(HorizontalAlign::Right).background("E7E6E6"),
1652            TableCellPart::new("$770,000").bold().align(HorizontalAlign::Right).background("E7E6E6"),
1653            TableCellPart::new("$1,370,000").bold().align(HorizontalAlign::Right).background("C6EFCE").color("006100"),
1654        ]))
1655        .position(EMU_PER_INCH / 2, EMU_PER_INCH * 2)
1656        .size(EMU_PER_INCH * 8, EMU_PER_INCH * 3);
1657    let fin_xml = financial_table.to_slide_xml(100);
1658    println!("   │   │   ├── Merged header spanning 4 columns");
1659    println!("   │   │   ├── Color-coded values (green=positive, red=negative)");
1660    println!("   │   │   ├── Custom fonts and sizes");
1661    println!("   │   │   └── XML: {} bytes", fin_xml.len());
1662
1663    // Example 2: Comparison Matrix
1664    println!("   │   ├── Comparison Matrix (features vs products):");
1665    let _matrix_table = TablePart::new()
1666        .add_row(TableRowPart::new(vec![
1667            TableCellPart::new("Feature").bold().center().background("4472C4").color("FFFFFF"),
1668            TableCellPart::new("Basic").bold().center().background("4472C4").color("FFFFFF"),
1669            TableCellPart::new("Pro").bold().center().background("4472C4").color("FFFFFF"),
1670            TableCellPart::new("Enterprise").bold().center().background("4472C4").color("FFFFFF"),
1671        ]))
1672        .add_row(TableRowPart::new(vec![
1673            TableCellPart::new("Storage").align(HorizontalAlign::Left),
1674            TableCellPart::new("5 GB").center(),
1675            TableCellPart::new("50 GB").center(),
1676            TableCellPart::new("Unlimited").center().bold().color("2E7D32"),
1677        ]))
1678        .add_row(TableRowPart::new(vec![
1679            TableCellPart::new("Users").align(HorizontalAlign::Left),
1680            TableCellPart::new("1").center(),
1681            TableCellPart::new("10").center(),
1682            TableCellPart::new("Unlimited").center().bold().color("2E7D32"),
1683        ]))
1684        .add_row(TableRowPart::new(vec![
1685            TableCellPart::new("Support").align(HorizontalAlign::Left),
1686            TableCellPart::new("Email").center(),
1687            TableCellPart::new("24/7 Chat").center(),
1688            TableCellPart::new("Dedicated").center().bold().color("2E7D32"),
1689        ]))
1690        .add_row(TableRowPart::new(vec![
1691            TableCellPart::new("Price/mo").bold().background("F2F2F2"),
1692            TableCellPart::new("$9").center().bold().background("F2F2F2"),
1693            TableCellPart::new("$29").center().bold().background("F2F2F2"),
1694            TableCellPart::new("$99").center().bold().background("F2F2F2"),
1695        ]));
1696    println!("   │   │   └── 5x4 matrix with alternating styles");
1697
1698    // Example 3: Schedule/Timeline Table
1699    println!("   │   └── Schedule Table (with row spans):");
1700    let _schedule_table = TablePart::new()
1701        .add_row(TableRowPart::new(vec![
1702            TableCellPart::new("Time").bold().center().background("70AD47").color("FFFFFF"),
1703            TableCellPart::new("Monday").bold().center().background("70AD47").color("FFFFFF"),
1704            TableCellPart::new("Tuesday").bold().center().background("70AD47").color("FFFFFF"),
1705        ]))
1706        .add_row(TableRowPart::new(vec![
1707            TableCellPart::new("9:00 AM").center().background("E2EFDA"),
1708            TableCellPart::new("Team Standup").center().row_span(2).valign(VerticalAlign::Middle).background("BDD7EE"),
1709            TableCellPart::new("Code Review").center(),
1710        ]))
1711        .add_row(TableRowPart::new(vec![
1712            TableCellPart::new("10:00 AM").center().background("E2EFDA"),
1713            TableCellPart::merged(),
1714            TableCellPart::new("Sprint Planning").center().background("FCE4D6"),
1715        ]));
1716    println!("   │       └── Row spans for multi-hour events");
1717
1718    // -------------------------------------------------------------------------
1719    // Complex Animation Sequences
1720    // -------------------------------------------------------------------------
1721    println!("   ├── Complex Animation Sequences:");
1722    
1723    // Sequence 1: Title entrance with staggered content
1724    println!("   │   ┌── Staggered Entrance Sequence:");
1725    let title_anim = Animation::new(2, AnimationEffect::Fade)
1726        .trigger(AnimationTrigger::OnClick)
1727        .duration(500);
1728    let content1 = Animation::new(3, AnimationEffect::FlyIn)
1729        .trigger(AnimationTrigger::AfterPrevious)
1730        .direction(AnimationDirection::Left)
1731        .duration(400)
1732        .delay(200);
1733    let content2 = Animation::new(4, AnimationEffect::FlyIn)
1734        .trigger(AnimationTrigger::AfterPrevious)
1735        .direction(AnimationDirection::Left)
1736        .duration(400)
1737        .delay(100);
1738    let content3 = Animation::new(5, AnimationEffect::FlyIn)
1739        .trigger(AnimationTrigger::AfterPrevious)
1740        .direction(AnimationDirection::Left)
1741        .duration(400)
1742        .delay(100);
1743    let staggered = SlideAnimations::new()
1744        .add(title_anim)
1745        .add(content1)
1746        .add(content2)
1747        .add(content3)
1748        .transition(SlideTransition::new(TransitionEffect::Push).direction(AnimationDirection::Left).duration(750));
1749    let staggered_xml = staggered.to_timing_xml()?;
1750    println!("   │   │   ├── Title: Fade on click");
1751    println!("   │   │   ├── Content 1-3: FlyIn with 100ms stagger");
1752    println!("   │   │   ├── Transition: Push from left (750ms)");
1753    println!("   │   │   └── XML: {} bytes", staggered_xml.len());
1754
1755    // Sequence 2: Emphasis and exit
1756    println!("   │   ├── Emphasis + Exit Sequence:");
1757    let emphasis = Animation::new(6, AnimationEffect::Pulse)
1758        .trigger(AnimationTrigger::OnClick)
1759        .duration(1000)
1760        .repeat(3);
1761    let exit = Animation::new(6, AnimationEffect::FadeOut)
1762        .trigger(AnimationTrigger::AfterPrevious)
1763        .duration(500);
1764    let _emphasis_seq = SlideAnimations::new()
1765        .add(emphasis)
1766        .add(exit);
1767    println!("   │   │   ├── Pulse 3x on click, then fade out");
1768    println!("   │   │   └── Same shape, sequential effects");
1769
1770    // Sequence 3: Motion path
1771    println!("   │   └── Motion Path Animation:");
1772    let _motion = Animation::new(7, AnimationEffect::Lines)
1773        .trigger(AnimationTrigger::OnClick)
1774        .duration(2000);
1775    println!("   │       └── Custom path: Lines, Arcs, Turns, Loops");
1776
1777    // -------------------------------------------------------------------------
1778    // SmartArt Combinations
1779    // -------------------------------------------------------------------------
1780    println!("   ├── SmartArt Layout Examples:");
1781    
1782    // Process flow
1783    println!("   │   ┌── Process Flow (5 steps):");
1784    let process = SmartArtPart::new(1, SmartArtLayout::BasicProcess)
1785        .add_items(vec!["Research", "Design", "Develop", "Test", "Deploy"])
1786        .position(EMU_PER_INCH / 2, EMU_PER_INCH * 2)
1787        .size(EMU_PER_INCH * 8, EMU_PER_INCH * 2);
1788    println!("   │   │   └── {} nodes in horizontal flow", process.nodes().len());
1789
1790    // Organization chart
1791    println!("   │   ├── Organization Chart:");
1792    let org = SmartArtPart::new(2, SmartArtLayout::OrgChart)
1793        .add_items(vec!["CEO", "CTO", "CFO", "VP Engineering", "VP Sales"]);
1794    println!("   │   │   └── Hierarchical structure with {} positions", org.nodes().len());
1795
1796    // Cycle diagram
1797    println!("   │   ├── Cycle Diagram:");
1798    let cycle = SmartArtPart::new(3, SmartArtLayout::BasicCycle)
1799        .add_items(vec!["Plan", "Do", "Check", "Act"]);
1800    println!("   │   │   └── PDCA cycle with {} phases", cycle.nodes().len());
1801
1802    // Venn diagram
1803    println!("   │   ├── Venn Diagram:");
1804    let _venn = SmartArtPart::new(4, SmartArtLayout::BasicVenn)
1805        .add_items(vec!["Skills", "Passion", "Market Need"]);
1806    println!("   │   │   └── 3-circle Venn for Ikigai concept");
1807
1808    // Pyramid
1809    println!("   │   └── Pyramid:");
1810    let pyramid = SmartArtPart::new(5, SmartArtLayout::BasicPyramid)
1811        .add_items(vec!["Self-Actualization", "Esteem", "Love/Belonging", "Safety", "Physiological"]);
1812    println!("   │       └── Maslow's hierarchy with {} levels", pyramid.nodes().len());
1813
1814    // -------------------------------------------------------------------------
1815    // 3D Model Configurations
1816    // -------------------------------------------------------------------------
1817    println!("   ├── 3D Model Configurations:");
1818    
1819    // Product showcase
1820    println!("   │   ┌── Product Showcase:");
1821    let _product_3d = Model3DPart::new(1, Model3DFormat::Glb, vec![0; 100])
1822        .camera(CameraPreset::IsometricTopUp)
1823        .rotation(0.0, 45.0, 0.0)
1824        .zoom(1.2)
1825        .position(EMU_PER_INCH * 2, EMU_PER_INCH * 2)
1826        .size(EMU_PER_INCH * 4, EMU_PER_INCH * 4);
1827    println!("   │   │   ├── Camera: Isometric top-up view");
1828    println!("   │   │   ├── Rotation: 45° Y-axis for best angle");
1829    println!("   │   │   └── Zoom: 1.2x for detail");
1830
1831    // Architectural model
1832    println!("   │   ├── Architectural Model:");
1833    let _arch_3d = Model3DPart::new(2, Model3DFormat::Gltf, vec![0; 100])
1834        .camera(CameraPreset::Front)
1835        .rotation(15.0, -30.0, 0.0)
1836        .ambient_light("FFFFCC");
1837    println!("   │   │   ├── Camera: Front view with tilt");
1838    println!("   │   │   └── Ambient: Warm lighting (FFFFCC)");
1839
1840    // Technical diagram
1841    println!("   │   └── Technical Diagram:");
1842    let _tech_3d = Model3DPart::new(3, Model3DFormat::Obj, vec![0; 100])
1843        .camera(CameraPreset::IsometricOffAxis1Top)
1844        .rotation(0.0, 0.0, 0.0);
1845    println!("   │       └── Camera: Off-axis isometric for exploded view");
1846
1847    // -------------------------------------------------------------------------
1848    // Theme + Master + Layout Combination
1849    // -------------------------------------------------------------------------
1850    println!("   ├── Theme + Master + Layout Integration:");
1851    
1852    // Corporate theme
1853    let mut corp_theme = ThemePart::new(1);
1854    corp_theme.set_name("Corporate Blue");
1855    corp_theme.set_major_font("Segoe UI");
1856    corp_theme.set_minor_font("Segoe UI Light");
1857    corp_theme.set_color("dk1", "000000");
1858    corp_theme.set_color("lt1", "FFFFFF");
1859    corp_theme.set_color("dk2", "1F497D");
1860    corp_theme.set_color("lt2", "EEECE1");
1861    corp_theme.set_color("accent1", "4472C4");
1862    corp_theme.set_color("accent2", "ED7D31");
1863    corp_theme.set_color("accent3", "A5A5A5");
1864    corp_theme.set_color("accent4", "FFC000");
1865    corp_theme.set_color("accent5", "5B9BD5");
1866    corp_theme.set_color("accent6", "70AD47");
1867    let theme_xml = corp_theme.to_xml()?;
1868    println!("   │   ├── Theme: Corporate Blue");
1869    println!("   │   │   ├── Fonts: Segoe UI / Segoe UI Light");
1870    println!("   │   │   ├── 12 color slots defined");
1871    println!("   │   │   └── XML: {} bytes", theme_xml.len());
1872
1873    // Master with multiple layouts
1874    let mut corp_master = SlideMasterPart::new(1);
1875    corp_master.set_name("Corporate Master");
1876    corp_master.add_layout_rel_id("rId2"); // Title
1877    corp_master.add_layout_rel_id("rId3"); // Title + Content
1878    corp_master.add_layout_rel_id("rId4"); // Section Header
1879    corp_master.add_layout_rel_id("rId5"); // Two Content
1880    corp_master.add_layout_rel_id("rId6"); // Comparison
1881    corp_master.add_layout_rel_id("rId7"); // Title Only
1882    corp_master.add_layout_rel_id("rId8"); // Blank
1883    println!("   │   └── Master: {} with {} layouts linked", corp_master.name(), corp_master.layout_rel_ids().len());
1884
1885    // -------------------------------------------------------------------------
1886    // VBA + Custom XML Integration
1887    // -------------------------------------------------------------------------
1888    println!("   ├── VBA + Custom XML Integration:");
1889    
1890    // VBA with multiple modules
1891    let _vba_project = VbaProjectPart::new()
1892        .add_module(VbaModule::new("AutoRun", r#"
1893Sub Auto_Open()
1894    MsgBox "Welcome to the presentation!"
1895End Sub
1896
1897Sub NavigateToSlide(slideNum As Integer)
1898    SlideShowWindows(1).View.GotoSlide slideNum
1899End Sub
1900"#))
1901        .add_module(VbaModule::new("DataHelpers", r#"
1902Function GetCustomData(key As String) As String
1903    ' Read from Custom XML part
1904    GetCustomData = ActivePresentation.CustomXMLParts(1).SelectSingleNode("//" & key).Text
1905End Function
1906"#))
1907        .add_module(VbaModule::class("SlideController", r#"
1908Private currentSlide As Integer
1909
1910Public Sub NextSlide()
1911    currentSlide = currentSlide + 1
1912    NavigateToSlide currentSlide
1913End Sub
1914"#));
1915    println!("   │   ├── VBA Project:");
1916    println!("   │   │   ├── AutoRun: Auto_Open, NavigateToSlide");
1917    println!("   │   │   ├── DataHelpers: GetCustomData (reads Custom XML)");
1918    println!("   │   │   └── SlideController: Class for navigation");
1919
1920    // Custom XML with structured data
1921    let app_config = CustomXmlPart::new(1, "presentationConfig")
1922        .namespace("http://company.com/pptx/config")
1923        .property("version", "2.1.0")
1924        .property("author", "Demo User")
1925        .property("department", "Engineering")
1926        .property("confidentiality", "Internal")
1927        .property("lastModified", "2024-01-15T10:30:00Z");
1928    let config_xml = app_config.to_xml()?;
1929    println!("   │   └── Custom XML:");
1930    println!("   │       ├── Namespace: http://company.com/pptx/config");
1931    println!("   │       ├── Properties: version, author, department, etc.");
1932    println!("   │       └── XML: {} bytes", config_xml.len());
1933
1934    // -------------------------------------------------------------------------
1935    // Embedded Fonts with Variants
1936    // -------------------------------------------------------------------------
1937    println!("   ├── Embedded Font Collection:");
1938    let mut font_collection = EmbeddedFontCollection::new();
1939    font_collection.add("Corporate Sans", vec![0; 1000]);
1940    font_collection.add_with_type("Corporate Sans", vec![0; 1000], FontEmbedType::Bold);
1941    font_collection.add_with_type("Corporate Sans", vec![0; 1000], FontEmbedType::Italic);
1942    font_collection.add_with_type("Corporate Sans", vec![0; 1000], FontEmbedType::BoldItalic);
1943    font_collection.add("Code Mono", vec![0; 800]);
1944    let fonts_xml = font_collection.to_xml();
1945    println!("   │   ├── Corporate Sans: Regular, Bold, Italic, BoldItalic");
1946    println!("   │   ├── Code Mono: Regular");
1947    println!("   │   ├── Total: {} font files", font_collection.len());
1948    println!("   │   └── XML: {} bytes", fonts_xml.len());
1949
1950    // -------------------------------------------------------------------------
1951    // Handout with Full Configuration
1952    // -------------------------------------------------------------------------
1953    println!("   └── Handout Master Configuration:");
1954    let handout = HandoutMasterPart::new()
1955        .layout(HandoutLayout::SlidesPerPage6)
1956        .header("Q1 2024 Strategy Review")
1957        .footer("Confidential - Internal Use Only");
1958    let handout_xml = handout.to_xml()?;
1959    println!("       ├── Layout: 6 slides per page");
1960    println!("       ├── Header: Q1 2024 Strategy Review");
1961    println!("       ├── Footer: Confidential - Internal Use Only");
1962    println!("       └── XML: {} bytes", handout_xml.len());
1963
1964    // =========================================================================
1965    // Summary
1966    // =========================================================================
1967    println!("\n╔══════════════════════════════════════════════════════════════╗");
1968    println!("║                    Element Coverage Summary                   ║");
1969    println!("╠══════════════════════════════════════════════════════════════╣");
1970    println!("║  LAYOUTS (6 types):                                          ║");
1971    println!("║    ✓ CenteredTitle    ✓ TitleOnly      ✓ TitleAndContent     ║");
1972    println!("║    ✓ TitleAndBigContent  ✓ TwoColumn   ✓ Blank               ║");
1973    println!("╠══════════════════════════════════════════════════════════════╣");
1974    println!("║  TEXT FORMATTING:                                            ║");
1975    println!("║    ✓ Bold            ✓ Italic         ✓ Underline            ║");
1976    println!("║    ✓ Font Size       ✓ Font Color     ✓ Title/Content styles ║");
1977    println!("╠══════════════════════════════════════════════════════════════╣");
1978    println!("║  TABLES:                                                     ║");
1979    println!("║    ✓ Multiple rows/columns  ✓ Bold cells  ✓ Background colors║");
1980    println!("║    ✓ Header styling         ✓ Position control               ║");
1981    println!("╠══════════════════════════════════════════════════════════════╣");
1982    println!("║  CHARTS:                                                     ║");
1983    println!("║    ✓ Bar Chart       ✓ Line Chart     ✓ Pie Chart            ║");
1984    println!("║    ✓ Multiple series ✓ Categories                            ║");
1985    println!("╠══════════════════════════════════════════════════════════════╣");
1986    println!("║  SHAPES:                                                     ║");
1987    println!("║    ✓ Rectangle       ✓ Ellipse        ✓ RoundedRectangle     ║");
1988    println!("║    ✓ Triangle        ✓ Diamond        ✓ Color fills          ║");
1989    println!("║    ✓ Gradient fills  ✓ Transparency   ✓ Text in shapes       ║");
1990    println!("╠══════════════════════════════════════════════════════════════╣");
1991    println!("║  CONNECTORS (NEW):                                           ║");
1992    println!("║    ✓ Straight        ✓ Elbow          ✓ Curved               ║");
1993    println!("║    ✓ Arrow types     ✓ Dash styles    ✓ Line colors/widths   ║");
1994    println!("╠══════════════════════════════════════════════════════════════╣");
1995    println!("║  IMAGES:                                                     ║");
1996    println!("║    ✓ Image placeholders  ✓ Position   ✓ Dimensions           ║");
1997    println!("╠══════════════════════════════════════════════════════════════╣");
1998    println!("║  PACKAGE:                                                    ║");
1999    println!("║    ✓ Create PPTX     ✓ Read PPTX      ✓ Analyze contents     ║");
2000    println!("╠══════════════════════════════════════════════════════════════╣");
2001    println!("║  PARTS API (NEW):                                            ║");
2002    println!("║    ✓ SlideLayoutPart (11 types)  ✓ SlideMasterPart           ║");
2003    println!("║    ✓ ThemePart (colors/fonts)    ✓ NotesSlidePart            ║");
2004    println!("║    ✓ AppPropertiesPart           ✓ MediaPart (10 formats)    ║");
2005    println!("║    ✓ TablePart (cell formatting) ✓ ContentTypesPart          ║");
2006    println!("╠══════════════════════════════════════════════════════════════╣");
2007    println!("║  ELEMENTS API:                                               ║");
2008    println!("║    ✓ RgbColor        ✓ SchemeColor    ✓ Color enum           ║");
2009    println!("║    ✓ Position        ✓ Size           ✓ Transform            ║");
2010    println!("║    ✓ EMU conversions (inches, cm, mm, pt)                    ║");
2011    println!("╠══════════════════════════════════════════════════════════════╣");
2012    println!("║  ADVANCED FEATURES (NEW):                                    ║");
2013    println!("║    ✓ Animation (50+ effects)  ✓ Transitions (27 types)       ║");
2014    println!("║    ✓ SmartArt (25 layouts)    ✓ 3D Models (GLB/GLTF/OBJ)     ║");
2015    println!("║    ✓ VBA Macros (.pptm)       ✓ Embedded Fonts               ║");
2016    println!("║    ✓ Custom XML               ✓ Handout Master               ║");
2017    println!("║    ✓ Table borders/alignment  ✓ Merged cells                 ║");
2018    println!("╠══════════════════════════════════════════════════════════════╣");
2019    println!("║  DIMENSION API (NEW):                                        ║");
2020    println!("║    ✓ EMU / Inches / Cm / Pt / Ratio / Percent units          ║");
2021    println!("║    ✓ from_dimensions() constructor                           ║");
2022    println!("║    ✓ Fluent .at() and .with_dimensions() chaining            ║");
2023    println!("║    ✓ Mixed-unit positioning (e.g. inches + percent)          ║");
2024    println!("╠══════════════════════════════════════════════════════════════╣");
2025    println!("║  Output: comprehensive_demo.pptx ({} slides, {} KB)         ║", 
2026             slides.len(), pptx_data.len() / 1024);
2027    println!("╚══════════════════════════════════════════════════════════════╝");
2028
2029    Ok(())
2030}
Source

pub fn from_hex(hex: &str) -> Option<Self>

Parse from hex string (e.g., “FF0000” or “#FF0000”)

Examples found in repository?
examples/comprehensive_demo.rs (line 1584)
69fn main() -> Result<(), Box<dyn std::error::Error>> {
70    println!("╔══════════════════════════════════════════════════════════════╗");
71    println!("║       PPTX-RS Element Showcase - Complete Coverage           ║");
72    println!("╚══════════════════════════════════════════════════════════════╝\n");
73
74    let mut slides = Vec::new();
75
76    // =========================================================================
77    // SLIDE 1: CenteredTitle Layout + Title Formatting
78    // =========================================================================
79    println!("📐 Slide 1: CenteredTitle Layout + Title Formatting");
80    slides.push(
81        SlideContent::new("PPTX-RS Element Showcase")
82            .layout(SlideLayout::CenteredTitle)
83            .title_size(54)
84            .title_bold(true)
85            .title_color("1F497D")
86    );
87
88    // =========================================================================
89    // SLIDE 2: TitleOnly Layout
90    // =========================================================================
91    println!("📐 Slide 2: TitleOnly Layout");
92    slides.push(
93        SlideContent::new("Section: Slide Layouts")
94            .layout(SlideLayout::TitleOnly)
95            .title_size(48)
96            .title_bold(true)
97            .title_color("C0504D")
98    );
99
100    // =========================================================================
101    // SLIDE 3: TitleAndContent Layout + All Text Formatting
102    // =========================================================================
103    println!("📝 Slide 3: TitleAndContent + Text Formatting");
104    slides.push(
105        SlideContent::new("Text Formatting Options")
106            .layout(SlideLayout::TitleAndContent)
107            .title_color("1F497D")
108            .title_bold(true)
109            .title_italic(true)
110            .title_underline(true)
111            .title_size(44)
112            .add_bullet("Normal text (default)")
113            .add_bullet("Bold content text")
114            .add_bullet("Italic content text")
115            .add_bullet("Underlined content")
116            .add_bullet("Custom font size (28pt)")
117            .add_bullet("Custom color (#4F81BD)")
118            .content_bold(true)
119            .content_italic(true)
120            .content_underline(true)
121            .content_size(28)
122            .content_color("4F81BD")
123    );
124
125    // =========================================================================
126    // SLIDE 4: TitleAndBigContent Layout
127    // =========================================================================
128    println!("📐 Slide 4: TitleAndBigContent Layout");
129    slides.push(
130        SlideContent::new("Key Highlights")
131            .layout(SlideLayout::TitleAndBigContent)
132            .title_color("1F497D")
133            .add_bullet("Large content area for emphasis")
134            .add_bullet("Perfect for key messages")
135            .add_bullet("Smaller title, bigger content")
136            .content_bold(true)
137            .content_size(32)
138    );
139
140    // =========================================================================
141    // SLIDE 5: TwoColumn Layout
142    // =========================================================================
143    println!("📐 Slide 5: TwoColumn Layout");
144    slides.push(
145        SlideContent::new("Two Column Comparison")
146            .layout(SlideLayout::TwoColumn)
147            .title_color("1F497D")
148            .add_bullet("Left Column Item 1")
149            .add_bullet("Left Column Item 2")
150            .add_bullet("Left Column Item 3")
151            .add_bullet("Right Column Item 1")
152            .add_bullet("Right Column Item 2")
153            .add_bullet("Right Column Item 3")
154            .content_size(24)
155    );
156
157    // =========================================================================
158    // SLIDE 6: Blank Layout
159    // =========================================================================
160    println!("📐 Slide 6: Blank Layout");
161    slides.push(
162        SlideContent::new("")
163            .layout(SlideLayout::Blank)
164    );
165
166    // =========================================================================
167    // SLIDE 7: Table with All Cell Styling Options
168    // =========================================================================
169    println!("📊 Slide 7: Table with Cell Styling");
170    let styled_table = TableBuilder::new(vec![1500000, 1500000, 1500000])
171        .add_row(TableRow::new(vec![
172            TableCell::new("Header 1").bold().background_color("1F497D"),
173            TableCell::new("Header 2").bold().background_color("4F81BD"),
174            TableCell::new("Header 3").bold().background_color("8064A2"),
175        ]))
176        .add_row(TableRow::new(vec![
177            TableCell::new("Bold Cell").bold(),
178            TableCell::new("Normal Cell"),
179            TableCell::new("Colored").background_color("9BBB59"),
180        ]))
181        .add_row(TableRow::new(vec![
182            TableCell::new("Red BG").background_color("C0504D"),
183            TableCell::new("Green BG").background_color("9BBB59"),
184            TableCell::new("Blue BG").background_color("4F81BD"),
185        ]))
186        .add_row(TableRow::new(vec![
187            TableCell::new("Row 3 Col 1"),
188            TableCell::new("Row 3 Col 2"),
189            TableCell::new("Row 3 Col 3").bold().background_color("F79646"),
190        ]))
191        .position(500000, 1800000)
192        .build();
193    
194    slides.push(
195        SlideContent::new("Table with Cell Styling")
196            .table(styled_table)
197            .title_color("1F497D")
198    );
199
200    // =========================================================================
201    // SLIDE 8: Charts (Bar, Line, Pie)
202    // =========================================================================
203    println!("📈 Slide 8: Chart Types");
204    
205    // Create chart data structures (for demonstration)
206    let _bar_chart = ChartBuilder::new("Sales by Region", ChartType::Bar)
207        .categories(vec!["North", "South", "East", "West"])
208        .add_series(ChartSeries::new("2023", vec![100.0, 80.0, 120.0, 90.0]))
209        .add_series(ChartSeries::new("2024", vec![120.0, 95.0, 140.0, 110.0]))
210        .build();
211    
212    let _line_chart = ChartBuilder::new("Monthly Trend", ChartType::Line)
213        .categories(vec!["Jan", "Feb", "Mar", "Apr", "May", "Jun"])
214        .add_series(ChartSeries::new("Revenue", vec![10.0, 12.0, 15.0, 14.0, 18.0, 22.0]))
215        .build();
216    
217    let _pie_chart = ChartBuilder::new("Market Share", ChartType::Pie)
218        .categories(vec!["Product A", "Product B", "Product C", "Others"])
219        .add_series(ChartSeries::new("Share", vec![40.0, 30.0, 20.0, 10.0]))
220        .build();
221    
222    slides.push(
223        SlideContent::new("Chart Types: Bar, Line, Pie")
224            .with_chart()
225            .title_color("1F497D")
226            .add_bullet("Bar Chart: Compare categories")
227            .add_bullet("Line Chart: Show trends over time")
228            .add_bullet("Pie Chart: Show proportions")
229            .content_size(24)
230    );
231
232    // =========================================================================
233    // SLIDE 9: Shapes with Different Fills
234    // =========================================================================
235    println!("🔷 Slide 9: Shapes with Fills");
236    
237    let rect = Shape::new(ShapeType::Rectangle, 500000, 1600000, 2000000, 1000000)
238        .with_fill(ShapeFill::new("4F81BD"))
239        .with_text("Rectangle");
240    
241    let ellipse = Shape::new(ShapeType::Ellipse, 3000000, 1600000, 2000000, 1000000)
242        .with_fill(ShapeFill::new("9BBB59"))
243        .with_text("Ellipse");
244    
245    let rounded = Shape::new(ShapeType::RoundedRectangle, 5500000, 1600000, 2000000, 1000000)
246        .with_fill(ShapeFill::new("C0504D"))
247        .with_text("Rounded");
248    
249    let triangle = Shape::new(ShapeType::Triangle, 1500000, 3000000, 1500000, 1200000)
250        .with_fill(ShapeFill::new("8064A2"))
251        .with_text("Triangle");
252    
253    let diamond = Shape::new(ShapeType::Diamond, 4000000, 3000000, 1500000, 1200000)
254        .with_fill(ShapeFill::new("F79646"))
255        .with_text("Diamond");
256    
257    slides.push(
258        SlideContent::new("Shape Types with Color Fills")
259            .add_shape(rect)
260            .add_shape(ellipse)
261            .add_shape(rounded)
262            .add_shape(triangle)
263            .add_shape(diamond)
264            .title_color("1F497D")
265    );
266
267    // =========================================================================
268    // SLIDE 10: Gradient Fills (NEW)
269    // =========================================================================
270    println!("🌈 Slide 10: Gradient Fills");
271    
272    // Horizontal gradient
273    let gradient_h = Shape::new(ShapeType::Rectangle, 500000, 1600000, 2500000, 1200000)
274        .with_gradient(GradientFill::linear("1565C0", "42A5F5", GradientDirection::Horizontal))
275        .with_text("Horizontal");
276    
277    // Vertical gradient
278    let gradient_v = Shape::new(ShapeType::Rectangle, 3200000, 1600000, 2500000, 1200000)
279        .with_gradient(GradientFill::linear("2E7D32", "81C784", GradientDirection::Vertical))
280        .with_text("Vertical");
281    
282    // Diagonal gradient
283    let gradient_d = Shape::new(ShapeType::RoundedRectangle, 5900000, 1600000, 2500000, 1200000)
284        .with_gradient(GradientFill::linear("C62828", "EF9A9A", GradientDirection::DiagonalDown))
285        .with_text("Diagonal");
286    
287    // Three-color gradient
288    let gradient_3 = Shape::new(ShapeType::Ellipse, 1800000, 3200000, 2500000, 1200000)
289        .with_gradient(GradientFill::three_color("FF6F00", "FFC107", "FFEB3B", GradientDirection::Horizontal))
290        .with_text("3-Color");
291    
292    // Custom angle gradient
293    let gradient_angle = Shape::new(ShapeType::RoundedRectangle, 4800000, 3200000, 2500000, 1200000)
294        .with_gradient(GradientFill::linear("7B1FA2", "E1BEE7", GradientDirection::Angle(135)))
295        .with_text("135° Angle");
296    
297    slides.push(
298        SlideContent::new("Gradient Fills - Multiple Directions")
299            .add_shape(gradient_h)
300            .add_shape(gradient_v)
301            .add_shape(gradient_d)
302            .add_shape(gradient_3)
303            .add_shape(gradient_angle)
304            .title_color("1F497D")
305    );
306
307    // =========================================================================
308    // SLIDE 11: Transparency (NEW)
309    // =========================================================================
310    println!("👻 Slide 11: Transparency Effects");
311    
312    // Base shape (fully opaque)
313    let base = Shape::new(ShapeType::Rectangle, 1000000, 1800000, 3000000, 2000000)
314        .with_fill(ShapeFill::new("1565C0"))
315        .with_text("Base (100%)");
316    
317    // 25% transparent overlay
318    let trans_25 = Shape::new(ShapeType::Rectangle, 2000000, 2200000, 2500000, 1500000)
319        .with_fill(ShapeFill::new("F44336").with_transparency(25))
320        .with_line(ShapeLine::new("B71C1C", 25400))
321        .with_text("25% Transparent");
322    
323    // 50% transparent overlay
324    let trans_50 = Shape::new(ShapeType::Ellipse, 4500000, 1800000, 2500000, 2000000)
325        .with_fill(ShapeFill::new("4CAF50").with_transparency(50))
326        .with_line(ShapeLine::new("1B5E20", 25400))
327        .with_text("50% Transparent");
328    
329    // 75% transparent overlay
330    let trans_75 = Shape::new(ShapeType::RoundedRectangle, 5500000, 2500000, 2500000, 1500000)
331        .with_fill(ShapeFill::new("FF9800").with_transparency(75))
332        .with_line(ShapeLine::new("E65100", 25400))
333        .with_text("75% Transparent");
334    
335    slides.push(
336        SlideContent::new("Transparency Effects - Overlapping Shapes")
337            .add_shape(base)
338            .add_shape(trans_25)
339            .add_shape(trans_50)
340            .add_shape(trans_75)
341            .title_color("1F497D")
342    );
343
344    // =========================================================================
345    // SLIDE 12: Styled Connectors (NEW)
346    // =========================================================================
347    println!("🔗 Slide 12: Styled Connectors");
348    
349    // Create shapes to connect
350    let box1 = Shape::new(ShapeType::RoundedRectangle, 500000, 1800000, 1800000, 800000)
351        .with_id(100)
352        .with_fill(ShapeFill::new("1565C0"))
353        .with_text("Start");
354    
355    let box2 = Shape::new(ShapeType::RoundedRectangle, 3500000, 1800000, 1800000, 800000)
356        .with_id(101)
357        .with_fill(ShapeFill::new("2E7D32"))
358        .with_text("Process");
359    
360    let box3 = Shape::new(ShapeType::RoundedRectangle, 6500000, 1800000, 1800000, 800000)
361        .with_id(102)
362        .with_fill(ShapeFill::new("C62828"))
363        .with_text("End");
364    
365    // Straight connector with arrow
366    let conn1 = Connector::straight(2300000, 2200000, 3500000, 2200000)
367        .with_line(ConnectorLine::new("1565C0", 25400))
368        .with_end_arrow(ArrowType::Triangle)
369        .with_arrow_size(ArrowSize::Large);
370    
371    // Elbow connector with stealth arrow
372    let conn2 = Connector::elbow(5300000, 2200000, 6500000, 2200000)
373        .with_line(ConnectorLine::new("2E7D32", 38100).with_dash(LineDash::Dash))
374        .with_end_arrow(ArrowType::Stealth)
375        .with_arrow_size(ArrowSize::Medium);
376    
377    // Curved connector examples
378    let box4 = Shape::new(ShapeType::Ellipse, 1000000, 3200000, 1500000, 800000)
379        .with_id(103)
380        .with_fill(ShapeFill::new("7B1FA2"))
381        .with_text("A");
382    
383    let box5 = Shape::new(ShapeType::Ellipse, 4000000, 3200000, 1500000, 800000)
384        .with_id(104)
385        .with_fill(ShapeFill::new("00838F"))
386        .with_text("B");
387    
388    let box6 = Shape::new(ShapeType::Ellipse, 7000000, 3200000, 1500000, 800000)
389        .with_id(105)
390        .with_fill(ShapeFill::new("EF6C00"))
391        .with_text("C");
392    
393    // Curved connector with diamond arrow
394    let conn3 = Connector::curved(2500000, 3600000, 4000000, 3600000)
395        .with_line(ConnectorLine::new("7B1FA2", 19050).with_dash(LineDash::DashDot))
396        .with_arrows(ArrowType::Oval, ArrowType::Diamond);
397    
398    // Dotted connector
399    let conn4 = Connector::straight(5500000, 3600000, 7000000, 3600000)
400        .with_line(ConnectorLine::new("00838F", 12700).with_dash(LineDash::Dot))
401        .with_end_arrow(ArrowType::Open);
402    
403    slides.push(
404        SlideContent::new("Styled Connectors - Types, Arrows, Dashes")
405            .add_shape(box1)
406            .add_shape(box2)
407            .add_shape(box3)
408            .add_shape(box4)
409            .add_shape(box5)
410            .add_shape(box6)
411            .add_connector(conn1)
412            .add_connector(conn2)
413            .add_connector(conn3)
414            .add_connector(conn4)
415            .title_color("1F497D")
416    );
417
418    // =========================================================================
419    // SLIDE 13: Images
420    // =========================================================================
421    println!("🖼️  Slide 13: Image Placeholders");
422    
423    let img1 = Image::new("logo.png", 2500000, 1800000, "png")
424        .position(500000, 1600000);
425    let img2 = Image::new("photo.jpg", 2500000, 1800000, "jpg")
426        .position(3500000, 1600000);
427    let img3 = Image::new("diagram.png", 2000000, 1800000, "png")
428        .position(6500000, 1600000);
429    
430    slides.push(
431        SlideContent::new("Image Placeholders")
432            .add_image(img1)
433            .add_image(img2)
434            .add_image(img3)
435            .title_color("1F497D")
436    );
437
438    // =========================================================================
439    // SLIDE 11: Advanced Table with Borders & Alignment (NEW)
440    // =========================================================================
441    println!("📊 Slide 11: Advanced Table (borders, alignment, merged cells)");
442    
443    // Build advanced table using generator's TableBuilder with alignment
444    let advanced_table = TableBuilder::new(vec![2000000, 2000000, 2000000, 2000000])
445        .add_row(TableRow::new(vec![
446            TableCell::new("Q1 2024 Financial Report").bold().background_color("1F4E79").text_color("FFFFFF").align_center().font_size(14),
447            TableCell::new("").background_color("1F4E79"),
448            TableCell::new("").background_color("1F4E79"),
449            TableCell::new("").background_color("1F4E79"),
450        ]))
451        .add_row(TableRow::new(vec![
452            TableCell::new("Category").bold().background_color("2E75B6").text_color("FFFFFF").align_center(),
453            TableCell::new("Revenue").bold().background_color("2E75B6").text_color("FFFFFF").align_center(),
454            TableCell::new("Expenses").bold().background_color("2E75B6").text_color("FFFFFF").align_center(),
455            TableCell::new("Profit").bold().background_color("2E75B6").text_color("FFFFFF").align_center(),
456        ]))
457        .add_row(TableRow::new(vec![
458            TableCell::new("Product Sales").text_color("000000").align_left(),
459            TableCell::new("$1,250,000").text_color("2E7D32").align_right(),
460            TableCell::new("$450,000").text_color("C62828").align_right(),
461            TableCell::new("$800,000").bold().text_color("2E7D32").align_right(),
462        ]))
463        .add_row(TableRow::new(vec![
464            TableCell::new("Services").text_color("000000").align_left(),
465            TableCell::new("$890,000").text_color("2E7D32").align_right(),
466            TableCell::new("$320,000").text_color("C62828").align_right(),
467            TableCell::new("$570,000").bold().text_color("2E7D32").align_right(),
468        ]))
469        .add_row(TableRow::new(vec![
470            TableCell::new("Total").bold().background_color("E7E6E6").text_color("000000").align_left(),
471            TableCell::new("$2,140,000").bold().background_color("E7E6E6").text_color("000000").align_right(),
472            TableCell::new("$770,000").bold().background_color("E7E6E6").text_color("000000").align_right(),
473            TableCell::new("$1,370,000").bold().background_color("C6EFCE").text_color("006100").align_right(),
474        ]))
475        .position(300000, 1600000)
476        .build();
477    
478    slides.push(
479        SlideContent::new("Financial Report - Advanced Table")
480            .table(advanced_table)
481            .title_color("1F4E79")
482            .title_bold(true)
483    );
484
485    // =========================================================================
486    // SLIDE 12: Comparison Matrix Table (NEW)
487    // =========================================================================
488    println!("📊 Slide 12: Comparison Matrix Table");
489    
490    let comparison_table = TableBuilder::new(vec![2000000, 1500000, 1500000, 1500000])
491        .add_row(TableRow::new(vec![
492            TableCell::new("Feature").bold().background_color("4472C4").text_color("FFFFFF"),
493            TableCell::new("Basic").bold().background_color("4472C4").text_color("FFFFFF"),
494            TableCell::new("Pro").bold().background_color("4472C4").text_color("FFFFFF"),
495            TableCell::new("Enterprise").bold().background_color("4472C4").text_color("FFFFFF"),
496        ]))
497        .add_row(TableRow::new(vec![
498            TableCell::new("Storage").text_color("000000"),
499            TableCell::new("5 GB").text_color("000000"),
500            TableCell::new("50 GB").text_color("000000"),
501            TableCell::new("Unlimited").bold().text_color("2E7D32"),
502        ]))
503        .add_row(TableRow::new(vec![
504            TableCell::new("Users").text_color("000000"),
505            TableCell::new("1").text_color("000000"),
506            TableCell::new("10").text_color("000000"),
507            TableCell::new("Unlimited").bold().text_color("2E7D32"),
508        ]))
509        .add_row(TableRow::new(vec![
510            TableCell::new("Support").text_color("000000"),
511            TableCell::new("Email").text_color("000000"),
512            TableCell::new("24/7 Chat").text_color("000000"),
513            TableCell::new("Dedicated").bold().text_color("2E7D32"),
514        ]))
515        .add_row(TableRow::new(vec![
516            TableCell::new("API Access").text_color("000000"),
517            TableCell::new("No").text_color("C62828"),
518            TableCell::new("Yes").text_color("2E7D32"),
519            TableCell::new("Yes + Priority").bold().text_color("2E7D32"),
520        ]))
521        .add_row(TableRow::new(vec![
522            TableCell::new("Price/month").bold().background_color("F2F2F2").text_color("000000"),
523            TableCell::new("$9").bold().background_color("F2F2F2").text_color("000000"),
524            TableCell::new("$29").bold().background_color("F2F2F2").text_color("000000"),
525            TableCell::new("$99").bold().background_color("F2F2F2").text_color("000000"),
526        ]))
527        .position(500000, 1600000)
528        .build();
529    
530    slides.push(
531        SlideContent::new("Pricing Comparison Matrix")
532            .table(comparison_table)
533            .title_color("4472C4")
534            .title_bold(true)
535    );
536
537    // =========================================================================
538    // SLIDE 13: Process Flow with Shapes (NEW - SmartArt-like)
539    // =========================================================================
540    println!("🔷 Slide 13: Process Flow (SmartArt-style)");
541    
542    // Create process flow using shapes
543    let step1 = Shape::new(ShapeType::RoundedRectangle, 300000, 2000000, 1400000, 800000)
544        .with_fill(ShapeFill::new("4472C4"))
545        .with_text("1. Research");
546    let arrow1 = Shape::new(ShapeType::RightArrow, 1800000, 2200000, 400000, 400000)
547        .with_fill(ShapeFill::new("A5A5A5"));
548    let step2 = Shape::new(ShapeType::RoundedRectangle, 2300000, 2000000, 1400000, 800000)
549        .with_fill(ShapeFill::new("ED7D31"))
550        .with_text("2. Design");
551    let arrow2 = Shape::new(ShapeType::RightArrow, 3800000, 2200000, 400000, 400000)
552        .with_fill(ShapeFill::new("A5A5A5"));
553    let step3 = Shape::new(ShapeType::RoundedRectangle, 4300000, 2000000, 1400000, 800000)
554        .with_fill(ShapeFill::new("70AD47"))
555        .with_text("3. Develop");
556    let arrow3 = Shape::new(ShapeType::RightArrow, 5800000, 2200000, 400000, 400000)
557        .with_fill(ShapeFill::new("A5A5A5"));
558    let step4 = Shape::new(ShapeType::RoundedRectangle, 6300000, 2000000, 1400000, 800000)
559        .with_fill(ShapeFill::new("5B9BD5"))
560        .with_text("4. Deploy");
561    
562    slides.push(
563        SlideContent::new("Development Process Flow")
564            .add_shape(step1)
565            .add_shape(arrow1)
566            .add_shape(step2)
567            .add_shape(arrow2)
568            .add_shape(step3)
569            .add_shape(arrow3)
570            .add_shape(step4)
571            .title_color("1F497D")
572            .title_bold(true)
573    );
574
575    // =========================================================================
576    // SLIDE 14: Organization Chart with Shapes (NEW)
577    // =========================================================================
578    println!("🔷 Slide 14: Organization Chart");
579    
580    // CEO at top
581    let ceo = Shape::new(ShapeType::RoundedRectangle, 3500000, 1400000, 2000000, 600000)
582        .with_fill(ShapeFill::new("1F4E79"))
583        .with_text("CEO");
584    
585    // Vertical line from CEO
586    let line1 = Shape::new(ShapeType::Rectangle, 4450000, 2000000, 100000, 400000)
587        .with_fill(ShapeFill::new("A5A5A5"));
588    
589    // Horizontal connector
590    let hline = Shape::new(ShapeType::Rectangle, 1950000, 2400000, 5100000, 50000)
591        .with_fill(ShapeFill::new("A5A5A5"));
592    
593    // CTO, CFO, COO
594    let cto = Shape::new(ShapeType::RoundedRectangle, 1000000, 2600000, 1800000, 500000)
595        .with_fill(ShapeFill::new("2E75B6"))
596        .with_text("CTO");
597    let cfo = Shape::new(ShapeType::RoundedRectangle, 3600000, 2600000, 1800000, 500000)
598        .with_fill(ShapeFill::new("2E75B6"))
599        .with_text("CFO");
600    let coo = Shape::new(ShapeType::RoundedRectangle, 6200000, 2600000, 1800000, 500000)
601        .with_fill(ShapeFill::new("2E75B6"))
602        .with_text("COO");
603    
604    // Vertical lines to departments
605    let vline1 = Shape::new(ShapeType::Rectangle, 1850000, 2450000, 50000, 150000)
606        .with_fill(ShapeFill::new("A5A5A5"));
607    let vline2 = Shape::new(ShapeType::Rectangle, 4450000, 2450000, 50000, 150000)
608        .with_fill(ShapeFill::new("A5A5A5"));
609    let vline3 = Shape::new(ShapeType::Rectangle, 7050000, 2450000, 50000, 150000)
610        .with_fill(ShapeFill::new("A5A5A5"));
611    
612    // Teams under CTO
613    let eng = Shape::new(ShapeType::Rectangle, 500000, 3300000, 1200000, 400000)
614        .with_fill(ShapeFill::new("BDD7EE"))
615        .with_text("Engineering");
616    let product = Shape::new(ShapeType::Rectangle, 1800000, 3300000, 1200000, 400000)
617        .with_fill(ShapeFill::new("BDD7EE"))
618        .with_text("Product");
619    
620    slides.push(
621        SlideContent::new("Organization Structure")
622            .add_shape(ceo)
623            .add_shape(line1)
624            .add_shape(hline)
625            .add_shape(cto)
626            .add_shape(cfo)
627            .add_shape(coo)
628            .add_shape(vline1)
629            .add_shape(vline2)
630            .add_shape(vline3)
631            .add_shape(eng)
632            .add_shape(product)
633            .title_color("1F4E79")
634            .title_bold(true)
635    );
636
637    // =========================================================================
638    // SLIDE 15: PDCA Cycle Diagram (NEW)
639    // =========================================================================
640    println!("🔷 Slide 15: PDCA Cycle Diagram");
641    
642    // Four quadrants for PDCA
643    let plan = Shape::new(ShapeType::RoundedRectangle, 1500000, 1600000, 2500000, 1500000)
644        .with_fill(ShapeFill::new("4472C4"))
645        .with_text("PLAN\n\nDefine goals\nand strategy");
646    let do_box = Shape::new(ShapeType::RoundedRectangle, 4500000, 1600000, 2500000, 1500000)
647        .with_fill(ShapeFill::new("ED7D31"))
648        .with_text("DO\n\nImplement\nthe plan");
649    let check = Shape::new(ShapeType::RoundedRectangle, 4500000, 3300000, 2500000, 1500000)
650        .with_fill(ShapeFill::new("70AD47"))
651        .with_text("CHECK\n\nMeasure\nresults");
652    let act = Shape::new(ShapeType::RoundedRectangle, 1500000, 3300000, 2500000, 1500000)
653        .with_fill(ShapeFill::new("FFC000"))
654        .with_text("ACT\n\nAdjust and\nimprove");
655    
656    // Arrows between quadrants
657    let arr1 = Shape::new(ShapeType::RightArrow, 4100000, 2100000, 300000, 300000)
658        .with_fill(ShapeFill::new("A5A5A5"));
659    let arr2 = Shape::new(ShapeType::DownArrow, 5600000, 3200000, 300000, 200000)
660        .with_fill(ShapeFill::new("A5A5A5"));
661    let arr3 = Shape::new(ShapeType::LeftArrow, 4100000, 3800000, 300000, 300000)
662        .with_fill(ShapeFill::new("A5A5A5"));
663    let arr4 = Shape::new(ShapeType::UpArrow, 2600000, 3200000, 300000, 200000)
664        .with_fill(ShapeFill::new("A5A5A5"));
665    
666    slides.push(
667        SlideContent::new("PDCA Continuous Improvement Cycle")
668            .add_shape(plan)
669            .add_shape(do_box)
670            .add_shape(check)
671            .add_shape(act)
672            .add_shape(arr1)
673            .add_shape(arr2)
674            .add_shape(arr3)
675            .add_shape(arr4)
676            .title_color("1F497D")
677            .title_bold(true)
678    );
679
680    // =========================================================================
681    // SLIDE 16: Pyramid Diagram (Maslow's Hierarchy) (NEW)
682    // =========================================================================
683    println!("🔷 Slide 16: Pyramid Diagram");
684    
685    // Build pyramid from bottom to top
686    let level5 = Shape::new(ShapeType::Trapezoid, 500000, 4000000, 8000000, 600000)
687        .with_fill(ShapeFill::new("C00000"))
688        .with_text("Physiological Needs - Food, Water, Shelter");
689    let level4 = Shape::new(ShapeType::Trapezoid, 1000000, 3400000, 7000000, 600000)
690        .with_fill(ShapeFill::new("ED7D31"))
691        .with_text("Safety Needs - Security, Stability");
692    let level3 = Shape::new(ShapeType::Trapezoid, 1500000, 2800000, 6000000, 600000)
693        .with_fill(ShapeFill::new("FFC000"))
694        .with_text("Love & Belonging - Relationships");
695    let level2 = Shape::new(ShapeType::Trapezoid, 2000000, 2200000, 5000000, 600000)
696        .with_fill(ShapeFill::new("70AD47"))
697        .with_text("Esteem - Achievement, Respect");
698    let level1 = Shape::new(ShapeType::Triangle, 2500000, 1500000, 4000000, 700000)
699        .with_fill(ShapeFill::new("4472C4"))
700        .with_text("Self-Actualization");
701    
702    slides.push(
703        SlideContent::new("Maslow's Hierarchy of Needs")
704            .add_shape(level5)
705            .add_shape(level4)
706            .add_shape(level3)
707            .add_shape(level2)
708            .add_shape(level1)
709            .title_color("1F497D")
710            .title_bold(true)
711    );
712
713    // =========================================================================
714    // SLIDE 17: Venn Diagram (NEW)
715    // =========================================================================
716    println!("🔷 Slide 17: Venn Diagram");
717    
718    // Three overlapping circles
719    let circle1 = Shape::new(ShapeType::Ellipse, 1500000, 1800000, 3000000, 3000000)
720        .with_fill(ShapeFill::new("4472C4"))
721        .with_text("Skills");
722    let circle2 = Shape::new(ShapeType::Ellipse, 3500000, 1800000, 3000000, 3000000)
723        .with_fill(ShapeFill::new("ED7D31"))
724        .with_text("Passion");
725    let circle3 = Shape::new(ShapeType::Ellipse, 2500000, 3200000, 3000000, 3000000)
726        .with_fill(ShapeFill::new("70AD47"))
727        .with_text("Market Need");
728    
729    // Center label
730    let center = Shape::new(ShapeType::Ellipse, 3200000, 2800000, 1600000, 800000)
731        .with_fill(ShapeFill::new("FFFFFF"))
732        .with_text("IKIGAI");
733    
734    slides.push(
735        SlideContent::new("Finding Your Ikigai - Venn Diagram")
736            .add_shape(circle1)
737            .add_shape(circle2)
738            .add_shape(circle3)
739            .add_shape(center)
740            .title_color("1F497D")
741            .title_bold(true)
742    );
743
744    // =========================================================================
745    // SLIDE 18: Timeline/Roadmap (NEW)
746    // =========================================================================
747    println!("📊 Slide 18: Project Timeline");
748    
749    let timeline_table = TableBuilder::new(vec![1500000, 1500000, 1500000, 1500000, 1500000])
750        .add_row(TableRow::new(vec![
751            TableCell::new("Q1 2024").bold().background_color("4472C4").text_color("FFFFFF"),
752            TableCell::new("Q2 2024").bold().background_color("4472C4").text_color("FFFFFF"),
753            TableCell::new("Q3 2024").bold().background_color("4472C4").text_color("FFFFFF"),
754            TableCell::new("Q4 2024").bold().background_color("4472C4").text_color("FFFFFF"),
755            TableCell::new("Q1 2025").bold().background_color("4472C4").text_color("FFFFFF"),
756        ]))
757        .add_row(TableRow::new(vec![
758            TableCell::new("Research\n& Planning").background_color("BDD7EE").text_color("1F497D"),
759            TableCell::new("Design\nPhase").background_color("BDD7EE").text_color("1F497D"),
760            TableCell::new("Development\nSprint 1-3").background_color("C6EFCE").text_color("006100"),
761            TableCell::new("Testing\n& QA").background_color("FCE4D6").text_color("C65911"),
762            TableCell::new("Launch\n& Support").background_color("E2EFDA").text_color("375623"),
763        ]))
764        .add_row(TableRow::new(vec![
765            TableCell::new("✓ Complete").bold().text_color("2E7D32"),
766            TableCell::new("✓ Complete").bold().text_color("2E7D32"),
767            TableCell::new("In Progress").text_color("ED7D31"),
768            TableCell::new("Planned").text_color("7F7F7F"),
769            TableCell::new("Planned").text_color("7F7F7F"),
770        ]))
771        .position(300000, 2000000)
772        .build();
773    
774    slides.push(
775        SlideContent::new("Project Roadmap 2024-2025")
776            .table(timeline_table)
777            .title_color("1F497D")
778            .title_bold(true)
779    );
780
781    // =========================================================================
782    // SLIDE 19: Dashboard Summary (NEW - using Dimension API)
783    // =========================================================================
784    println!("🔷 Slide 19: Dashboard with KPIs (Dimension API)");
785    
786    // KPI boxes using ratio-based positioning — automatically adapts to any slide size
787    let kpi1 = Shape::from_dimensions(ShapeType::RoundedRectangle,
788        Dimension::percent(3.0), Dimension::percent(23.0),
789        Dimension::percent(22.0), Dimension::percent(18.0),
790    ).with_fill(ShapeFill::new("4472C4")).with_text("Revenue\n\n$2.14M\n+15% YoY");
791
792    let kpi2 = Shape::from_dimensions(ShapeType::RoundedRectangle,
793        Dimension::percent(27.0), Dimension::percent(23.0),
794        Dimension::percent(22.0), Dimension::percent(18.0),
795    ).with_fill(ShapeFill::new("70AD47")).with_text("Customers\n\n12,450\n+22% YoY");
796
797    let kpi3 = Shape::from_dimensions(ShapeType::RoundedRectangle,
798        Dimension::percent(51.0), Dimension::percent(23.0),
799        Dimension::percent(22.0), Dimension::percent(18.0),
800    ).with_fill(ShapeFill::new("ED7D31")).with_text("NPS Score\n\n72\n+8 pts");
801
802    let kpi4 = Shape::from_dimensions(ShapeType::RoundedRectangle,
803        Dimension::percent(75.0), Dimension::percent(23.0),
804        Dimension::percent(22.0), Dimension::percent(18.0),
805    ).with_fill(ShapeFill::new("5B9BD5")).with_text("Retention\n\n94%\n+3% YoY");
806    
807    // Status indicators using mixed units: percent for X, inches for size
808    let status1 = Shape::new(ShapeType::Ellipse, 0, 0, 0, 0)
809        .at(Dimension::percent(14.0), Dimension::percent(42.0))
810        .with_dimensions(Dimension::Inches(0.3), Dimension::Inches(0.3))
811        .with_fill(ShapeFill::new("70AD47"));
812    let status2 = Shape::new(ShapeType::Ellipse, 0, 0, 0, 0)
813        .at(Dimension::percent(38.0), Dimension::percent(42.0))
814        .with_dimensions(Dimension::Inches(0.3), Dimension::Inches(0.3))
815        .with_fill(ShapeFill::new("70AD47"));
816    let status3 = Shape::new(ShapeType::Ellipse, 0, 0, 0, 0)
817        .at(Dimension::percent(62.0), Dimension::percent(42.0))
818        .with_dimensions(Dimension::Inches(0.3), Dimension::Inches(0.3))
819        .with_fill(ShapeFill::new("FFC000"));
820    let status4 = Shape::new(ShapeType::Ellipse, 0, 0, 0, 0)
821        .at(Dimension::percent(86.0), Dimension::percent(42.0))
822        .with_dimensions(Dimension::Inches(0.3), Dimension::Inches(0.3))
823        .with_fill(ShapeFill::new("70AD47"));
824    
825    slides.push(
826        SlideContent::new("Executive Dashboard - Q1 2024")
827            .add_shape(kpi1)
828            .add_shape(kpi2)
829            .add_shape(kpi3)
830            .add_shape(kpi4)
831            .add_shape(status1)
832            .add_shape(status2)
833            .add_shape(status3)
834            .add_shape(status4)
835            .title_color("1F497D")
836            .title_bold(true)
837    );
838
839    // =========================================================================
840    // SLIDE 20: Summary Slide (NEW)
841    // =========================================================================
842    println!("📝 Slide 20: Summary with Speaker Notes");
843    
844    slides.push(
845        SlideContent::new("Summary & Next Steps")
846            .layout(SlideLayout::TitleAndContent)
847            .title_color("1F497D")
848            .title_bold(true)
849            .add_bullet("Completed: Research, Design, Initial Development")
850            .add_bullet("In Progress: Sprint 3 Development")
851            .add_bullet("Next: QA Testing Phase (Q4 2024)")
852            .add_bullet("Launch Target: Q1 2025")
853            .add_bullet("Key Risks: Resource constraints, Timeline pressure")
854            .content_size(24)
855            .notes("Speaker Notes:\n\n1. Emphasize the progress made\n2. Highlight key achievements\n3. Address any concerns about timeline\n4. Open for Q&A")
856    );
857
858    // =========================================================================
859    // SLIDE 21: Bullet Styles (NEW v0.2.1)
860    // =========================================================================
861    println!("🔢 Slide 21: Bullet Styles (NEW)");
862    
863    // Numbered list
864    slides.push(
865        SlideContent::new("Bullet Styles - Numbered List")
866            .layout(SlideLayout::TitleAndContent)
867            .title_color("1F497D")
868            .title_bold(true)
869            .with_bullet_style(BulletStyle::Number)
870            .add_bullet("First numbered item")
871            .add_bullet("Second numbered item")
872            .add_bullet("Third numbered item")
873            .add_bullet("Fourth numbered item")
874            .content_size(28)
875    );
876
877    // =========================================================================
878    // SLIDE 22: Lettered Lists (NEW v0.2.1)
879    // =========================================================================
880    println!("🔤 Slide 22: Lettered Lists (NEW)");
881    
882    slides.push(
883        SlideContent::new("Bullet Styles - Lettered Lists")
884            .layout(SlideLayout::TitleAndContent)
885            .title_color("1F497D")
886            .title_bold(true)
887            .add_lettered("Option A - First choice")
888            .add_lettered("Option B - Second choice")
889            .add_lettered("Option C - Third choice")
890            .add_lettered("Option D - Fourth choice")
891            .content_size(28)
892    );
893
894    // =========================================================================
895    // SLIDE 23: Roman Numerals (NEW v0.2.1)
896    // =========================================================================
897    println!("🏛️ Slide 23: Roman Numerals (NEW)");
898    
899    slides.push(
900        SlideContent::new("Bullet Styles - Roman Numerals")
901            .layout(SlideLayout::TitleAndContent)
902            .title_color("1F497D")
903            .title_bold(true)
904            .with_bullet_style(BulletStyle::RomanUpper)
905            .add_bullet("Chapter I - Introduction")
906            .add_bullet("Chapter II - Background")
907            .add_bullet("Chapter III - Methodology")
908            .add_bullet("Chapter IV - Results")
909            .add_bullet("Chapter V - Conclusion")
910            .content_size(28)
911    );
912
913    // =========================================================================
914    // SLIDE 24: Custom Bullets (NEW v0.2.1)
915    // =========================================================================
916    println!("⭐ Slide 24: Custom Bullets (NEW)");
917    
918    slides.push(
919        SlideContent::new("Bullet Styles - Custom Characters")
920            .layout(SlideLayout::TitleAndContent)
921            .title_color("1F497D")
922            .title_bold(true)
923            .add_styled_bullet("Star bullet point", BulletStyle::Custom('★'))
924            .add_styled_bullet("Arrow bullet point", BulletStyle::Custom('→'))
925            .add_styled_bullet("Check bullet point", BulletStyle::Custom('✓'))
926            .add_styled_bullet("Diamond bullet point", BulletStyle::Custom('◆'))
927            .add_styled_bullet("Heart bullet point", BulletStyle::Custom('♥'))
928            .content_size(28)
929    );
930
931    // =========================================================================
932    // SLIDE 25: Sub-bullets / Hierarchy (NEW v0.2.1)
933    // =========================================================================
934    println!("📊 Slide 25: Sub-bullets Hierarchy (NEW)");
935    
936    slides.push(
937        SlideContent::new("Bullet Styles - Hierarchical Lists")
938            .layout(SlideLayout::TitleAndContent)
939            .title_color("1F497D")
940            .title_bold(true)
941            .add_bullet("Main Topic 1")
942            .add_sub_bullet("Supporting detail A")
943            .add_sub_bullet("Supporting detail B")
944            .add_bullet("Main Topic 2")
945            .add_sub_bullet("Supporting detail C")
946            .add_sub_bullet("Supporting detail D")
947            .add_bullet("Main Topic 3")
948            .content_size(24)
949    );
950
951    // =========================================================================
952    // SLIDE 26: Text Enhancements (NEW v0.2.1)
953    // =========================================================================
954    println!("✏️ Slide 26: Text Enhancements (NEW)");
955    
956    // Use BulletPoint with formatting
957    let strikethrough_bullet = BulletPoint::new("Strikethrough: This text is crossed out").strikethrough();
958    let highlight_bullet = BulletPoint::new("Highlight: Yellow background for emphasis").highlight("FFFF00");
959    let subscript_bullet = BulletPoint::new("Subscript: H₂O - for chemical formulas").subscript();
960    let superscript_bullet = BulletPoint::new("Superscript: x² - for math expressions").superscript();
961    let bold_colored = BulletPoint::new("Combined: Bold + Red color").bold().color("FF0000");
962    
963    let mut text_enhancements_slide = SlideContent::new("Text Enhancements - New Formatting")
964        .layout(SlideLayout::TitleAndContent)
965        .title_color("1F497D")
966        .title_bold(true)
967        .content_size(24);
968    text_enhancements_slide.bullets.push(strikethrough_bullet);
969    text_enhancements_slide.bullets.push(highlight_bullet);
970    text_enhancements_slide.bullets.push(subscript_bullet);
971    text_enhancements_slide.bullets.push(superscript_bullet);
972    text_enhancements_slide.bullets.push(bold_colored);
973    
974    slides.push(text_enhancements_slide);
975
976    // =========================================================================
977    // SLIDE 27: Font Size Presets (NEW v0.2.1)
978    // =========================================================================
979    println!("🔤 Slide 27: Font Size Presets (NEW)");
980    
981    // Demonstrate different font sizes per bullet
982    let large_bullet = BulletPoint::new(&format!("LARGE: {}pt - Extra large text", font_sizes::LARGE)).font_size(font_sizes::LARGE);
983    let heading_bullet = BulletPoint::new(&format!("HEADING: {}pt - Section headers", font_sizes::HEADING)).font_size(font_sizes::HEADING);
984    let body_bullet = BulletPoint::new(&format!("BODY: {}pt - Regular content", font_sizes::BODY)).font_size(font_sizes::BODY);
985    let small_bullet = BulletPoint::new(&format!("SMALL: {}pt - Smaller text", font_sizes::SMALL)).font_size(font_sizes::SMALL);
986    let caption_bullet = BulletPoint::new(&format!("CAPTION: {}pt - Captions and notes", font_sizes::CAPTION)).font_size(font_sizes::CAPTION);
987    
988    let mut font_size_slide = SlideContent::new("Font Size Presets - Each line different size")
989        .layout(SlideLayout::TitleAndContent)
990        .title_color("1F497D")
991        .title_bold(true)
992        .title_size(font_sizes::TITLE);
993    font_size_slide.bullets.push(large_bullet);
994    font_size_slide.bullets.push(heading_bullet);
995    font_size_slide.bullets.push(body_bullet);
996    font_size_slide.bullets.push(small_bullet);
997    font_size_slide.bullets.push(caption_bullet);
998    
999    slides.push(font_size_slide);
1000
1001    // =========================================================================
1002    // SLIDE 28: Theme Colors (NEW v0.2.1)
1003    // =========================================================================
1004    println!("🎨 Slide 28: Theme Colors (NEW)");
1005    
1006    // Create shapes with theme colors
1007    let corporate_shape = Shape::new(ShapeType::Rectangle, 500000, 1600000, 1800000, 800000)
1008        .with_fill(ShapeFill::new(themes::CORPORATE.primary))
1009        .with_text("Corporate");
1010    
1011    let modern_shape = Shape::new(ShapeType::Rectangle, 2500000, 1600000, 1800000, 800000)
1012        .with_fill(ShapeFill::new(themes::MODERN.primary))
1013        .with_text("Modern");
1014    
1015    let vibrant_shape = Shape::new(ShapeType::Rectangle, 4500000, 1600000, 1800000, 800000)
1016        .with_fill(ShapeFill::new(themes::VIBRANT.primary))
1017        .with_text("Vibrant");
1018    
1019    let dark_shape = Shape::new(ShapeType::Rectangle, 6500000, 1600000, 1800000, 800000)
1020        .with_fill(ShapeFill::new(themes::DARK.primary))
1021        .with_text("Dark");
1022    
1023    let nature_shape = Shape::new(ShapeType::Rectangle, 500000, 2700000, 1800000, 800000)
1024        .with_fill(ShapeFill::new(themes::NATURE.primary))
1025        .with_text("Nature");
1026    
1027    let tech_shape = Shape::new(ShapeType::Rectangle, 2500000, 2700000, 1800000, 800000)
1028        .with_fill(ShapeFill::new(themes::TECH.primary))
1029        .with_text("Tech");
1030    
1031    let carbon_shape = Shape::new(ShapeType::Rectangle, 4500000, 2700000, 1800000, 800000)
1032        .with_fill(ShapeFill::new(themes::CARBON.primary))
1033        .with_text("Carbon");
1034    
1035    slides.push(
1036        SlideContent::new("Theme Color Palettes")
1037            .layout(SlideLayout::TitleAndContent)
1038            .title_color("1F497D")
1039            .title_bold(true)
1040            .add_shape(corporate_shape)
1041            .add_shape(modern_shape)
1042            .add_shape(vibrant_shape)
1043            .add_shape(dark_shape)
1044            .add_shape(nature_shape)
1045            .add_shape(tech_shape)
1046            .add_shape(carbon_shape)
1047    );
1048
1049    // =========================================================================
1050    // SLIDE 29: Material & Carbon Design Colors (NEW v0.2.1)
1051    // =========================================================================
1052    println!("🌈 Slide 29: Material & Carbon Colors (NEW)");
1053    
1054    // Material Design colors
1055    let material_red = Shape::new(ShapeType::Rectangle, 500000, 1600000, 1200000, 600000)
1056        .with_fill(ShapeFill::new(colors::MATERIAL_RED))
1057        .with_text("M-Red");
1058    
1059    let material_blue = Shape::new(ShapeType::Rectangle, 1900000, 1600000, 1200000, 600000)
1060        .with_fill(ShapeFill::new(colors::MATERIAL_BLUE))
1061        .with_text("M-Blue");
1062    
1063    let material_green = Shape::new(ShapeType::Rectangle, 3300000, 1600000, 1200000, 600000)
1064        .with_fill(ShapeFill::new(colors::MATERIAL_GREEN))
1065        .with_text("M-Green");
1066    
1067    let material_orange = Shape::new(ShapeType::Rectangle, 4700000, 1600000, 1200000, 600000)
1068        .with_fill(ShapeFill::new(colors::MATERIAL_ORANGE))
1069        .with_text("M-Orange");
1070    
1071    let material_purple = Shape::new(ShapeType::Rectangle, 6100000, 1600000, 1200000, 600000)
1072        .with_fill(ShapeFill::new(colors::MATERIAL_PURPLE))
1073        .with_text("M-Purple");
1074    
1075    // Carbon Design colors
1076    let carbon_blue = Shape::new(ShapeType::Rectangle, 500000, 2500000, 1200000, 600000)
1077        .with_fill(ShapeFill::new(colors::CARBON_BLUE_60))
1078        .with_text("C-Blue");
1079    
1080    let carbon_green = Shape::new(ShapeType::Rectangle, 1900000, 2500000, 1200000, 600000)
1081        .with_fill(ShapeFill::new(colors::CARBON_GREEN_50))
1082        .with_text("C-Green");
1083    
1084    let carbon_red = Shape::new(ShapeType::Rectangle, 3300000, 2500000, 1200000, 600000)
1085        .with_fill(ShapeFill::new(colors::CARBON_RED_60))
1086        .with_text("C-Red");
1087    
1088    let carbon_purple = Shape::new(ShapeType::Rectangle, 4700000, 2500000, 1200000, 600000)
1089        .with_fill(ShapeFill::new(colors::CARBON_PURPLE_60))
1090        .with_text("C-Purple");
1091    
1092    let carbon_gray = Shape::new(ShapeType::Rectangle, 6100000, 2500000, 1200000, 600000)
1093        .with_fill(ShapeFill::new(colors::CARBON_GRAY_100))
1094        .with_text("C-Gray");
1095    
1096    slides.push(
1097        SlideContent::new("Material & Carbon Design Colors")
1098            .layout(SlideLayout::TitleAndContent)
1099            .title_color("1F497D")
1100            .title_bold(true)
1101            .add_shape(material_red)
1102            .add_shape(material_blue)
1103            .add_shape(material_green)
1104            .add_shape(material_orange)
1105            .add_shape(material_purple)
1106            .add_shape(carbon_blue)
1107            .add_shape(carbon_green)
1108            .add_shape(carbon_red)
1109            .add_shape(carbon_purple)
1110            .add_shape(carbon_gray)
1111    );
1112
1113    // =========================================================================
1114    // SLIDE 30: Image from Base64 (NEW v0.2.1)
1115    // =========================================================================
1116    println!("🖼️ Slide 30: Image from Base64 (NEW)");
1117    
1118    // 1x1 red PNG pixel in base64
1119    let _red_pixel_base64 = "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8z8DwHwAFBQIAX8jx0gAAAABJRU5ErkJggg==";
1120    
1121    // Create image from base64 (demonstrating the API)
1122    let _base64_image = ImageBuilder::from_base64(_red_pixel_base64, 914400, 914400, "PNG")
1123        .position(4000000, 2500000)
1124        .build();
1125    
1126    slides.push(
1127        SlideContent::new("Image Loading - New Methods")
1128            .layout(SlideLayout::TitleAndContent)
1129            .title_color("1F497D")
1130            .title_bold(true)
1131            .add_bullet("Image::new(path) - Load from file path")
1132            .add_bullet("Image::from_base64(data) - Load from base64 string")
1133            .add_bullet("Image::from_bytes(data) - Load from raw bytes")
1134            .add_bullet("ImageBuilder for fluent API configuration")
1135            .add_bullet("Built-in base64 decoder (no external deps)")
1136            .content_size(24)
1137    );
1138
1139    // =========================================================================
1140    // SLIDE 31: Feature Summary (NEW v0.2.1)
1141    // =========================================================================
1142    println!("📋 Slide 31: v0.2.1 Feature Summary (NEW)");
1143    
1144    slides.push(
1145        SlideContent::new("New Features in v0.2.1")
1146            .layout(SlideLayout::TitleAndContent)
1147            .title_color("1F497D")
1148            .title_bold(true)
1149            .add_numbered("BulletStyle: Number, Letter, Roman, Custom")
1150            .add_numbered("TextFormat: Strikethrough, Highlight")
1151            .add_numbered("TextFormat: Subscript, Superscript")
1152            .add_numbered("Font size presets in prelude")
1153            .add_numbered("Image::from_base64 and from_bytes")
1154            .add_numbered("Theme color palettes (7 themes)")
1155            .add_numbered("Material & Carbon Design colors")
1156            .content_size(24)
1157    );
1158
1159    // =========================================================================
1160    // SLIDE 32: Slide Show Settings - Comparison Table (REAL: embedded in presProps.xml)
1161    // =========================================================================
1162    println!("🎬 Slide 34: Slide Show Settings (Visual)");
1163
1164    let show_speaker = SlideShowSettings::new().pen_color(PenColor::red());
1165    let show_kiosk = SlideShowSettings::kiosk();
1166    let _show_range = SlideShowSettings::new()
1167        .show_type(ShowType::Browsed)
1168        .slide_range(SlideRange::Range { start: 1, end: 10 })
1169        .without_animation(true);
1170    let _speaker_xml = show_speaker.to_xml();
1171    let _kiosk_xml = show_kiosk.to_xml();
1172
1173    let show_table = TableBuilder::new(vec![2000000, 2000000, 2000000, 2000000])
1174        .add_row(TableRow::new(vec![
1175            TableCell::new("Setting").bold().background_color("1F4E79").text_color("FFFFFF"),
1176            TableCell::new("Speaker").bold().background_color("4472C4").text_color("FFFFFF"),
1177            TableCell::new("Kiosk").bold().background_color("ED7D31").text_color("FFFFFF"),
1178            TableCell::new("Browsed").bold().background_color("70AD47").text_color("FFFFFF"),
1179        ]))
1180        .add_row(TableRow::new(vec![
1181            TableCell::new("Loop").bold().background_color("D6E4F0"),
1182            TableCell::new("No"), TableCell::new("Yes").bold().text_color("2E7D32"),
1183            TableCell::new("No"),
1184        ]))
1185        .add_row(TableRow::new(vec![
1186            TableCell::new("Narration").bold().background_color("D6E4F0"),
1187            TableCell::new("Yes"), TableCell::new("No").text_color("C62828"),
1188            TableCell::new("Yes"),
1189        ]))
1190        .add_row(TableRow::new(vec![
1191            TableCell::new("Animation").bold().background_color("D6E4F0"),
1192            TableCell::new("Yes"), TableCell::new("Yes"),
1193            TableCell::new("No").text_color("C62828"),
1194        ]))
1195        .add_row(TableRow::new(vec![
1196            TableCell::new("Timings").bold().background_color("D6E4F0"),
1197            TableCell::new("Yes"), TableCell::new("Auto"),
1198            TableCell::new("Yes"),
1199        ]))
1200        .add_row(TableRow::new(vec![
1201            TableCell::new("Slide Range").bold().background_color("D6E4F0"),
1202            TableCell::new("All"), TableCell::new("All"),
1203            TableCell::new("1-10"),
1204        ]))
1205        .add_row(TableRow::new(vec![
1206            TableCell::new("Pen Color").bold().background_color("D6E4F0"),
1207            TableCell::new("Red").text_color("FF0000"),
1208            TableCell::new("Red").text_color("FF0000"),
1209            TableCell::new("Red").text_color("FF0000"),
1210        ]))
1211        .position(300000, 1600000)
1212        .build();
1213
1214    // Mode icons
1215    let icon_speaker = Shape::new(ShapeType::RoundedRectangle, 300000, 4200000, 2500000, 600000)
1216        .with_fill(ShapeFill::new("4472C4"))
1217        .with_text("Speaker: Full control");
1218    let icon_kiosk = Shape::new(ShapeType::RoundedRectangle, 3100000, 4200000, 2500000, 600000)
1219        .with_fill(ShapeFill::new("ED7D31"))
1220        .with_text("Kiosk: Auto-loop");
1221    let icon_browsed = Shape::new(ShapeType::RoundedRectangle, 5900000, 4200000, 2500000, 600000)
1222        .with_fill(ShapeFill::new("70AD47"))
1223        .with_text("Browsed: Scrollbar");
1224
1225    slides.push(
1226        SlideContent::new("Slide Show Settings - Mode Comparison")
1227            .table(show_table)
1228            .add_shape(icon_speaker)
1229            .add_shape(icon_kiosk)
1230            .add_shape(icon_browsed)
1231            .title_color("1F497D")
1232            .title_bold(true)
1233    );
1234
1235    // =========================================================================
1236    // SLIDE 35: Print Settings - Visual Handout Grid
1237    // =========================================================================
1238    println!("🖨️  Slide 35: Print Settings & Handouts (Visual)");
1239
1240    let print = PrintSettings::new()
1241        .print_what(PrintWhat::Handouts)
1242        .color_mode(PrintColorMode::Grayscale)
1243        .handout_layout(GenHandoutLayout::SlidesPerPage6)
1244        .frame_slides(true)
1245        .header("Q1 2025 Strategy Review")
1246        .footer("Confidential - Internal Use Only")
1247        .print_date(true)
1248        .print_page_numbers(true);
1249    let _prnpr_xml = print.to_prnpr_xml();
1250    let _handout_xml = print.to_handout_master_xml();
1251
1252    // Visual: 6-slide handout grid (2 cols x 3 rows)
1253    let hdr = Shape::new(ShapeType::Rectangle, 300000, 1500000, 4200000, 300000)
1254        .with_fill(ShapeFill::new("E7E6E6"))
1255        .with_text("Q1 2025 Strategy Review");
1256    // Row 1
1257    let s1 = Shape::new(ShapeType::Rectangle, 400000, 2000000, 1800000, 1100000)
1258        .with_line(ShapeLine::new("999999", 12700))
1259        .with_text("Slide 1");
1260    let s2 = Shape::new(ShapeType::Rectangle, 2500000, 2000000, 1800000, 1100000)
1261        .with_line(ShapeLine::new("999999", 12700))
1262        .with_text("Slide 2");
1263    // Row 2
1264    let s3 = Shape::new(ShapeType::Rectangle, 400000, 3200000, 1800000, 1100000)
1265        .with_line(ShapeLine::new("999999", 12700))
1266        .with_text("Slide 3");
1267    let s4 = Shape::new(ShapeType::Rectangle, 2500000, 3200000, 1800000, 1100000)
1268        .with_line(ShapeLine::new("999999", 12700))
1269        .with_text("Slide 4");
1270    // Row 3
1271    let s5 = Shape::new(ShapeType::Rectangle, 400000, 4400000, 1800000, 1100000)
1272        .with_line(ShapeLine::new("999999", 12700))
1273        .with_text("Slide 5");
1274    let s6 = Shape::new(ShapeType::Rectangle, 2500000, 4400000, 1800000, 1100000)
1275        .with_line(ShapeLine::new("999999", 12700))
1276        .with_text("Slide 6");
1277    let ftr = Shape::new(ShapeType::Rectangle, 300000, 5600000, 4200000, 300000)
1278        .with_fill(ShapeFill::new("E7E6E6"))
1279        .with_text("Confidential - Internal Use Only");
1280
1281    // Settings summary table on the right
1282    let print_table = TableBuilder::new(vec![1800000, 2000000])
1283        .add_row(TableRow::new(vec![
1284            TableCell::new("Print Settings").bold().background_color("1F4E79").text_color("FFFFFF"),
1285            TableCell::new("").background_color("1F4E79"),
1286        ]))
1287        .add_row(TableRow::new(vec![
1288            TableCell::new("Print What").bold().background_color("D6E4F0"),
1289            TableCell::new("Handouts"),
1290        ]))
1291        .add_row(TableRow::new(vec![
1292            TableCell::new("Color Mode").bold().background_color("D6E4F0"),
1293            TableCell::new("Grayscale"),
1294        ]))
1295        .add_row(TableRow::new(vec![
1296            TableCell::new("Layout").bold().background_color("D6E4F0"),
1297            TableCell::new("6 slides/page"),
1298        ]))
1299        .add_row(TableRow::new(vec![
1300            TableCell::new("Frame Slides").bold().background_color("D6E4F0"),
1301            TableCell::new("Yes"),
1302        ]))
1303        .add_row(TableRow::new(vec![
1304            TableCell::new("Date").bold().background_color("D6E4F0"),
1305            TableCell::new("Yes"),
1306        ]))
1307        .add_row(TableRow::new(vec![
1308            TableCell::new("Page Numbers").bold().background_color("D6E4F0"),
1309            TableCell::new("Yes"),
1310        ]))
1311        .position(5000000, 1800000)
1312        .build();
1313
1314    slides.push(
1315        SlideContent::new("Print Handout - 6 Slides Per Page")
1316            .table(print_table)
1317            .add_shape(hdr)
1318            .add_shape(s1).add_shape(s2)
1319            .add_shape(s3).add_shape(s4)
1320            .add_shape(s5).add_shape(s6)
1321            .add_shape(ftr)
1322            .title_color("1F497D")
1323            .title_bold(true)
1324    );
1325
1326    // =========================================================================
1327    // SLIDE 36: Advanced Table Merging - Actual Merged Table
1328    // =========================================================================
1329    println!("📊 Slide 36: Advanced Table Merging (Visual)");
1330
1331    // Use TableMergeMap to compute states, then build a visual table
1332    let mut merge_map = TableMergeMap::new(5, 4);
1333    merge_map.merge_cells(0, 0, 1, 4).unwrap(); // Title row spans all 4 cols
1334    merge_map.merge_cells(1, 0, 2, 1).unwrap(); // "Products" spans 2 rows
1335    merge_map.merge_cells(3, 0, 2, 1).unwrap(); // "Services" spans 2 rows
1336
1337    // Show merge state labels
1338    let state_00 = merge_map.cell_state(0, 0); // Anchor gridSpan=4
1339    let state_01 = merge_map.cell_state(0, 1); // HMerge
1340    let state_10 = merge_map.cell_state(1, 0); // Anchor rowSpan=2
1341    let state_20 = merge_map.cell_state(2, 0); // VMerge
1342    println!("   ├── (0,0): {}", state_00.to_xml_attrs().trim());
1343    println!("   ├── (0,1): {}", state_01.to_xml_attrs().trim());
1344    println!("   ├── (1,0): {}", state_10.to_xml_attrs().trim());
1345    println!("   └── (2,0): {}", state_20.to_xml_attrs().trim());
1346
1347    // Build the table with REAL merge attributes (gridSpan, rowSpan, hMerge, vMerge)
1348    let merge_table = TableBuilder::new(vec![1500000, 2000000, 2000000, 2000000])
1349        .add_row(TableRow::new(vec![
1350            TableCell::new("Q1 2025 Revenue Report").bold().background_color("1F4E79").text_color("FFFFFF").grid_span(4),
1351            TableCell::new("").background_color("1F4E79").h_merge(),
1352            TableCell::new("").background_color("1F4E79").h_merge(),
1353            TableCell::new("").background_color("1F4E79").h_merge(),
1354        ]))
1355        .add_row(TableRow::new(vec![
1356            TableCell::new("Products").bold().background_color("BDD7EE").text_color("1F497D").row_span(2),
1357            TableCell::new("Hardware").background_color("E2EFDA"),
1358            TableCell::new("$450,000").text_color("2E7D32").align_right(),
1359            TableCell::new("+12%").bold().text_color("2E7D32").align_right(),
1360        ]))
1361        .add_row(TableRow::new(vec![
1362            TableCell::new("").background_color("BDD7EE").v_merge(),
1363            TableCell::new("Software").background_color("E2EFDA"),
1364            TableCell::new("$680,000").text_color("2E7D32").align_right(),
1365            TableCell::new("+25%").bold().text_color("2E7D32").align_right(),
1366        ]))
1367        .add_row(TableRow::new(vec![
1368            TableCell::new("Services").bold().background_color("FCE4D6").text_color("C65911").row_span(2),
1369            TableCell::new("Consulting").background_color("FFF2CC"),
1370            TableCell::new("$320,000").text_color("2E7D32").align_right(),
1371            TableCell::new("+8%").bold().text_color("2E7D32").align_right(),
1372        ]))
1373        .add_row(TableRow::new(vec![
1374            TableCell::new("").background_color("FCE4D6").v_merge(),
1375            TableCell::new("Support").background_color("FFF2CC"),
1376            TableCell::new("$190,000").text_color("2E7D32").align_right(),
1377            TableCell::new("+5%").bold().text_color("2E7D32").align_right(),
1378        ]))
1379        .position(300000, 1600000)
1380        .build();
1381
1382    // Legend shapes
1383    let legend_anchor = Shape::new(ShapeType::RoundedRectangle, 300000, 4400000, 2000000, 400000)
1384        .with_fill(ShapeFill::new("4472C4"))
1385        .with_text("Anchor (gridSpan/rowSpan)");
1386    let legend_hmerge = Shape::new(ShapeType::RoundedRectangle, 2500000, 4400000, 2000000, 400000)
1387        .with_fill(ShapeFill::new("ED7D31"))
1388        .with_text("hMerge (col covered)");
1389    let legend_vmerge = Shape::new(ShapeType::RoundedRectangle, 4700000, 4400000, 2000000, 400000)
1390        .with_fill(ShapeFill::new("70AD47"))
1391        .with_text("vMerge (row covered)");
1392    let legend_normal = Shape::new(ShapeType::RoundedRectangle, 6900000, 4400000, 2000000, 400000)
1393        .with_fill(ShapeFill::new("A5A5A5"))
1394        .with_text("Normal (no merge)");
1395
1396    slides.push(
1397        SlideContent::new("Advanced Table Merging - Merged Cells")
1398            .table(merge_table)
1399            .add_shape(legend_anchor)
1400            .add_shape(legend_hmerge)
1401            .add_shape(legend_vmerge)
1402            .add_shape(legend_normal)
1403            .title_color("1F497D")
1404            .title_bold(true)
1405    );
1406
1407    // =========================================================================
1408    // Build PresentationSettings with all advanced features
1409    // =========================================================================
1410    println!("\n⚙️  Building Presentation Settings...");
1411
1412    // Slide show settings (embedded in presProps.xml as <p:showPr>)
1413    let show_settings = SlideShowSettings::new()
1414        .show_type(ShowType::Speaker)
1415        .pen_color(PenColor::red())
1416        .use_timings(true);
1417    println!("   ├── Slide Show: Speaker mode, red pen, timings enabled");
1418    println!("   │   └── XML: {} bytes", show_settings.to_xml().len());
1419
1420    // Print settings (embedded in presProps.xml as <p:prnPr>)
1421    let print_settings = PrintSettings::new()
1422        .print_what(PrintWhat::Handouts)
1423        .color_mode(PrintColorMode::Grayscale)
1424        .handout_layout(GenHandoutLayout::SlidesPerPage6)
1425        .frame_slides(true)
1426        .header("Q1 2025 Strategy Review")
1427        .footer("Confidential - Internal Use Only")
1428        .print_date(true)
1429        .print_page_numbers(true);
1430    println!("   └── Print: Handouts, 6/page, grayscale, framed");
1431    println!("       └── XML: {} bytes", print_settings.to_prnpr_xml().len());
1432
1433    let pres_settings = PresentationSettings::new()
1434        .slide_show(show_settings)
1435        .print(print_settings);
1436    println!("   All settings configured → presProps.xml");
1437
1438    // =========================================================================
1439    // Generate PPTX with real integrated features
1440    // =========================================================================
1441    println!("\n📦 Generating PPTX with integrated features...");
1442    let pptx_data = create_pptx_with_settings(
1443        "PPTX-RS Element Showcase",
1444        slides.clone(),
1445        Some(pres_settings),
1446    )?;
1447    fs::write("comprehensive_demo.pptx", &pptx_data)?;
1448    println!("   ✓ Created comprehensive_demo.pptx ({} slides, {} bytes)", 
1449             slides.len(), pptx_data.len());
1450
1451    // =========================================================================
1452    // Package Analysis - Demonstrate Reading
1453    // =========================================================================
1454    println!("\n📖 Package Analysis (Read Capability):");
1455    
1456    let package = Package::open("comprehensive_demo.pptx")?;
1457    let paths = package.part_paths();
1458    
1459    let slide_count = paths.iter()
1460        .filter(|p| p.starts_with("ppt/slides/slide") && p.ends_with(".xml"))
1461        .count();
1462    
1463    println!("   ├── Total parts: {}", package.part_count());
1464    println!("   ├── Slides: {}", slide_count);
1465    println!("   └── Package opened and analyzed successfully");
1466
1467    // =========================================================================
1468    // NEW: Parts API Demonstration
1469    // =========================================================================
1470    println!("\n🧩 Parts API Demonstration:");
1471    
1472    // SlideLayoutPart - 11 layout types
1473    println!("   ┌── SlideLayoutPart (11 layout types):");
1474    let layouts = [
1475        LayoutType::Title,
1476        LayoutType::TitleAndContent,
1477        LayoutType::SectionHeader,
1478        LayoutType::TwoContent,
1479        LayoutType::Comparison,
1480        LayoutType::TitleOnly,
1481        LayoutType::Blank,
1482        LayoutType::ContentWithCaption,
1483        LayoutType::PictureWithCaption,
1484        LayoutType::TitleAndVerticalText,
1485        LayoutType::VerticalTitleAndText,
1486    ];
1487    for (i, layout_type) in layouts.iter().enumerate() {
1488        let layout = SlideLayoutPart::new(i + 1, *layout_type);
1489        if i < 3 {
1490            println!("   │   ├── {}: {} ({})", i + 1, layout_type.name(), layout.path());
1491        }
1492    }
1493    println!("   │   └── ... and {} more layout types", layouts.len() - 3);
1494    
1495    // SlideMasterPart
1496    println!("   ├── SlideMasterPart:");
1497    let mut master = SlideMasterPart::new(1);
1498    master.set_name("Custom Master");
1499    master.add_layout_rel_id("rId2");
1500    master.add_layout_rel_id("rId3");
1501    println!("   │   ├── Name: {}", master.name());
1502    println!("   │   ├── Path: {}", master.path());
1503    println!("   │   └── Layouts: {} linked", master.layout_rel_ids().len());
1504    
1505    // ThemePart - Colors and Fonts
1506    println!("   ├── ThemePart (colors & fonts):");
1507    let mut theme = ThemePart::new(1);
1508    theme.set_name("Corporate Theme");
1509    theme.set_major_font("Arial");
1510    theme.set_minor_font("Calibri");
1511    theme.set_color("accent1", "FF5733");
1512    theme.set_color("accent2", "33FF57");
1513    let theme_xml = theme.to_xml()?;
1514    println!("   │   ├── Name: {}", theme.name());
1515    println!("   │   ├── Major Font: Arial");
1516    println!("   │   ├── Minor Font: Calibri");
1517    println!("   │   └── XML size: {} bytes", theme_xml.len());
1518    
1519    // NotesSlidePart - Speaker notes
1520    println!("   ├── NotesSlidePart (speaker notes):");
1521    let notes = NotesSlidePart::with_text(1, "Remember to:\n- Introduce yourself\n- Explain the agenda\n- Ask for questions");
1522    let notes_xml = notes.to_xml()?;
1523    println!("   │   ├── Path: {}", notes.path());
1524    println!("   │   ├── Text: \"{}...\"", &notes.notes_text()[..20.min(notes.notes_text().len())]);
1525    println!("   │   └── XML size: {} bytes", notes_xml.len());
1526    
1527    // AppPropertiesPart - Application metadata
1528    println!("   ├── AppPropertiesPart (metadata):");
1529    let mut app_props = AppPropertiesPart::new();
1530    app_props.set_company("Acme Corporation");
1531    app_props.set_slides(slides.len() as u32);
1532    let app_xml = app_props.to_xml()?;
1533    println!("   │   ├── Company: Acme Corporation");
1534    println!("   │   ├── Slides: {}", slides.len());
1535    println!("   │   └── XML size: {} bytes", app_xml.len());
1536    
1537    // MediaPart - Video/Audio formats
1538    println!("   ├── MediaPart (10 media formats):");
1539    println!("   │   ├── Video: mp4, webm, avi, wmv, mov");
1540    println!("   │   ├── Audio: mp3, wav, wma, m4a, ogg");
1541    let sample_media = MediaPart::new(1, MediaFormat::Mp4, vec![0; 100]);
1542    println!("   │   └── Sample: {} ({})", sample_media.path(), sample_media.format().mime_type());
1543    
1544    // TablePart - Table with formatting
1545    println!("   ├── TablePart (cell formatting):");
1546    let table_part = TablePart::new()
1547        .add_row(TableRowPart::new(vec![
1548            TableCellPart::new("Header 1").bold().background("4472C4"),
1549            TableCellPart::new("Header 2").bold().background("4472C4"),
1550        ]))
1551        .add_row(TableRowPart::new(vec![
1552            TableCellPart::new("Data 1").color("333333"),
1553            TableCellPart::new("Data 2").italic(),
1554        ]))
1555        .position(EMU_PER_INCH, EMU_PER_INCH * 2)
1556        .size(EMU_PER_INCH * 6, EMU_PER_INCH * 2);
1557    let table_xml = table_part.to_slide_xml(10);
1558    println!("   │   ├── Rows: {}", table_part.rows.len());
1559    println!("   │   ├── Features: bold, italic, colors, backgrounds");
1560    println!("   │   └── XML size: {} bytes", table_xml.len());
1561    
1562    // ContentTypesPart
1563    println!("   └── ContentTypesPart:");
1564    let mut content_types = ContentTypesPart::new();
1565    content_types.add_presentation();
1566    content_types.add_slide(1);
1567    content_types.add_slide_layout(1);
1568    content_types.add_slide_master(1);
1569    content_types.add_theme(1);
1570    content_types.add_core_properties();
1571    content_types.add_app_properties();
1572    let ct_xml = content_types.to_xml()?;
1573    println!("       ├── Path: {}", content_types.path());
1574    println!("       └── XML size: {} bytes", ct_xml.len());
1575
1576    // =========================================================================
1577    // NEW: Elements API Demonstration
1578    // =========================================================================
1579    println!("\n🎨 Elements API Demonstration:");
1580    
1581    // Color types
1582    println!("   ┌── Color Types:");
1583    let rgb = RgbColor::new(255, 87, 51);
1584    let rgb_hex = RgbColor::from_hex("#4472C4").unwrap();
1585    let scheme = SchemeColor::Accent1;
1586    let color = Color::rgb(100, 149, 237);
1587    println!("   │   ├── RgbColor::new(255, 87, 51) → {}", rgb.to_hex());
1588    println!("   │   ├── RgbColor::from_hex(\"#4472C4\") → {}", rgb_hex.to_hex());
1589    println!("   │   ├── SchemeColor::Accent1 → {}", scheme.as_str());
1590    println!("   │   └── Color::rgb(100, 149, 237) → XML: {}", color.to_xml().chars().take(30).collect::<String>());
1591    
1592    // Position and Size
1593    println!("   ├── Position & Size (EMU units):");
1594    let pos = Position::from_inches(1.0, 2.0);
1595    let size = Size::from_inches(4.0, 3.0);
1596    println!("   │   ├── Position::from_inches(1.0, 2.0) → x={}, y={}", pos.x, pos.y);
1597    println!("   │   ├── Size::from_inches(4.0, 3.0) → w={}, h={}", size.width, size.height);
1598    println!("   │   └── EMU_PER_INCH = {}", EMU_PER_INCH);
1599    
1600    // Transform
1601    println!("   └── Transform (position + size + rotation):");
1602    let transform = Transform::from_inches(1.0, 1.5, 3.0, 2.0).with_rotation(45.0);
1603    let transform_xml = transform.to_xml();
1604    println!("       ├── Transform::from_inches(1.0, 1.5, 3.0, 2.0)");
1605    println!("       ├── .with_rotation(45.0)");
1606    println!("       └── XML: {}...", &transform_xml[..50.min(transform_xml.len())]);
1607
1608    // =========================================================================
1609    // NEW: Advanced Features Demonstration
1610    // =========================================================================
1611    println!("\n🚀 Advanced Features Demonstration:");
1612
1613    // -------------------------------------------------------------------------
1614    // Complex Table Examples
1615    // -------------------------------------------------------------------------
1616    println!("   ┌── Complex Table Examples:");
1617    
1618    // Example 1: Financial Report Table
1619    println!("   │   ┌── Financial Report Table (5x4 with formatting):");
1620    let financial_table = TablePart::new()
1621        .add_row(TableRowPart::new(vec![
1622            TableCellPart::new("Q1 2024 Financial Summary")
1623                .col_span(4)
1624                .bold()
1625                .center()
1626                .background("1F4E79")
1627                .color("FFFFFF")
1628                .font_size(14)
1629                .font("Arial Black"),
1630        ]))
1631        .add_row(TableRowPart::new(vec![
1632            TableCellPart::new("Category").bold().center().background("2E75B6").color("FFFFFF"),
1633            TableCellPart::new("Revenue").bold().center().background("2E75B6").color("FFFFFF"),
1634            TableCellPart::new("Expenses").bold().center().background("2E75B6").color("FFFFFF"),
1635            TableCellPart::new("Profit").bold().center().background("2E75B6").color("FFFFFF"),
1636        ]))
1637        .add_row(TableRowPart::new(vec![
1638            TableCellPart::new("Product Sales").align(HorizontalAlign::Left),
1639            TableCellPart::new("$1,250,000").align(HorizontalAlign::Right).color("2E7D32"),
1640            TableCellPart::new("$450,000").align(HorizontalAlign::Right).color("C62828"),
1641            TableCellPart::new("$800,000").align(HorizontalAlign::Right).bold().color("2E7D32"),
1642        ]))
1643        .add_row(TableRowPart::new(vec![
1644            TableCellPart::new("Services").align(HorizontalAlign::Left),
1645            TableCellPart::new("$890,000").align(HorizontalAlign::Right).color("2E7D32"),
1646            TableCellPart::new("$320,000").align(HorizontalAlign::Right).color("C62828"),
1647            TableCellPart::new("$570,000").align(HorizontalAlign::Right).bold().color("2E7D32"),
1648        ]))
1649        .add_row(TableRowPart::new(vec![
1650            TableCellPart::new("Total").bold().background("E7E6E6"),
1651            TableCellPart::new("$2,140,000").bold().align(HorizontalAlign::Right).background("E7E6E6"),
1652            TableCellPart::new("$770,000").bold().align(HorizontalAlign::Right).background("E7E6E6"),
1653            TableCellPart::new("$1,370,000").bold().align(HorizontalAlign::Right).background("C6EFCE").color("006100"),
1654        ]))
1655        .position(EMU_PER_INCH / 2, EMU_PER_INCH * 2)
1656        .size(EMU_PER_INCH * 8, EMU_PER_INCH * 3);
1657    let fin_xml = financial_table.to_slide_xml(100);
1658    println!("   │   │   ├── Merged header spanning 4 columns");
1659    println!("   │   │   ├── Color-coded values (green=positive, red=negative)");
1660    println!("   │   │   ├── Custom fonts and sizes");
1661    println!("   │   │   └── XML: {} bytes", fin_xml.len());
1662
1663    // Example 2: Comparison Matrix
1664    println!("   │   ├── Comparison Matrix (features vs products):");
1665    let _matrix_table = TablePart::new()
1666        .add_row(TableRowPart::new(vec![
1667            TableCellPart::new("Feature").bold().center().background("4472C4").color("FFFFFF"),
1668            TableCellPart::new("Basic").bold().center().background("4472C4").color("FFFFFF"),
1669            TableCellPart::new("Pro").bold().center().background("4472C4").color("FFFFFF"),
1670            TableCellPart::new("Enterprise").bold().center().background("4472C4").color("FFFFFF"),
1671        ]))
1672        .add_row(TableRowPart::new(vec![
1673            TableCellPart::new("Storage").align(HorizontalAlign::Left),
1674            TableCellPart::new("5 GB").center(),
1675            TableCellPart::new("50 GB").center(),
1676            TableCellPart::new("Unlimited").center().bold().color("2E7D32"),
1677        ]))
1678        .add_row(TableRowPart::new(vec![
1679            TableCellPart::new("Users").align(HorizontalAlign::Left),
1680            TableCellPart::new("1").center(),
1681            TableCellPart::new("10").center(),
1682            TableCellPart::new("Unlimited").center().bold().color("2E7D32"),
1683        ]))
1684        .add_row(TableRowPart::new(vec![
1685            TableCellPart::new("Support").align(HorizontalAlign::Left),
1686            TableCellPart::new("Email").center(),
1687            TableCellPart::new("24/7 Chat").center(),
1688            TableCellPart::new("Dedicated").center().bold().color("2E7D32"),
1689        ]))
1690        .add_row(TableRowPart::new(vec![
1691            TableCellPart::new("Price/mo").bold().background("F2F2F2"),
1692            TableCellPart::new("$9").center().bold().background("F2F2F2"),
1693            TableCellPart::new("$29").center().bold().background("F2F2F2"),
1694            TableCellPart::new("$99").center().bold().background("F2F2F2"),
1695        ]));
1696    println!("   │   │   └── 5x4 matrix with alternating styles");
1697
1698    // Example 3: Schedule/Timeline Table
1699    println!("   │   └── Schedule Table (with row spans):");
1700    let _schedule_table = TablePart::new()
1701        .add_row(TableRowPart::new(vec![
1702            TableCellPart::new("Time").bold().center().background("70AD47").color("FFFFFF"),
1703            TableCellPart::new("Monday").bold().center().background("70AD47").color("FFFFFF"),
1704            TableCellPart::new("Tuesday").bold().center().background("70AD47").color("FFFFFF"),
1705        ]))
1706        .add_row(TableRowPart::new(vec![
1707            TableCellPart::new("9:00 AM").center().background("E2EFDA"),
1708            TableCellPart::new("Team Standup").center().row_span(2).valign(VerticalAlign::Middle).background("BDD7EE"),
1709            TableCellPart::new("Code Review").center(),
1710        ]))
1711        .add_row(TableRowPart::new(vec![
1712            TableCellPart::new("10:00 AM").center().background("E2EFDA"),
1713            TableCellPart::merged(),
1714            TableCellPart::new("Sprint Planning").center().background("FCE4D6"),
1715        ]));
1716    println!("   │       └── Row spans for multi-hour events");
1717
1718    // -------------------------------------------------------------------------
1719    // Complex Animation Sequences
1720    // -------------------------------------------------------------------------
1721    println!("   ├── Complex Animation Sequences:");
1722    
1723    // Sequence 1: Title entrance with staggered content
1724    println!("   │   ┌── Staggered Entrance Sequence:");
1725    let title_anim = Animation::new(2, AnimationEffect::Fade)
1726        .trigger(AnimationTrigger::OnClick)
1727        .duration(500);
1728    let content1 = Animation::new(3, AnimationEffect::FlyIn)
1729        .trigger(AnimationTrigger::AfterPrevious)
1730        .direction(AnimationDirection::Left)
1731        .duration(400)
1732        .delay(200);
1733    let content2 = Animation::new(4, AnimationEffect::FlyIn)
1734        .trigger(AnimationTrigger::AfterPrevious)
1735        .direction(AnimationDirection::Left)
1736        .duration(400)
1737        .delay(100);
1738    let content3 = Animation::new(5, AnimationEffect::FlyIn)
1739        .trigger(AnimationTrigger::AfterPrevious)
1740        .direction(AnimationDirection::Left)
1741        .duration(400)
1742        .delay(100);
1743    let staggered = SlideAnimations::new()
1744        .add(title_anim)
1745        .add(content1)
1746        .add(content2)
1747        .add(content3)
1748        .transition(SlideTransition::new(TransitionEffect::Push).direction(AnimationDirection::Left).duration(750));
1749    let staggered_xml = staggered.to_timing_xml()?;
1750    println!("   │   │   ├── Title: Fade on click");
1751    println!("   │   │   ├── Content 1-3: FlyIn with 100ms stagger");
1752    println!("   │   │   ├── Transition: Push from left (750ms)");
1753    println!("   │   │   └── XML: {} bytes", staggered_xml.len());
1754
1755    // Sequence 2: Emphasis and exit
1756    println!("   │   ├── Emphasis + Exit Sequence:");
1757    let emphasis = Animation::new(6, AnimationEffect::Pulse)
1758        .trigger(AnimationTrigger::OnClick)
1759        .duration(1000)
1760        .repeat(3);
1761    let exit = Animation::new(6, AnimationEffect::FadeOut)
1762        .trigger(AnimationTrigger::AfterPrevious)
1763        .duration(500);
1764    let _emphasis_seq = SlideAnimations::new()
1765        .add(emphasis)
1766        .add(exit);
1767    println!("   │   │   ├── Pulse 3x on click, then fade out");
1768    println!("   │   │   └── Same shape, sequential effects");
1769
1770    // Sequence 3: Motion path
1771    println!("   │   └── Motion Path Animation:");
1772    let _motion = Animation::new(7, AnimationEffect::Lines)
1773        .trigger(AnimationTrigger::OnClick)
1774        .duration(2000);
1775    println!("   │       └── Custom path: Lines, Arcs, Turns, Loops");
1776
1777    // -------------------------------------------------------------------------
1778    // SmartArt Combinations
1779    // -------------------------------------------------------------------------
1780    println!("   ├── SmartArt Layout Examples:");
1781    
1782    // Process flow
1783    println!("   │   ┌── Process Flow (5 steps):");
1784    let process = SmartArtPart::new(1, SmartArtLayout::BasicProcess)
1785        .add_items(vec!["Research", "Design", "Develop", "Test", "Deploy"])
1786        .position(EMU_PER_INCH / 2, EMU_PER_INCH * 2)
1787        .size(EMU_PER_INCH * 8, EMU_PER_INCH * 2);
1788    println!("   │   │   └── {} nodes in horizontal flow", process.nodes().len());
1789
1790    // Organization chart
1791    println!("   │   ├── Organization Chart:");
1792    let org = SmartArtPart::new(2, SmartArtLayout::OrgChart)
1793        .add_items(vec!["CEO", "CTO", "CFO", "VP Engineering", "VP Sales"]);
1794    println!("   │   │   └── Hierarchical structure with {} positions", org.nodes().len());
1795
1796    // Cycle diagram
1797    println!("   │   ├── Cycle Diagram:");
1798    let cycle = SmartArtPart::new(3, SmartArtLayout::BasicCycle)
1799        .add_items(vec!["Plan", "Do", "Check", "Act"]);
1800    println!("   │   │   └── PDCA cycle with {} phases", cycle.nodes().len());
1801
1802    // Venn diagram
1803    println!("   │   ├── Venn Diagram:");
1804    let _venn = SmartArtPart::new(4, SmartArtLayout::BasicVenn)
1805        .add_items(vec!["Skills", "Passion", "Market Need"]);
1806    println!("   │   │   └── 3-circle Venn for Ikigai concept");
1807
1808    // Pyramid
1809    println!("   │   └── Pyramid:");
1810    let pyramid = SmartArtPart::new(5, SmartArtLayout::BasicPyramid)
1811        .add_items(vec!["Self-Actualization", "Esteem", "Love/Belonging", "Safety", "Physiological"]);
1812    println!("   │       └── Maslow's hierarchy with {} levels", pyramid.nodes().len());
1813
1814    // -------------------------------------------------------------------------
1815    // 3D Model Configurations
1816    // -------------------------------------------------------------------------
1817    println!("   ├── 3D Model Configurations:");
1818    
1819    // Product showcase
1820    println!("   │   ┌── Product Showcase:");
1821    let _product_3d = Model3DPart::new(1, Model3DFormat::Glb, vec![0; 100])
1822        .camera(CameraPreset::IsometricTopUp)
1823        .rotation(0.0, 45.0, 0.0)
1824        .zoom(1.2)
1825        .position(EMU_PER_INCH * 2, EMU_PER_INCH * 2)
1826        .size(EMU_PER_INCH * 4, EMU_PER_INCH * 4);
1827    println!("   │   │   ├── Camera: Isometric top-up view");
1828    println!("   │   │   ├── Rotation: 45° Y-axis for best angle");
1829    println!("   │   │   └── Zoom: 1.2x for detail");
1830
1831    // Architectural model
1832    println!("   │   ├── Architectural Model:");
1833    let _arch_3d = Model3DPart::new(2, Model3DFormat::Gltf, vec![0; 100])
1834        .camera(CameraPreset::Front)
1835        .rotation(15.0, -30.0, 0.0)
1836        .ambient_light("FFFFCC");
1837    println!("   │   │   ├── Camera: Front view with tilt");
1838    println!("   │   │   └── Ambient: Warm lighting (FFFFCC)");
1839
1840    // Technical diagram
1841    println!("   │   └── Technical Diagram:");
1842    let _tech_3d = Model3DPart::new(3, Model3DFormat::Obj, vec![0; 100])
1843        .camera(CameraPreset::IsometricOffAxis1Top)
1844        .rotation(0.0, 0.0, 0.0);
1845    println!("   │       └── Camera: Off-axis isometric for exploded view");
1846
1847    // -------------------------------------------------------------------------
1848    // Theme + Master + Layout Combination
1849    // -------------------------------------------------------------------------
1850    println!("   ├── Theme + Master + Layout Integration:");
1851    
1852    // Corporate theme
1853    let mut corp_theme = ThemePart::new(1);
1854    corp_theme.set_name("Corporate Blue");
1855    corp_theme.set_major_font("Segoe UI");
1856    corp_theme.set_minor_font("Segoe UI Light");
1857    corp_theme.set_color("dk1", "000000");
1858    corp_theme.set_color("lt1", "FFFFFF");
1859    corp_theme.set_color("dk2", "1F497D");
1860    corp_theme.set_color("lt2", "EEECE1");
1861    corp_theme.set_color("accent1", "4472C4");
1862    corp_theme.set_color("accent2", "ED7D31");
1863    corp_theme.set_color("accent3", "A5A5A5");
1864    corp_theme.set_color("accent4", "FFC000");
1865    corp_theme.set_color("accent5", "5B9BD5");
1866    corp_theme.set_color("accent6", "70AD47");
1867    let theme_xml = corp_theme.to_xml()?;
1868    println!("   │   ├── Theme: Corporate Blue");
1869    println!("   │   │   ├── Fonts: Segoe UI / Segoe UI Light");
1870    println!("   │   │   ├── 12 color slots defined");
1871    println!("   │   │   └── XML: {} bytes", theme_xml.len());
1872
1873    // Master with multiple layouts
1874    let mut corp_master = SlideMasterPart::new(1);
1875    corp_master.set_name("Corporate Master");
1876    corp_master.add_layout_rel_id("rId2"); // Title
1877    corp_master.add_layout_rel_id("rId3"); // Title + Content
1878    corp_master.add_layout_rel_id("rId4"); // Section Header
1879    corp_master.add_layout_rel_id("rId5"); // Two Content
1880    corp_master.add_layout_rel_id("rId6"); // Comparison
1881    corp_master.add_layout_rel_id("rId7"); // Title Only
1882    corp_master.add_layout_rel_id("rId8"); // Blank
1883    println!("   │   └── Master: {} with {} layouts linked", corp_master.name(), corp_master.layout_rel_ids().len());
1884
1885    // -------------------------------------------------------------------------
1886    // VBA + Custom XML Integration
1887    // -------------------------------------------------------------------------
1888    println!("   ├── VBA + Custom XML Integration:");
1889    
1890    // VBA with multiple modules
1891    let _vba_project = VbaProjectPart::new()
1892        .add_module(VbaModule::new("AutoRun", r#"
1893Sub Auto_Open()
1894    MsgBox "Welcome to the presentation!"
1895End Sub
1896
1897Sub NavigateToSlide(slideNum As Integer)
1898    SlideShowWindows(1).View.GotoSlide slideNum
1899End Sub
1900"#))
1901        .add_module(VbaModule::new("DataHelpers", r#"
1902Function GetCustomData(key As String) As String
1903    ' Read from Custom XML part
1904    GetCustomData = ActivePresentation.CustomXMLParts(1).SelectSingleNode("//" & key).Text
1905End Function
1906"#))
1907        .add_module(VbaModule::class("SlideController", r#"
1908Private currentSlide As Integer
1909
1910Public Sub NextSlide()
1911    currentSlide = currentSlide + 1
1912    NavigateToSlide currentSlide
1913End Sub
1914"#));
1915    println!("   │   ├── VBA Project:");
1916    println!("   │   │   ├── AutoRun: Auto_Open, NavigateToSlide");
1917    println!("   │   │   ├── DataHelpers: GetCustomData (reads Custom XML)");
1918    println!("   │   │   └── SlideController: Class for navigation");
1919
1920    // Custom XML with structured data
1921    let app_config = CustomXmlPart::new(1, "presentationConfig")
1922        .namespace("http://company.com/pptx/config")
1923        .property("version", "2.1.0")
1924        .property("author", "Demo User")
1925        .property("department", "Engineering")
1926        .property("confidentiality", "Internal")
1927        .property("lastModified", "2024-01-15T10:30:00Z");
1928    let config_xml = app_config.to_xml()?;
1929    println!("   │   └── Custom XML:");
1930    println!("   │       ├── Namespace: http://company.com/pptx/config");
1931    println!("   │       ├── Properties: version, author, department, etc.");
1932    println!("   │       └── XML: {} bytes", config_xml.len());
1933
1934    // -------------------------------------------------------------------------
1935    // Embedded Fonts with Variants
1936    // -------------------------------------------------------------------------
1937    println!("   ├── Embedded Font Collection:");
1938    let mut font_collection = EmbeddedFontCollection::new();
1939    font_collection.add("Corporate Sans", vec![0; 1000]);
1940    font_collection.add_with_type("Corporate Sans", vec![0; 1000], FontEmbedType::Bold);
1941    font_collection.add_with_type("Corporate Sans", vec![0; 1000], FontEmbedType::Italic);
1942    font_collection.add_with_type("Corporate Sans", vec![0; 1000], FontEmbedType::BoldItalic);
1943    font_collection.add("Code Mono", vec![0; 800]);
1944    let fonts_xml = font_collection.to_xml();
1945    println!("   │   ├── Corporate Sans: Regular, Bold, Italic, BoldItalic");
1946    println!("   │   ├── Code Mono: Regular");
1947    println!("   │   ├── Total: {} font files", font_collection.len());
1948    println!("   │   └── XML: {} bytes", fonts_xml.len());
1949
1950    // -------------------------------------------------------------------------
1951    // Handout with Full Configuration
1952    // -------------------------------------------------------------------------
1953    println!("   └── Handout Master Configuration:");
1954    let handout = HandoutMasterPart::new()
1955        .layout(HandoutLayout::SlidesPerPage6)
1956        .header("Q1 2024 Strategy Review")
1957        .footer("Confidential - Internal Use Only");
1958    let handout_xml = handout.to_xml()?;
1959    println!("       ├── Layout: 6 slides per page");
1960    println!("       ├── Header: Q1 2024 Strategy Review");
1961    println!("       ├── Footer: Confidential - Internal Use Only");
1962    println!("       └── XML: {} bytes", handout_xml.len());
1963
1964    // =========================================================================
1965    // Summary
1966    // =========================================================================
1967    println!("\n╔══════════════════════════════════════════════════════════════╗");
1968    println!("║                    Element Coverage Summary                   ║");
1969    println!("╠══════════════════════════════════════════════════════════════╣");
1970    println!("║  LAYOUTS (6 types):                                          ║");
1971    println!("║    ✓ CenteredTitle    ✓ TitleOnly      ✓ TitleAndContent     ║");
1972    println!("║    ✓ TitleAndBigContent  ✓ TwoColumn   ✓ Blank               ║");
1973    println!("╠══════════════════════════════════════════════════════════════╣");
1974    println!("║  TEXT FORMATTING:                                            ║");
1975    println!("║    ✓ Bold            ✓ Italic         ✓ Underline            ║");
1976    println!("║    ✓ Font Size       ✓ Font Color     ✓ Title/Content styles ║");
1977    println!("╠══════════════════════════════════════════════════════════════╣");
1978    println!("║  TABLES:                                                     ║");
1979    println!("║    ✓ Multiple rows/columns  ✓ Bold cells  ✓ Background colors║");
1980    println!("║    ✓ Header styling         ✓ Position control               ║");
1981    println!("╠══════════════════════════════════════════════════════════════╣");
1982    println!("║  CHARTS:                                                     ║");
1983    println!("║    ✓ Bar Chart       ✓ Line Chart     ✓ Pie Chart            ║");
1984    println!("║    ✓ Multiple series ✓ Categories                            ║");
1985    println!("╠══════════════════════════════════════════════════════════════╣");
1986    println!("║  SHAPES:                                                     ║");
1987    println!("║    ✓ Rectangle       ✓ Ellipse        ✓ RoundedRectangle     ║");
1988    println!("║    ✓ Triangle        ✓ Diamond        ✓ Color fills          ║");
1989    println!("║    ✓ Gradient fills  ✓ Transparency   ✓ Text in shapes       ║");
1990    println!("╠══════════════════════════════════════════════════════════════╣");
1991    println!("║  CONNECTORS (NEW):                                           ║");
1992    println!("║    ✓ Straight        ✓ Elbow          ✓ Curved               ║");
1993    println!("║    ✓ Arrow types     ✓ Dash styles    ✓ Line colors/widths   ║");
1994    println!("╠══════════════════════════════════════════════════════════════╣");
1995    println!("║  IMAGES:                                                     ║");
1996    println!("║    ✓ Image placeholders  ✓ Position   ✓ Dimensions           ║");
1997    println!("╠══════════════════════════════════════════════════════════════╣");
1998    println!("║  PACKAGE:                                                    ║");
1999    println!("║    ✓ Create PPTX     ✓ Read PPTX      ✓ Analyze contents     ║");
2000    println!("╠══════════════════════════════════════════════════════════════╣");
2001    println!("║  PARTS API (NEW):                                            ║");
2002    println!("║    ✓ SlideLayoutPart (11 types)  ✓ SlideMasterPart           ║");
2003    println!("║    ✓ ThemePart (colors/fonts)    ✓ NotesSlidePart            ║");
2004    println!("║    ✓ AppPropertiesPart           ✓ MediaPart (10 formats)    ║");
2005    println!("║    ✓ TablePart (cell formatting) ✓ ContentTypesPart          ║");
2006    println!("╠══════════════════════════════════════════════════════════════╣");
2007    println!("║  ELEMENTS API:                                               ║");
2008    println!("║    ✓ RgbColor        ✓ SchemeColor    ✓ Color enum           ║");
2009    println!("║    ✓ Position        ✓ Size           ✓ Transform            ║");
2010    println!("║    ✓ EMU conversions (inches, cm, mm, pt)                    ║");
2011    println!("╠══════════════════════════════════════════════════════════════╣");
2012    println!("║  ADVANCED FEATURES (NEW):                                    ║");
2013    println!("║    ✓ Animation (50+ effects)  ✓ Transitions (27 types)       ║");
2014    println!("║    ✓ SmartArt (25 layouts)    ✓ 3D Models (GLB/GLTF/OBJ)     ║");
2015    println!("║    ✓ VBA Macros (.pptm)       ✓ Embedded Fonts               ║");
2016    println!("║    ✓ Custom XML               ✓ Handout Master               ║");
2017    println!("║    ✓ Table borders/alignment  ✓ Merged cells                 ║");
2018    println!("╠══════════════════════════════════════════════════════════════╣");
2019    println!("║  DIMENSION API (NEW):                                        ║");
2020    println!("║    ✓ EMU / Inches / Cm / Pt / Ratio / Percent units          ║");
2021    println!("║    ✓ from_dimensions() constructor                           ║");
2022    println!("║    ✓ Fluent .at() and .with_dimensions() chaining            ║");
2023    println!("║    ✓ Mixed-unit positioning (e.g. inches + percent)          ║");
2024    println!("╠══════════════════════════════════════════════════════════════╣");
2025    println!("║  Output: comprehensive_demo.pptx ({} slides, {} KB)         ║", 
2026             slides.len(), pptx_data.len() / 1024);
2027    println!("╚══════════════════════════════════════════════════════════════╝");
2028
2029    Ok(())
2030}
Source

pub fn to_hex(&self) -> String

Convert to hex string (uppercase, no #)

Examples found in repository?
examples/comprehensive_demo.rs (line 1587)
69fn main() -> Result<(), Box<dyn std::error::Error>> {
70    println!("╔══════════════════════════════════════════════════════════════╗");
71    println!("║       PPTX-RS Element Showcase - Complete Coverage           ║");
72    println!("╚══════════════════════════════════════════════════════════════╝\n");
73
74    let mut slides = Vec::new();
75
76    // =========================================================================
77    // SLIDE 1: CenteredTitle Layout + Title Formatting
78    // =========================================================================
79    println!("📐 Slide 1: CenteredTitle Layout + Title Formatting");
80    slides.push(
81        SlideContent::new("PPTX-RS Element Showcase")
82            .layout(SlideLayout::CenteredTitle)
83            .title_size(54)
84            .title_bold(true)
85            .title_color("1F497D")
86    );
87
88    // =========================================================================
89    // SLIDE 2: TitleOnly Layout
90    // =========================================================================
91    println!("📐 Slide 2: TitleOnly Layout");
92    slides.push(
93        SlideContent::new("Section: Slide Layouts")
94            .layout(SlideLayout::TitleOnly)
95            .title_size(48)
96            .title_bold(true)
97            .title_color("C0504D")
98    );
99
100    // =========================================================================
101    // SLIDE 3: TitleAndContent Layout + All Text Formatting
102    // =========================================================================
103    println!("📝 Slide 3: TitleAndContent + Text Formatting");
104    slides.push(
105        SlideContent::new("Text Formatting Options")
106            .layout(SlideLayout::TitleAndContent)
107            .title_color("1F497D")
108            .title_bold(true)
109            .title_italic(true)
110            .title_underline(true)
111            .title_size(44)
112            .add_bullet("Normal text (default)")
113            .add_bullet("Bold content text")
114            .add_bullet("Italic content text")
115            .add_bullet("Underlined content")
116            .add_bullet("Custom font size (28pt)")
117            .add_bullet("Custom color (#4F81BD)")
118            .content_bold(true)
119            .content_italic(true)
120            .content_underline(true)
121            .content_size(28)
122            .content_color("4F81BD")
123    );
124
125    // =========================================================================
126    // SLIDE 4: TitleAndBigContent Layout
127    // =========================================================================
128    println!("📐 Slide 4: TitleAndBigContent Layout");
129    slides.push(
130        SlideContent::new("Key Highlights")
131            .layout(SlideLayout::TitleAndBigContent)
132            .title_color("1F497D")
133            .add_bullet("Large content area for emphasis")
134            .add_bullet("Perfect for key messages")
135            .add_bullet("Smaller title, bigger content")
136            .content_bold(true)
137            .content_size(32)
138    );
139
140    // =========================================================================
141    // SLIDE 5: TwoColumn Layout
142    // =========================================================================
143    println!("📐 Slide 5: TwoColumn Layout");
144    slides.push(
145        SlideContent::new("Two Column Comparison")
146            .layout(SlideLayout::TwoColumn)
147            .title_color("1F497D")
148            .add_bullet("Left Column Item 1")
149            .add_bullet("Left Column Item 2")
150            .add_bullet("Left Column Item 3")
151            .add_bullet("Right Column Item 1")
152            .add_bullet("Right Column Item 2")
153            .add_bullet("Right Column Item 3")
154            .content_size(24)
155    );
156
157    // =========================================================================
158    // SLIDE 6: Blank Layout
159    // =========================================================================
160    println!("📐 Slide 6: Blank Layout");
161    slides.push(
162        SlideContent::new("")
163            .layout(SlideLayout::Blank)
164    );
165
166    // =========================================================================
167    // SLIDE 7: Table with All Cell Styling Options
168    // =========================================================================
169    println!("📊 Slide 7: Table with Cell Styling");
170    let styled_table = TableBuilder::new(vec![1500000, 1500000, 1500000])
171        .add_row(TableRow::new(vec![
172            TableCell::new("Header 1").bold().background_color("1F497D"),
173            TableCell::new("Header 2").bold().background_color("4F81BD"),
174            TableCell::new("Header 3").bold().background_color("8064A2"),
175        ]))
176        .add_row(TableRow::new(vec![
177            TableCell::new("Bold Cell").bold(),
178            TableCell::new("Normal Cell"),
179            TableCell::new("Colored").background_color("9BBB59"),
180        ]))
181        .add_row(TableRow::new(vec![
182            TableCell::new("Red BG").background_color("C0504D"),
183            TableCell::new("Green BG").background_color("9BBB59"),
184            TableCell::new("Blue BG").background_color("4F81BD"),
185        ]))
186        .add_row(TableRow::new(vec![
187            TableCell::new("Row 3 Col 1"),
188            TableCell::new("Row 3 Col 2"),
189            TableCell::new("Row 3 Col 3").bold().background_color("F79646"),
190        ]))
191        .position(500000, 1800000)
192        .build();
193    
194    slides.push(
195        SlideContent::new("Table with Cell Styling")
196            .table(styled_table)
197            .title_color("1F497D")
198    );
199
200    // =========================================================================
201    // SLIDE 8: Charts (Bar, Line, Pie)
202    // =========================================================================
203    println!("📈 Slide 8: Chart Types");
204    
205    // Create chart data structures (for demonstration)
206    let _bar_chart = ChartBuilder::new("Sales by Region", ChartType::Bar)
207        .categories(vec!["North", "South", "East", "West"])
208        .add_series(ChartSeries::new("2023", vec![100.0, 80.0, 120.0, 90.0]))
209        .add_series(ChartSeries::new("2024", vec![120.0, 95.0, 140.0, 110.0]))
210        .build();
211    
212    let _line_chart = ChartBuilder::new("Monthly Trend", ChartType::Line)
213        .categories(vec!["Jan", "Feb", "Mar", "Apr", "May", "Jun"])
214        .add_series(ChartSeries::new("Revenue", vec![10.0, 12.0, 15.0, 14.0, 18.0, 22.0]))
215        .build();
216    
217    let _pie_chart = ChartBuilder::new("Market Share", ChartType::Pie)
218        .categories(vec!["Product A", "Product B", "Product C", "Others"])
219        .add_series(ChartSeries::new("Share", vec![40.0, 30.0, 20.0, 10.0]))
220        .build();
221    
222    slides.push(
223        SlideContent::new("Chart Types: Bar, Line, Pie")
224            .with_chart()
225            .title_color("1F497D")
226            .add_bullet("Bar Chart: Compare categories")
227            .add_bullet("Line Chart: Show trends over time")
228            .add_bullet("Pie Chart: Show proportions")
229            .content_size(24)
230    );
231
232    // =========================================================================
233    // SLIDE 9: Shapes with Different Fills
234    // =========================================================================
235    println!("🔷 Slide 9: Shapes with Fills");
236    
237    let rect = Shape::new(ShapeType::Rectangle, 500000, 1600000, 2000000, 1000000)
238        .with_fill(ShapeFill::new("4F81BD"))
239        .with_text("Rectangle");
240    
241    let ellipse = Shape::new(ShapeType::Ellipse, 3000000, 1600000, 2000000, 1000000)
242        .with_fill(ShapeFill::new("9BBB59"))
243        .with_text("Ellipse");
244    
245    let rounded = Shape::new(ShapeType::RoundedRectangle, 5500000, 1600000, 2000000, 1000000)
246        .with_fill(ShapeFill::new("C0504D"))
247        .with_text("Rounded");
248    
249    let triangle = Shape::new(ShapeType::Triangle, 1500000, 3000000, 1500000, 1200000)
250        .with_fill(ShapeFill::new("8064A2"))
251        .with_text("Triangle");
252    
253    let diamond = Shape::new(ShapeType::Diamond, 4000000, 3000000, 1500000, 1200000)
254        .with_fill(ShapeFill::new("F79646"))
255        .with_text("Diamond");
256    
257    slides.push(
258        SlideContent::new("Shape Types with Color Fills")
259            .add_shape(rect)
260            .add_shape(ellipse)
261            .add_shape(rounded)
262            .add_shape(triangle)
263            .add_shape(diamond)
264            .title_color("1F497D")
265    );
266
267    // =========================================================================
268    // SLIDE 10: Gradient Fills (NEW)
269    // =========================================================================
270    println!("🌈 Slide 10: Gradient Fills");
271    
272    // Horizontal gradient
273    let gradient_h = Shape::new(ShapeType::Rectangle, 500000, 1600000, 2500000, 1200000)
274        .with_gradient(GradientFill::linear("1565C0", "42A5F5", GradientDirection::Horizontal))
275        .with_text("Horizontal");
276    
277    // Vertical gradient
278    let gradient_v = Shape::new(ShapeType::Rectangle, 3200000, 1600000, 2500000, 1200000)
279        .with_gradient(GradientFill::linear("2E7D32", "81C784", GradientDirection::Vertical))
280        .with_text("Vertical");
281    
282    // Diagonal gradient
283    let gradient_d = Shape::new(ShapeType::RoundedRectangle, 5900000, 1600000, 2500000, 1200000)
284        .with_gradient(GradientFill::linear("C62828", "EF9A9A", GradientDirection::DiagonalDown))
285        .with_text("Diagonal");
286    
287    // Three-color gradient
288    let gradient_3 = Shape::new(ShapeType::Ellipse, 1800000, 3200000, 2500000, 1200000)
289        .with_gradient(GradientFill::three_color("FF6F00", "FFC107", "FFEB3B", GradientDirection::Horizontal))
290        .with_text("3-Color");
291    
292    // Custom angle gradient
293    let gradient_angle = Shape::new(ShapeType::RoundedRectangle, 4800000, 3200000, 2500000, 1200000)
294        .with_gradient(GradientFill::linear("7B1FA2", "E1BEE7", GradientDirection::Angle(135)))
295        .with_text("135° Angle");
296    
297    slides.push(
298        SlideContent::new("Gradient Fills - Multiple Directions")
299            .add_shape(gradient_h)
300            .add_shape(gradient_v)
301            .add_shape(gradient_d)
302            .add_shape(gradient_3)
303            .add_shape(gradient_angle)
304            .title_color("1F497D")
305    );
306
307    // =========================================================================
308    // SLIDE 11: Transparency (NEW)
309    // =========================================================================
310    println!("👻 Slide 11: Transparency Effects");
311    
312    // Base shape (fully opaque)
313    let base = Shape::new(ShapeType::Rectangle, 1000000, 1800000, 3000000, 2000000)
314        .with_fill(ShapeFill::new("1565C0"))
315        .with_text("Base (100%)");
316    
317    // 25% transparent overlay
318    let trans_25 = Shape::new(ShapeType::Rectangle, 2000000, 2200000, 2500000, 1500000)
319        .with_fill(ShapeFill::new("F44336").with_transparency(25))
320        .with_line(ShapeLine::new("B71C1C", 25400))
321        .with_text("25% Transparent");
322    
323    // 50% transparent overlay
324    let trans_50 = Shape::new(ShapeType::Ellipse, 4500000, 1800000, 2500000, 2000000)
325        .with_fill(ShapeFill::new("4CAF50").with_transparency(50))
326        .with_line(ShapeLine::new("1B5E20", 25400))
327        .with_text("50% Transparent");
328    
329    // 75% transparent overlay
330    let trans_75 = Shape::new(ShapeType::RoundedRectangle, 5500000, 2500000, 2500000, 1500000)
331        .with_fill(ShapeFill::new("FF9800").with_transparency(75))
332        .with_line(ShapeLine::new("E65100", 25400))
333        .with_text("75% Transparent");
334    
335    slides.push(
336        SlideContent::new("Transparency Effects - Overlapping Shapes")
337            .add_shape(base)
338            .add_shape(trans_25)
339            .add_shape(trans_50)
340            .add_shape(trans_75)
341            .title_color("1F497D")
342    );
343
344    // =========================================================================
345    // SLIDE 12: Styled Connectors (NEW)
346    // =========================================================================
347    println!("🔗 Slide 12: Styled Connectors");
348    
349    // Create shapes to connect
350    let box1 = Shape::new(ShapeType::RoundedRectangle, 500000, 1800000, 1800000, 800000)
351        .with_id(100)
352        .with_fill(ShapeFill::new("1565C0"))
353        .with_text("Start");
354    
355    let box2 = Shape::new(ShapeType::RoundedRectangle, 3500000, 1800000, 1800000, 800000)
356        .with_id(101)
357        .with_fill(ShapeFill::new("2E7D32"))
358        .with_text("Process");
359    
360    let box3 = Shape::new(ShapeType::RoundedRectangle, 6500000, 1800000, 1800000, 800000)
361        .with_id(102)
362        .with_fill(ShapeFill::new("C62828"))
363        .with_text("End");
364    
365    // Straight connector with arrow
366    let conn1 = Connector::straight(2300000, 2200000, 3500000, 2200000)
367        .with_line(ConnectorLine::new("1565C0", 25400))
368        .with_end_arrow(ArrowType::Triangle)
369        .with_arrow_size(ArrowSize::Large);
370    
371    // Elbow connector with stealth arrow
372    let conn2 = Connector::elbow(5300000, 2200000, 6500000, 2200000)
373        .with_line(ConnectorLine::new("2E7D32", 38100).with_dash(LineDash::Dash))
374        .with_end_arrow(ArrowType::Stealth)
375        .with_arrow_size(ArrowSize::Medium);
376    
377    // Curved connector examples
378    let box4 = Shape::new(ShapeType::Ellipse, 1000000, 3200000, 1500000, 800000)
379        .with_id(103)
380        .with_fill(ShapeFill::new("7B1FA2"))
381        .with_text("A");
382    
383    let box5 = Shape::new(ShapeType::Ellipse, 4000000, 3200000, 1500000, 800000)
384        .with_id(104)
385        .with_fill(ShapeFill::new("00838F"))
386        .with_text("B");
387    
388    let box6 = Shape::new(ShapeType::Ellipse, 7000000, 3200000, 1500000, 800000)
389        .with_id(105)
390        .with_fill(ShapeFill::new("EF6C00"))
391        .with_text("C");
392    
393    // Curved connector with diamond arrow
394    let conn3 = Connector::curved(2500000, 3600000, 4000000, 3600000)
395        .with_line(ConnectorLine::new("7B1FA2", 19050).with_dash(LineDash::DashDot))
396        .with_arrows(ArrowType::Oval, ArrowType::Diamond);
397    
398    // Dotted connector
399    let conn4 = Connector::straight(5500000, 3600000, 7000000, 3600000)
400        .with_line(ConnectorLine::new("00838F", 12700).with_dash(LineDash::Dot))
401        .with_end_arrow(ArrowType::Open);
402    
403    slides.push(
404        SlideContent::new("Styled Connectors - Types, Arrows, Dashes")
405            .add_shape(box1)
406            .add_shape(box2)
407            .add_shape(box3)
408            .add_shape(box4)
409            .add_shape(box5)
410            .add_shape(box6)
411            .add_connector(conn1)
412            .add_connector(conn2)
413            .add_connector(conn3)
414            .add_connector(conn4)
415            .title_color("1F497D")
416    );
417
418    // =========================================================================
419    // SLIDE 13: Images
420    // =========================================================================
421    println!("🖼️  Slide 13: Image Placeholders");
422    
423    let img1 = Image::new("logo.png", 2500000, 1800000, "png")
424        .position(500000, 1600000);
425    let img2 = Image::new("photo.jpg", 2500000, 1800000, "jpg")
426        .position(3500000, 1600000);
427    let img3 = Image::new("diagram.png", 2000000, 1800000, "png")
428        .position(6500000, 1600000);
429    
430    slides.push(
431        SlideContent::new("Image Placeholders")
432            .add_image(img1)
433            .add_image(img2)
434            .add_image(img3)
435            .title_color("1F497D")
436    );
437
438    // =========================================================================
439    // SLIDE 11: Advanced Table with Borders & Alignment (NEW)
440    // =========================================================================
441    println!("📊 Slide 11: Advanced Table (borders, alignment, merged cells)");
442    
443    // Build advanced table using generator's TableBuilder with alignment
444    let advanced_table = TableBuilder::new(vec![2000000, 2000000, 2000000, 2000000])
445        .add_row(TableRow::new(vec![
446            TableCell::new("Q1 2024 Financial Report").bold().background_color("1F4E79").text_color("FFFFFF").align_center().font_size(14),
447            TableCell::new("").background_color("1F4E79"),
448            TableCell::new("").background_color("1F4E79"),
449            TableCell::new("").background_color("1F4E79"),
450        ]))
451        .add_row(TableRow::new(vec![
452            TableCell::new("Category").bold().background_color("2E75B6").text_color("FFFFFF").align_center(),
453            TableCell::new("Revenue").bold().background_color("2E75B6").text_color("FFFFFF").align_center(),
454            TableCell::new("Expenses").bold().background_color("2E75B6").text_color("FFFFFF").align_center(),
455            TableCell::new("Profit").bold().background_color("2E75B6").text_color("FFFFFF").align_center(),
456        ]))
457        .add_row(TableRow::new(vec![
458            TableCell::new("Product Sales").text_color("000000").align_left(),
459            TableCell::new("$1,250,000").text_color("2E7D32").align_right(),
460            TableCell::new("$450,000").text_color("C62828").align_right(),
461            TableCell::new("$800,000").bold().text_color("2E7D32").align_right(),
462        ]))
463        .add_row(TableRow::new(vec![
464            TableCell::new("Services").text_color("000000").align_left(),
465            TableCell::new("$890,000").text_color("2E7D32").align_right(),
466            TableCell::new("$320,000").text_color("C62828").align_right(),
467            TableCell::new("$570,000").bold().text_color("2E7D32").align_right(),
468        ]))
469        .add_row(TableRow::new(vec![
470            TableCell::new("Total").bold().background_color("E7E6E6").text_color("000000").align_left(),
471            TableCell::new("$2,140,000").bold().background_color("E7E6E6").text_color("000000").align_right(),
472            TableCell::new("$770,000").bold().background_color("E7E6E6").text_color("000000").align_right(),
473            TableCell::new("$1,370,000").bold().background_color("C6EFCE").text_color("006100").align_right(),
474        ]))
475        .position(300000, 1600000)
476        .build();
477    
478    slides.push(
479        SlideContent::new("Financial Report - Advanced Table")
480            .table(advanced_table)
481            .title_color("1F4E79")
482            .title_bold(true)
483    );
484
485    // =========================================================================
486    // SLIDE 12: Comparison Matrix Table (NEW)
487    // =========================================================================
488    println!("📊 Slide 12: Comparison Matrix Table");
489    
490    let comparison_table = TableBuilder::new(vec![2000000, 1500000, 1500000, 1500000])
491        .add_row(TableRow::new(vec![
492            TableCell::new("Feature").bold().background_color("4472C4").text_color("FFFFFF"),
493            TableCell::new("Basic").bold().background_color("4472C4").text_color("FFFFFF"),
494            TableCell::new("Pro").bold().background_color("4472C4").text_color("FFFFFF"),
495            TableCell::new("Enterprise").bold().background_color("4472C4").text_color("FFFFFF"),
496        ]))
497        .add_row(TableRow::new(vec![
498            TableCell::new("Storage").text_color("000000"),
499            TableCell::new("5 GB").text_color("000000"),
500            TableCell::new("50 GB").text_color("000000"),
501            TableCell::new("Unlimited").bold().text_color("2E7D32"),
502        ]))
503        .add_row(TableRow::new(vec![
504            TableCell::new("Users").text_color("000000"),
505            TableCell::new("1").text_color("000000"),
506            TableCell::new("10").text_color("000000"),
507            TableCell::new("Unlimited").bold().text_color("2E7D32"),
508        ]))
509        .add_row(TableRow::new(vec![
510            TableCell::new("Support").text_color("000000"),
511            TableCell::new("Email").text_color("000000"),
512            TableCell::new("24/7 Chat").text_color("000000"),
513            TableCell::new("Dedicated").bold().text_color("2E7D32"),
514        ]))
515        .add_row(TableRow::new(vec![
516            TableCell::new("API Access").text_color("000000"),
517            TableCell::new("No").text_color("C62828"),
518            TableCell::new("Yes").text_color("2E7D32"),
519            TableCell::new("Yes + Priority").bold().text_color("2E7D32"),
520        ]))
521        .add_row(TableRow::new(vec![
522            TableCell::new("Price/month").bold().background_color("F2F2F2").text_color("000000"),
523            TableCell::new("$9").bold().background_color("F2F2F2").text_color("000000"),
524            TableCell::new("$29").bold().background_color("F2F2F2").text_color("000000"),
525            TableCell::new("$99").bold().background_color("F2F2F2").text_color("000000"),
526        ]))
527        .position(500000, 1600000)
528        .build();
529    
530    slides.push(
531        SlideContent::new("Pricing Comparison Matrix")
532            .table(comparison_table)
533            .title_color("4472C4")
534            .title_bold(true)
535    );
536
537    // =========================================================================
538    // SLIDE 13: Process Flow with Shapes (NEW - SmartArt-like)
539    // =========================================================================
540    println!("🔷 Slide 13: Process Flow (SmartArt-style)");
541    
542    // Create process flow using shapes
543    let step1 = Shape::new(ShapeType::RoundedRectangle, 300000, 2000000, 1400000, 800000)
544        .with_fill(ShapeFill::new("4472C4"))
545        .with_text("1. Research");
546    let arrow1 = Shape::new(ShapeType::RightArrow, 1800000, 2200000, 400000, 400000)
547        .with_fill(ShapeFill::new("A5A5A5"));
548    let step2 = Shape::new(ShapeType::RoundedRectangle, 2300000, 2000000, 1400000, 800000)
549        .with_fill(ShapeFill::new("ED7D31"))
550        .with_text("2. Design");
551    let arrow2 = Shape::new(ShapeType::RightArrow, 3800000, 2200000, 400000, 400000)
552        .with_fill(ShapeFill::new("A5A5A5"));
553    let step3 = Shape::new(ShapeType::RoundedRectangle, 4300000, 2000000, 1400000, 800000)
554        .with_fill(ShapeFill::new("70AD47"))
555        .with_text("3. Develop");
556    let arrow3 = Shape::new(ShapeType::RightArrow, 5800000, 2200000, 400000, 400000)
557        .with_fill(ShapeFill::new("A5A5A5"));
558    let step4 = Shape::new(ShapeType::RoundedRectangle, 6300000, 2000000, 1400000, 800000)
559        .with_fill(ShapeFill::new("5B9BD5"))
560        .with_text("4. Deploy");
561    
562    slides.push(
563        SlideContent::new("Development Process Flow")
564            .add_shape(step1)
565            .add_shape(arrow1)
566            .add_shape(step2)
567            .add_shape(arrow2)
568            .add_shape(step3)
569            .add_shape(arrow3)
570            .add_shape(step4)
571            .title_color("1F497D")
572            .title_bold(true)
573    );
574
575    // =========================================================================
576    // SLIDE 14: Organization Chart with Shapes (NEW)
577    // =========================================================================
578    println!("🔷 Slide 14: Organization Chart");
579    
580    // CEO at top
581    let ceo = Shape::new(ShapeType::RoundedRectangle, 3500000, 1400000, 2000000, 600000)
582        .with_fill(ShapeFill::new("1F4E79"))
583        .with_text("CEO");
584    
585    // Vertical line from CEO
586    let line1 = Shape::new(ShapeType::Rectangle, 4450000, 2000000, 100000, 400000)
587        .with_fill(ShapeFill::new("A5A5A5"));
588    
589    // Horizontal connector
590    let hline = Shape::new(ShapeType::Rectangle, 1950000, 2400000, 5100000, 50000)
591        .with_fill(ShapeFill::new("A5A5A5"));
592    
593    // CTO, CFO, COO
594    let cto = Shape::new(ShapeType::RoundedRectangle, 1000000, 2600000, 1800000, 500000)
595        .with_fill(ShapeFill::new("2E75B6"))
596        .with_text("CTO");
597    let cfo = Shape::new(ShapeType::RoundedRectangle, 3600000, 2600000, 1800000, 500000)
598        .with_fill(ShapeFill::new("2E75B6"))
599        .with_text("CFO");
600    let coo = Shape::new(ShapeType::RoundedRectangle, 6200000, 2600000, 1800000, 500000)
601        .with_fill(ShapeFill::new("2E75B6"))
602        .with_text("COO");
603    
604    // Vertical lines to departments
605    let vline1 = Shape::new(ShapeType::Rectangle, 1850000, 2450000, 50000, 150000)
606        .with_fill(ShapeFill::new("A5A5A5"));
607    let vline2 = Shape::new(ShapeType::Rectangle, 4450000, 2450000, 50000, 150000)
608        .with_fill(ShapeFill::new("A5A5A5"));
609    let vline3 = Shape::new(ShapeType::Rectangle, 7050000, 2450000, 50000, 150000)
610        .with_fill(ShapeFill::new("A5A5A5"));
611    
612    // Teams under CTO
613    let eng = Shape::new(ShapeType::Rectangle, 500000, 3300000, 1200000, 400000)
614        .with_fill(ShapeFill::new("BDD7EE"))
615        .with_text("Engineering");
616    let product = Shape::new(ShapeType::Rectangle, 1800000, 3300000, 1200000, 400000)
617        .with_fill(ShapeFill::new("BDD7EE"))
618        .with_text("Product");
619    
620    slides.push(
621        SlideContent::new("Organization Structure")
622            .add_shape(ceo)
623            .add_shape(line1)
624            .add_shape(hline)
625            .add_shape(cto)
626            .add_shape(cfo)
627            .add_shape(coo)
628            .add_shape(vline1)
629            .add_shape(vline2)
630            .add_shape(vline3)
631            .add_shape(eng)
632            .add_shape(product)
633            .title_color("1F4E79")
634            .title_bold(true)
635    );
636
637    // =========================================================================
638    // SLIDE 15: PDCA Cycle Diagram (NEW)
639    // =========================================================================
640    println!("🔷 Slide 15: PDCA Cycle Diagram");
641    
642    // Four quadrants for PDCA
643    let plan = Shape::new(ShapeType::RoundedRectangle, 1500000, 1600000, 2500000, 1500000)
644        .with_fill(ShapeFill::new("4472C4"))
645        .with_text("PLAN\n\nDefine goals\nand strategy");
646    let do_box = Shape::new(ShapeType::RoundedRectangle, 4500000, 1600000, 2500000, 1500000)
647        .with_fill(ShapeFill::new("ED7D31"))
648        .with_text("DO\n\nImplement\nthe plan");
649    let check = Shape::new(ShapeType::RoundedRectangle, 4500000, 3300000, 2500000, 1500000)
650        .with_fill(ShapeFill::new("70AD47"))
651        .with_text("CHECK\n\nMeasure\nresults");
652    let act = Shape::new(ShapeType::RoundedRectangle, 1500000, 3300000, 2500000, 1500000)
653        .with_fill(ShapeFill::new("FFC000"))
654        .with_text("ACT\n\nAdjust and\nimprove");
655    
656    // Arrows between quadrants
657    let arr1 = Shape::new(ShapeType::RightArrow, 4100000, 2100000, 300000, 300000)
658        .with_fill(ShapeFill::new("A5A5A5"));
659    let arr2 = Shape::new(ShapeType::DownArrow, 5600000, 3200000, 300000, 200000)
660        .with_fill(ShapeFill::new("A5A5A5"));
661    let arr3 = Shape::new(ShapeType::LeftArrow, 4100000, 3800000, 300000, 300000)
662        .with_fill(ShapeFill::new("A5A5A5"));
663    let arr4 = Shape::new(ShapeType::UpArrow, 2600000, 3200000, 300000, 200000)
664        .with_fill(ShapeFill::new("A5A5A5"));
665    
666    slides.push(
667        SlideContent::new("PDCA Continuous Improvement Cycle")
668            .add_shape(plan)
669            .add_shape(do_box)
670            .add_shape(check)
671            .add_shape(act)
672            .add_shape(arr1)
673            .add_shape(arr2)
674            .add_shape(arr3)
675            .add_shape(arr4)
676            .title_color("1F497D")
677            .title_bold(true)
678    );
679
680    // =========================================================================
681    // SLIDE 16: Pyramid Diagram (Maslow's Hierarchy) (NEW)
682    // =========================================================================
683    println!("🔷 Slide 16: Pyramid Diagram");
684    
685    // Build pyramid from bottom to top
686    let level5 = Shape::new(ShapeType::Trapezoid, 500000, 4000000, 8000000, 600000)
687        .with_fill(ShapeFill::new("C00000"))
688        .with_text("Physiological Needs - Food, Water, Shelter");
689    let level4 = Shape::new(ShapeType::Trapezoid, 1000000, 3400000, 7000000, 600000)
690        .with_fill(ShapeFill::new("ED7D31"))
691        .with_text("Safety Needs - Security, Stability");
692    let level3 = Shape::new(ShapeType::Trapezoid, 1500000, 2800000, 6000000, 600000)
693        .with_fill(ShapeFill::new("FFC000"))
694        .with_text("Love & Belonging - Relationships");
695    let level2 = Shape::new(ShapeType::Trapezoid, 2000000, 2200000, 5000000, 600000)
696        .with_fill(ShapeFill::new("70AD47"))
697        .with_text("Esteem - Achievement, Respect");
698    let level1 = Shape::new(ShapeType::Triangle, 2500000, 1500000, 4000000, 700000)
699        .with_fill(ShapeFill::new("4472C4"))
700        .with_text("Self-Actualization");
701    
702    slides.push(
703        SlideContent::new("Maslow's Hierarchy of Needs")
704            .add_shape(level5)
705            .add_shape(level4)
706            .add_shape(level3)
707            .add_shape(level2)
708            .add_shape(level1)
709            .title_color("1F497D")
710            .title_bold(true)
711    );
712
713    // =========================================================================
714    // SLIDE 17: Venn Diagram (NEW)
715    // =========================================================================
716    println!("🔷 Slide 17: Venn Diagram");
717    
718    // Three overlapping circles
719    let circle1 = Shape::new(ShapeType::Ellipse, 1500000, 1800000, 3000000, 3000000)
720        .with_fill(ShapeFill::new("4472C4"))
721        .with_text("Skills");
722    let circle2 = Shape::new(ShapeType::Ellipse, 3500000, 1800000, 3000000, 3000000)
723        .with_fill(ShapeFill::new("ED7D31"))
724        .with_text("Passion");
725    let circle3 = Shape::new(ShapeType::Ellipse, 2500000, 3200000, 3000000, 3000000)
726        .with_fill(ShapeFill::new("70AD47"))
727        .with_text("Market Need");
728    
729    // Center label
730    let center = Shape::new(ShapeType::Ellipse, 3200000, 2800000, 1600000, 800000)
731        .with_fill(ShapeFill::new("FFFFFF"))
732        .with_text("IKIGAI");
733    
734    slides.push(
735        SlideContent::new("Finding Your Ikigai - Venn Diagram")
736            .add_shape(circle1)
737            .add_shape(circle2)
738            .add_shape(circle3)
739            .add_shape(center)
740            .title_color("1F497D")
741            .title_bold(true)
742    );
743
744    // =========================================================================
745    // SLIDE 18: Timeline/Roadmap (NEW)
746    // =========================================================================
747    println!("📊 Slide 18: Project Timeline");
748    
749    let timeline_table = TableBuilder::new(vec![1500000, 1500000, 1500000, 1500000, 1500000])
750        .add_row(TableRow::new(vec![
751            TableCell::new("Q1 2024").bold().background_color("4472C4").text_color("FFFFFF"),
752            TableCell::new("Q2 2024").bold().background_color("4472C4").text_color("FFFFFF"),
753            TableCell::new("Q3 2024").bold().background_color("4472C4").text_color("FFFFFF"),
754            TableCell::new("Q4 2024").bold().background_color("4472C4").text_color("FFFFFF"),
755            TableCell::new("Q1 2025").bold().background_color("4472C4").text_color("FFFFFF"),
756        ]))
757        .add_row(TableRow::new(vec![
758            TableCell::new("Research\n& Planning").background_color("BDD7EE").text_color("1F497D"),
759            TableCell::new("Design\nPhase").background_color("BDD7EE").text_color("1F497D"),
760            TableCell::new("Development\nSprint 1-3").background_color("C6EFCE").text_color("006100"),
761            TableCell::new("Testing\n& QA").background_color("FCE4D6").text_color("C65911"),
762            TableCell::new("Launch\n& Support").background_color("E2EFDA").text_color("375623"),
763        ]))
764        .add_row(TableRow::new(vec![
765            TableCell::new("✓ Complete").bold().text_color("2E7D32"),
766            TableCell::new("✓ Complete").bold().text_color("2E7D32"),
767            TableCell::new("In Progress").text_color("ED7D31"),
768            TableCell::new("Planned").text_color("7F7F7F"),
769            TableCell::new("Planned").text_color("7F7F7F"),
770        ]))
771        .position(300000, 2000000)
772        .build();
773    
774    slides.push(
775        SlideContent::new("Project Roadmap 2024-2025")
776            .table(timeline_table)
777            .title_color("1F497D")
778            .title_bold(true)
779    );
780
781    // =========================================================================
782    // SLIDE 19: Dashboard Summary (NEW - using Dimension API)
783    // =========================================================================
784    println!("🔷 Slide 19: Dashboard with KPIs (Dimension API)");
785    
786    // KPI boxes using ratio-based positioning — automatically adapts to any slide size
787    let kpi1 = Shape::from_dimensions(ShapeType::RoundedRectangle,
788        Dimension::percent(3.0), Dimension::percent(23.0),
789        Dimension::percent(22.0), Dimension::percent(18.0),
790    ).with_fill(ShapeFill::new("4472C4")).with_text("Revenue\n\n$2.14M\n+15% YoY");
791
792    let kpi2 = Shape::from_dimensions(ShapeType::RoundedRectangle,
793        Dimension::percent(27.0), Dimension::percent(23.0),
794        Dimension::percent(22.0), Dimension::percent(18.0),
795    ).with_fill(ShapeFill::new("70AD47")).with_text("Customers\n\n12,450\n+22% YoY");
796
797    let kpi3 = Shape::from_dimensions(ShapeType::RoundedRectangle,
798        Dimension::percent(51.0), Dimension::percent(23.0),
799        Dimension::percent(22.0), Dimension::percent(18.0),
800    ).with_fill(ShapeFill::new("ED7D31")).with_text("NPS Score\n\n72\n+8 pts");
801
802    let kpi4 = Shape::from_dimensions(ShapeType::RoundedRectangle,
803        Dimension::percent(75.0), Dimension::percent(23.0),
804        Dimension::percent(22.0), Dimension::percent(18.0),
805    ).with_fill(ShapeFill::new("5B9BD5")).with_text("Retention\n\n94%\n+3% YoY");
806    
807    // Status indicators using mixed units: percent for X, inches for size
808    let status1 = Shape::new(ShapeType::Ellipse, 0, 0, 0, 0)
809        .at(Dimension::percent(14.0), Dimension::percent(42.0))
810        .with_dimensions(Dimension::Inches(0.3), Dimension::Inches(0.3))
811        .with_fill(ShapeFill::new("70AD47"));
812    let status2 = Shape::new(ShapeType::Ellipse, 0, 0, 0, 0)
813        .at(Dimension::percent(38.0), Dimension::percent(42.0))
814        .with_dimensions(Dimension::Inches(0.3), Dimension::Inches(0.3))
815        .with_fill(ShapeFill::new("70AD47"));
816    let status3 = Shape::new(ShapeType::Ellipse, 0, 0, 0, 0)
817        .at(Dimension::percent(62.0), Dimension::percent(42.0))
818        .with_dimensions(Dimension::Inches(0.3), Dimension::Inches(0.3))
819        .with_fill(ShapeFill::new("FFC000"));
820    let status4 = Shape::new(ShapeType::Ellipse, 0, 0, 0, 0)
821        .at(Dimension::percent(86.0), Dimension::percent(42.0))
822        .with_dimensions(Dimension::Inches(0.3), Dimension::Inches(0.3))
823        .with_fill(ShapeFill::new("70AD47"));
824    
825    slides.push(
826        SlideContent::new("Executive Dashboard - Q1 2024")
827            .add_shape(kpi1)
828            .add_shape(kpi2)
829            .add_shape(kpi3)
830            .add_shape(kpi4)
831            .add_shape(status1)
832            .add_shape(status2)
833            .add_shape(status3)
834            .add_shape(status4)
835            .title_color("1F497D")
836            .title_bold(true)
837    );
838
839    // =========================================================================
840    // SLIDE 20: Summary Slide (NEW)
841    // =========================================================================
842    println!("📝 Slide 20: Summary with Speaker Notes");
843    
844    slides.push(
845        SlideContent::new("Summary & Next Steps")
846            .layout(SlideLayout::TitleAndContent)
847            .title_color("1F497D")
848            .title_bold(true)
849            .add_bullet("Completed: Research, Design, Initial Development")
850            .add_bullet("In Progress: Sprint 3 Development")
851            .add_bullet("Next: QA Testing Phase (Q4 2024)")
852            .add_bullet("Launch Target: Q1 2025")
853            .add_bullet("Key Risks: Resource constraints, Timeline pressure")
854            .content_size(24)
855            .notes("Speaker Notes:\n\n1. Emphasize the progress made\n2. Highlight key achievements\n3. Address any concerns about timeline\n4. Open for Q&A")
856    );
857
858    // =========================================================================
859    // SLIDE 21: Bullet Styles (NEW v0.2.1)
860    // =========================================================================
861    println!("🔢 Slide 21: Bullet Styles (NEW)");
862    
863    // Numbered list
864    slides.push(
865        SlideContent::new("Bullet Styles - Numbered List")
866            .layout(SlideLayout::TitleAndContent)
867            .title_color("1F497D")
868            .title_bold(true)
869            .with_bullet_style(BulletStyle::Number)
870            .add_bullet("First numbered item")
871            .add_bullet("Second numbered item")
872            .add_bullet("Third numbered item")
873            .add_bullet("Fourth numbered item")
874            .content_size(28)
875    );
876
877    // =========================================================================
878    // SLIDE 22: Lettered Lists (NEW v0.2.1)
879    // =========================================================================
880    println!("🔤 Slide 22: Lettered Lists (NEW)");
881    
882    slides.push(
883        SlideContent::new("Bullet Styles - Lettered Lists")
884            .layout(SlideLayout::TitleAndContent)
885            .title_color("1F497D")
886            .title_bold(true)
887            .add_lettered("Option A - First choice")
888            .add_lettered("Option B - Second choice")
889            .add_lettered("Option C - Third choice")
890            .add_lettered("Option D - Fourth choice")
891            .content_size(28)
892    );
893
894    // =========================================================================
895    // SLIDE 23: Roman Numerals (NEW v0.2.1)
896    // =========================================================================
897    println!("🏛️ Slide 23: Roman Numerals (NEW)");
898    
899    slides.push(
900        SlideContent::new("Bullet Styles - Roman Numerals")
901            .layout(SlideLayout::TitleAndContent)
902            .title_color("1F497D")
903            .title_bold(true)
904            .with_bullet_style(BulletStyle::RomanUpper)
905            .add_bullet("Chapter I - Introduction")
906            .add_bullet("Chapter II - Background")
907            .add_bullet("Chapter III - Methodology")
908            .add_bullet("Chapter IV - Results")
909            .add_bullet("Chapter V - Conclusion")
910            .content_size(28)
911    );
912
913    // =========================================================================
914    // SLIDE 24: Custom Bullets (NEW v0.2.1)
915    // =========================================================================
916    println!("⭐ Slide 24: Custom Bullets (NEW)");
917    
918    slides.push(
919        SlideContent::new("Bullet Styles - Custom Characters")
920            .layout(SlideLayout::TitleAndContent)
921            .title_color("1F497D")
922            .title_bold(true)
923            .add_styled_bullet("Star bullet point", BulletStyle::Custom('★'))
924            .add_styled_bullet("Arrow bullet point", BulletStyle::Custom('→'))
925            .add_styled_bullet("Check bullet point", BulletStyle::Custom('✓'))
926            .add_styled_bullet("Diamond bullet point", BulletStyle::Custom('◆'))
927            .add_styled_bullet("Heart bullet point", BulletStyle::Custom('♥'))
928            .content_size(28)
929    );
930
931    // =========================================================================
932    // SLIDE 25: Sub-bullets / Hierarchy (NEW v0.2.1)
933    // =========================================================================
934    println!("📊 Slide 25: Sub-bullets Hierarchy (NEW)");
935    
936    slides.push(
937        SlideContent::new("Bullet Styles - Hierarchical Lists")
938            .layout(SlideLayout::TitleAndContent)
939            .title_color("1F497D")
940            .title_bold(true)
941            .add_bullet("Main Topic 1")
942            .add_sub_bullet("Supporting detail A")
943            .add_sub_bullet("Supporting detail B")
944            .add_bullet("Main Topic 2")
945            .add_sub_bullet("Supporting detail C")
946            .add_sub_bullet("Supporting detail D")
947            .add_bullet("Main Topic 3")
948            .content_size(24)
949    );
950
951    // =========================================================================
952    // SLIDE 26: Text Enhancements (NEW v0.2.1)
953    // =========================================================================
954    println!("✏️ Slide 26: Text Enhancements (NEW)");
955    
956    // Use BulletPoint with formatting
957    let strikethrough_bullet = BulletPoint::new("Strikethrough: This text is crossed out").strikethrough();
958    let highlight_bullet = BulletPoint::new("Highlight: Yellow background for emphasis").highlight("FFFF00");
959    let subscript_bullet = BulletPoint::new("Subscript: H₂O - for chemical formulas").subscript();
960    let superscript_bullet = BulletPoint::new("Superscript: x² - for math expressions").superscript();
961    let bold_colored = BulletPoint::new("Combined: Bold + Red color").bold().color("FF0000");
962    
963    let mut text_enhancements_slide = SlideContent::new("Text Enhancements - New Formatting")
964        .layout(SlideLayout::TitleAndContent)
965        .title_color("1F497D")
966        .title_bold(true)
967        .content_size(24);
968    text_enhancements_slide.bullets.push(strikethrough_bullet);
969    text_enhancements_slide.bullets.push(highlight_bullet);
970    text_enhancements_slide.bullets.push(subscript_bullet);
971    text_enhancements_slide.bullets.push(superscript_bullet);
972    text_enhancements_slide.bullets.push(bold_colored);
973    
974    slides.push(text_enhancements_slide);
975
976    // =========================================================================
977    // SLIDE 27: Font Size Presets (NEW v0.2.1)
978    // =========================================================================
979    println!("🔤 Slide 27: Font Size Presets (NEW)");
980    
981    // Demonstrate different font sizes per bullet
982    let large_bullet = BulletPoint::new(&format!("LARGE: {}pt - Extra large text", font_sizes::LARGE)).font_size(font_sizes::LARGE);
983    let heading_bullet = BulletPoint::new(&format!("HEADING: {}pt - Section headers", font_sizes::HEADING)).font_size(font_sizes::HEADING);
984    let body_bullet = BulletPoint::new(&format!("BODY: {}pt - Regular content", font_sizes::BODY)).font_size(font_sizes::BODY);
985    let small_bullet = BulletPoint::new(&format!("SMALL: {}pt - Smaller text", font_sizes::SMALL)).font_size(font_sizes::SMALL);
986    let caption_bullet = BulletPoint::new(&format!("CAPTION: {}pt - Captions and notes", font_sizes::CAPTION)).font_size(font_sizes::CAPTION);
987    
988    let mut font_size_slide = SlideContent::new("Font Size Presets - Each line different size")
989        .layout(SlideLayout::TitleAndContent)
990        .title_color("1F497D")
991        .title_bold(true)
992        .title_size(font_sizes::TITLE);
993    font_size_slide.bullets.push(large_bullet);
994    font_size_slide.bullets.push(heading_bullet);
995    font_size_slide.bullets.push(body_bullet);
996    font_size_slide.bullets.push(small_bullet);
997    font_size_slide.bullets.push(caption_bullet);
998    
999    slides.push(font_size_slide);
1000
1001    // =========================================================================
1002    // SLIDE 28: Theme Colors (NEW v0.2.1)
1003    // =========================================================================
1004    println!("🎨 Slide 28: Theme Colors (NEW)");
1005    
1006    // Create shapes with theme colors
1007    let corporate_shape = Shape::new(ShapeType::Rectangle, 500000, 1600000, 1800000, 800000)
1008        .with_fill(ShapeFill::new(themes::CORPORATE.primary))
1009        .with_text("Corporate");
1010    
1011    let modern_shape = Shape::new(ShapeType::Rectangle, 2500000, 1600000, 1800000, 800000)
1012        .with_fill(ShapeFill::new(themes::MODERN.primary))
1013        .with_text("Modern");
1014    
1015    let vibrant_shape = Shape::new(ShapeType::Rectangle, 4500000, 1600000, 1800000, 800000)
1016        .with_fill(ShapeFill::new(themes::VIBRANT.primary))
1017        .with_text("Vibrant");
1018    
1019    let dark_shape = Shape::new(ShapeType::Rectangle, 6500000, 1600000, 1800000, 800000)
1020        .with_fill(ShapeFill::new(themes::DARK.primary))
1021        .with_text("Dark");
1022    
1023    let nature_shape = Shape::new(ShapeType::Rectangle, 500000, 2700000, 1800000, 800000)
1024        .with_fill(ShapeFill::new(themes::NATURE.primary))
1025        .with_text("Nature");
1026    
1027    let tech_shape = Shape::new(ShapeType::Rectangle, 2500000, 2700000, 1800000, 800000)
1028        .with_fill(ShapeFill::new(themes::TECH.primary))
1029        .with_text("Tech");
1030    
1031    let carbon_shape = Shape::new(ShapeType::Rectangle, 4500000, 2700000, 1800000, 800000)
1032        .with_fill(ShapeFill::new(themes::CARBON.primary))
1033        .with_text("Carbon");
1034    
1035    slides.push(
1036        SlideContent::new("Theme Color Palettes")
1037            .layout(SlideLayout::TitleAndContent)
1038            .title_color("1F497D")
1039            .title_bold(true)
1040            .add_shape(corporate_shape)
1041            .add_shape(modern_shape)
1042            .add_shape(vibrant_shape)
1043            .add_shape(dark_shape)
1044            .add_shape(nature_shape)
1045            .add_shape(tech_shape)
1046            .add_shape(carbon_shape)
1047    );
1048
1049    // =========================================================================
1050    // SLIDE 29: Material & Carbon Design Colors (NEW v0.2.1)
1051    // =========================================================================
1052    println!("🌈 Slide 29: Material & Carbon Colors (NEW)");
1053    
1054    // Material Design colors
1055    let material_red = Shape::new(ShapeType::Rectangle, 500000, 1600000, 1200000, 600000)
1056        .with_fill(ShapeFill::new(colors::MATERIAL_RED))
1057        .with_text("M-Red");
1058    
1059    let material_blue = Shape::new(ShapeType::Rectangle, 1900000, 1600000, 1200000, 600000)
1060        .with_fill(ShapeFill::new(colors::MATERIAL_BLUE))
1061        .with_text("M-Blue");
1062    
1063    let material_green = Shape::new(ShapeType::Rectangle, 3300000, 1600000, 1200000, 600000)
1064        .with_fill(ShapeFill::new(colors::MATERIAL_GREEN))
1065        .with_text("M-Green");
1066    
1067    let material_orange = Shape::new(ShapeType::Rectangle, 4700000, 1600000, 1200000, 600000)
1068        .with_fill(ShapeFill::new(colors::MATERIAL_ORANGE))
1069        .with_text("M-Orange");
1070    
1071    let material_purple = Shape::new(ShapeType::Rectangle, 6100000, 1600000, 1200000, 600000)
1072        .with_fill(ShapeFill::new(colors::MATERIAL_PURPLE))
1073        .with_text("M-Purple");
1074    
1075    // Carbon Design colors
1076    let carbon_blue = Shape::new(ShapeType::Rectangle, 500000, 2500000, 1200000, 600000)
1077        .with_fill(ShapeFill::new(colors::CARBON_BLUE_60))
1078        .with_text("C-Blue");
1079    
1080    let carbon_green = Shape::new(ShapeType::Rectangle, 1900000, 2500000, 1200000, 600000)
1081        .with_fill(ShapeFill::new(colors::CARBON_GREEN_50))
1082        .with_text("C-Green");
1083    
1084    let carbon_red = Shape::new(ShapeType::Rectangle, 3300000, 2500000, 1200000, 600000)
1085        .with_fill(ShapeFill::new(colors::CARBON_RED_60))
1086        .with_text("C-Red");
1087    
1088    let carbon_purple = Shape::new(ShapeType::Rectangle, 4700000, 2500000, 1200000, 600000)
1089        .with_fill(ShapeFill::new(colors::CARBON_PURPLE_60))
1090        .with_text("C-Purple");
1091    
1092    let carbon_gray = Shape::new(ShapeType::Rectangle, 6100000, 2500000, 1200000, 600000)
1093        .with_fill(ShapeFill::new(colors::CARBON_GRAY_100))
1094        .with_text("C-Gray");
1095    
1096    slides.push(
1097        SlideContent::new("Material & Carbon Design Colors")
1098            .layout(SlideLayout::TitleAndContent)
1099            .title_color("1F497D")
1100            .title_bold(true)
1101            .add_shape(material_red)
1102            .add_shape(material_blue)
1103            .add_shape(material_green)
1104            .add_shape(material_orange)
1105            .add_shape(material_purple)
1106            .add_shape(carbon_blue)
1107            .add_shape(carbon_green)
1108            .add_shape(carbon_red)
1109            .add_shape(carbon_purple)
1110            .add_shape(carbon_gray)
1111    );
1112
1113    // =========================================================================
1114    // SLIDE 30: Image from Base64 (NEW v0.2.1)
1115    // =========================================================================
1116    println!("🖼️ Slide 30: Image from Base64 (NEW)");
1117    
1118    // 1x1 red PNG pixel in base64
1119    let _red_pixel_base64 = "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8z8DwHwAFBQIAX8jx0gAAAABJRU5ErkJggg==";
1120    
1121    // Create image from base64 (demonstrating the API)
1122    let _base64_image = ImageBuilder::from_base64(_red_pixel_base64, 914400, 914400, "PNG")
1123        .position(4000000, 2500000)
1124        .build();
1125    
1126    slides.push(
1127        SlideContent::new("Image Loading - New Methods")
1128            .layout(SlideLayout::TitleAndContent)
1129            .title_color("1F497D")
1130            .title_bold(true)
1131            .add_bullet("Image::new(path) - Load from file path")
1132            .add_bullet("Image::from_base64(data) - Load from base64 string")
1133            .add_bullet("Image::from_bytes(data) - Load from raw bytes")
1134            .add_bullet("ImageBuilder for fluent API configuration")
1135            .add_bullet("Built-in base64 decoder (no external deps)")
1136            .content_size(24)
1137    );
1138
1139    // =========================================================================
1140    // SLIDE 31: Feature Summary (NEW v0.2.1)
1141    // =========================================================================
1142    println!("📋 Slide 31: v0.2.1 Feature Summary (NEW)");
1143    
1144    slides.push(
1145        SlideContent::new("New Features in v0.2.1")
1146            .layout(SlideLayout::TitleAndContent)
1147            .title_color("1F497D")
1148            .title_bold(true)
1149            .add_numbered("BulletStyle: Number, Letter, Roman, Custom")
1150            .add_numbered("TextFormat: Strikethrough, Highlight")
1151            .add_numbered("TextFormat: Subscript, Superscript")
1152            .add_numbered("Font size presets in prelude")
1153            .add_numbered("Image::from_base64 and from_bytes")
1154            .add_numbered("Theme color palettes (7 themes)")
1155            .add_numbered("Material & Carbon Design colors")
1156            .content_size(24)
1157    );
1158
1159    // =========================================================================
1160    // SLIDE 32: Slide Show Settings - Comparison Table (REAL: embedded in presProps.xml)
1161    // =========================================================================
1162    println!("🎬 Slide 34: Slide Show Settings (Visual)");
1163
1164    let show_speaker = SlideShowSettings::new().pen_color(PenColor::red());
1165    let show_kiosk = SlideShowSettings::kiosk();
1166    let _show_range = SlideShowSettings::new()
1167        .show_type(ShowType::Browsed)
1168        .slide_range(SlideRange::Range { start: 1, end: 10 })
1169        .without_animation(true);
1170    let _speaker_xml = show_speaker.to_xml();
1171    let _kiosk_xml = show_kiosk.to_xml();
1172
1173    let show_table = TableBuilder::new(vec![2000000, 2000000, 2000000, 2000000])
1174        .add_row(TableRow::new(vec![
1175            TableCell::new("Setting").bold().background_color("1F4E79").text_color("FFFFFF"),
1176            TableCell::new("Speaker").bold().background_color("4472C4").text_color("FFFFFF"),
1177            TableCell::new("Kiosk").bold().background_color("ED7D31").text_color("FFFFFF"),
1178            TableCell::new("Browsed").bold().background_color("70AD47").text_color("FFFFFF"),
1179        ]))
1180        .add_row(TableRow::new(vec![
1181            TableCell::new("Loop").bold().background_color("D6E4F0"),
1182            TableCell::new("No"), TableCell::new("Yes").bold().text_color("2E7D32"),
1183            TableCell::new("No"),
1184        ]))
1185        .add_row(TableRow::new(vec![
1186            TableCell::new("Narration").bold().background_color("D6E4F0"),
1187            TableCell::new("Yes"), TableCell::new("No").text_color("C62828"),
1188            TableCell::new("Yes"),
1189        ]))
1190        .add_row(TableRow::new(vec![
1191            TableCell::new("Animation").bold().background_color("D6E4F0"),
1192            TableCell::new("Yes"), TableCell::new("Yes"),
1193            TableCell::new("No").text_color("C62828"),
1194        ]))
1195        .add_row(TableRow::new(vec![
1196            TableCell::new("Timings").bold().background_color("D6E4F0"),
1197            TableCell::new("Yes"), TableCell::new("Auto"),
1198            TableCell::new("Yes"),
1199        ]))
1200        .add_row(TableRow::new(vec![
1201            TableCell::new("Slide Range").bold().background_color("D6E4F0"),
1202            TableCell::new("All"), TableCell::new("All"),
1203            TableCell::new("1-10"),
1204        ]))
1205        .add_row(TableRow::new(vec![
1206            TableCell::new("Pen Color").bold().background_color("D6E4F0"),
1207            TableCell::new("Red").text_color("FF0000"),
1208            TableCell::new("Red").text_color("FF0000"),
1209            TableCell::new("Red").text_color("FF0000"),
1210        ]))
1211        .position(300000, 1600000)
1212        .build();
1213
1214    // Mode icons
1215    let icon_speaker = Shape::new(ShapeType::RoundedRectangle, 300000, 4200000, 2500000, 600000)
1216        .with_fill(ShapeFill::new("4472C4"))
1217        .with_text("Speaker: Full control");
1218    let icon_kiosk = Shape::new(ShapeType::RoundedRectangle, 3100000, 4200000, 2500000, 600000)
1219        .with_fill(ShapeFill::new("ED7D31"))
1220        .with_text("Kiosk: Auto-loop");
1221    let icon_browsed = Shape::new(ShapeType::RoundedRectangle, 5900000, 4200000, 2500000, 600000)
1222        .with_fill(ShapeFill::new("70AD47"))
1223        .with_text("Browsed: Scrollbar");
1224
1225    slides.push(
1226        SlideContent::new("Slide Show Settings - Mode Comparison")
1227            .table(show_table)
1228            .add_shape(icon_speaker)
1229            .add_shape(icon_kiosk)
1230            .add_shape(icon_browsed)
1231            .title_color("1F497D")
1232            .title_bold(true)
1233    );
1234
1235    // =========================================================================
1236    // SLIDE 35: Print Settings - Visual Handout Grid
1237    // =========================================================================
1238    println!("🖨️  Slide 35: Print Settings & Handouts (Visual)");
1239
1240    let print = PrintSettings::new()
1241        .print_what(PrintWhat::Handouts)
1242        .color_mode(PrintColorMode::Grayscale)
1243        .handout_layout(GenHandoutLayout::SlidesPerPage6)
1244        .frame_slides(true)
1245        .header("Q1 2025 Strategy Review")
1246        .footer("Confidential - Internal Use Only")
1247        .print_date(true)
1248        .print_page_numbers(true);
1249    let _prnpr_xml = print.to_prnpr_xml();
1250    let _handout_xml = print.to_handout_master_xml();
1251
1252    // Visual: 6-slide handout grid (2 cols x 3 rows)
1253    let hdr = Shape::new(ShapeType::Rectangle, 300000, 1500000, 4200000, 300000)
1254        .with_fill(ShapeFill::new("E7E6E6"))
1255        .with_text("Q1 2025 Strategy Review");
1256    // Row 1
1257    let s1 = Shape::new(ShapeType::Rectangle, 400000, 2000000, 1800000, 1100000)
1258        .with_line(ShapeLine::new("999999", 12700))
1259        .with_text("Slide 1");
1260    let s2 = Shape::new(ShapeType::Rectangle, 2500000, 2000000, 1800000, 1100000)
1261        .with_line(ShapeLine::new("999999", 12700))
1262        .with_text("Slide 2");
1263    // Row 2
1264    let s3 = Shape::new(ShapeType::Rectangle, 400000, 3200000, 1800000, 1100000)
1265        .with_line(ShapeLine::new("999999", 12700))
1266        .with_text("Slide 3");
1267    let s4 = Shape::new(ShapeType::Rectangle, 2500000, 3200000, 1800000, 1100000)
1268        .with_line(ShapeLine::new("999999", 12700))
1269        .with_text("Slide 4");
1270    // Row 3
1271    let s5 = Shape::new(ShapeType::Rectangle, 400000, 4400000, 1800000, 1100000)
1272        .with_line(ShapeLine::new("999999", 12700))
1273        .with_text("Slide 5");
1274    let s6 = Shape::new(ShapeType::Rectangle, 2500000, 4400000, 1800000, 1100000)
1275        .with_line(ShapeLine::new("999999", 12700))
1276        .with_text("Slide 6");
1277    let ftr = Shape::new(ShapeType::Rectangle, 300000, 5600000, 4200000, 300000)
1278        .with_fill(ShapeFill::new("E7E6E6"))
1279        .with_text("Confidential - Internal Use Only");
1280
1281    // Settings summary table on the right
1282    let print_table = TableBuilder::new(vec![1800000, 2000000])
1283        .add_row(TableRow::new(vec![
1284            TableCell::new("Print Settings").bold().background_color("1F4E79").text_color("FFFFFF"),
1285            TableCell::new("").background_color("1F4E79"),
1286        ]))
1287        .add_row(TableRow::new(vec![
1288            TableCell::new("Print What").bold().background_color("D6E4F0"),
1289            TableCell::new("Handouts"),
1290        ]))
1291        .add_row(TableRow::new(vec![
1292            TableCell::new("Color Mode").bold().background_color("D6E4F0"),
1293            TableCell::new("Grayscale"),
1294        ]))
1295        .add_row(TableRow::new(vec![
1296            TableCell::new("Layout").bold().background_color("D6E4F0"),
1297            TableCell::new("6 slides/page"),
1298        ]))
1299        .add_row(TableRow::new(vec![
1300            TableCell::new("Frame Slides").bold().background_color("D6E4F0"),
1301            TableCell::new("Yes"),
1302        ]))
1303        .add_row(TableRow::new(vec![
1304            TableCell::new("Date").bold().background_color("D6E4F0"),
1305            TableCell::new("Yes"),
1306        ]))
1307        .add_row(TableRow::new(vec![
1308            TableCell::new("Page Numbers").bold().background_color("D6E4F0"),
1309            TableCell::new("Yes"),
1310        ]))
1311        .position(5000000, 1800000)
1312        .build();
1313
1314    slides.push(
1315        SlideContent::new("Print Handout - 6 Slides Per Page")
1316            .table(print_table)
1317            .add_shape(hdr)
1318            .add_shape(s1).add_shape(s2)
1319            .add_shape(s3).add_shape(s4)
1320            .add_shape(s5).add_shape(s6)
1321            .add_shape(ftr)
1322            .title_color("1F497D")
1323            .title_bold(true)
1324    );
1325
1326    // =========================================================================
1327    // SLIDE 36: Advanced Table Merging - Actual Merged Table
1328    // =========================================================================
1329    println!("📊 Slide 36: Advanced Table Merging (Visual)");
1330
1331    // Use TableMergeMap to compute states, then build a visual table
1332    let mut merge_map = TableMergeMap::new(5, 4);
1333    merge_map.merge_cells(0, 0, 1, 4).unwrap(); // Title row spans all 4 cols
1334    merge_map.merge_cells(1, 0, 2, 1).unwrap(); // "Products" spans 2 rows
1335    merge_map.merge_cells(3, 0, 2, 1).unwrap(); // "Services" spans 2 rows
1336
1337    // Show merge state labels
1338    let state_00 = merge_map.cell_state(0, 0); // Anchor gridSpan=4
1339    let state_01 = merge_map.cell_state(0, 1); // HMerge
1340    let state_10 = merge_map.cell_state(1, 0); // Anchor rowSpan=2
1341    let state_20 = merge_map.cell_state(2, 0); // VMerge
1342    println!("   ├── (0,0): {}", state_00.to_xml_attrs().trim());
1343    println!("   ├── (0,1): {}", state_01.to_xml_attrs().trim());
1344    println!("   ├── (1,0): {}", state_10.to_xml_attrs().trim());
1345    println!("   └── (2,0): {}", state_20.to_xml_attrs().trim());
1346
1347    // Build the table with REAL merge attributes (gridSpan, rowSpan, hMerge, vMerge)
1348    let merge_table = TableBuilder::new(vec![1500000, 2000000, 2000000, 2000000])
1349        .add_row(TableRow::new(vec![
1350            TableCell::new("Q1 2025 Revenue Report").bold().background_color("1F4E79").text_color("FFFFFF").grid_span(4),
1351            TableCell::new("").background_color("1F4E79").h_merge(),
1352            TableCell::new("").background_color("1F4E79").h_merge(),
1353            TableCell::new("").background_color("1F4E79").h_merge(),
1354        ]))
1355        .add_row(TableRow::new(vec![
1356            TableCell::new("Products").bold().background_color("BDD7EE").text_color("1F497D").row_span(2),
1357            TableCell::new("Hardware").background_color("E2EFDA"),
1358            TableCell::new("$450,000").text_color("2E7D32").align_right(),
1359            TableCell::new("+12%").bold().text_color("2E7D32").align_right(),
1360        ]))
1361        .add_row(TableRow::new(vec![
1362            TableCell::new("").background_color("BDD7EE").v_merge(),
1363            TableCell::new("Software").background_color("E2EFDA"),
1364            TableCell::new("$680,000").text_color("2E7D32").align_right(),
1365            TableCell::new("+25%").bold().text_color("2E7D32").align_right(),
1366        ]))
1367        .add_row(TableRow::new(vec![
1368            TableCell::new("Services").bold().background_color("FCE4D6").text_color("C65911").row_span(2),
1369            TableCell::new("Consulting").background_color("FFF2CC"),
1370            TableCell::new("$320,000").text_color("2E7D32").align_right(),
1371            TableCell::new("+8%").bold().text_color("2E7D32").align_right(),
1372        ]))
1373        .add_row(TableRow::new(vec![
1374            TableCell::new("").background_color("FCE4D6").v_merge(),
1375            TableCell::new("Support").background_color("FFF2CC"),
1376            TableCell::new("$190,000").text_color("2E7D32").align_right(),
1377            TableCell::new("+5%").bold().text_color("2E7D32").align_right(),
1378        ]))
1379        .position(300000, 1600000)
1380        .build();
1381
1382    // Legend shapes
1383    let legend_anchor = Shape::new(ShapeType::RoundedRectangle, 300000, 4400000, 2000000, 400000)
1384        .with_fill(ShapeFill::new("4472C4"))
1385        .with_text("Anchor (gridSpan/rowSpan)");
1386    let legend_hmerge = Shape::new(ShapeType::RoundedRectangle, 2500000, 4400000, 2000000, 400000)
1387        .with_fill(ShapeFill::new("ED7D31"))
1388        .with_text("hMerge (col covered)");
1389    let legend_vmerge = Shape::new(ShapeType::RoundedRectangle, 4700000, 4400000, 2000000, 400000)
1390        .with_fill(ShapeFill::new("70AD47"))
1391        .with_text("vMerge (row covered)");
1392    let legend_normal = Shape::new(ShapeType::RoundedRectangle, 6900000, 4400000, 2000000, 400000)
1393        .with_fill(ShapeFill::new("A5A5A5"))
1394        .with_text("Normal (no merge)");
1395
1396    slides.push(
1397        SlideContent::new("Advanced Table Merging - Merged Cells")
1398            .table(merge_table)
1399            .add_shape(legend_anchor)
1400            .add_shape(legend_hmerge)
1401            .add_shape(legend_vmerge)
1402            .add_shape(legend_normal)
1403            .title_color("1F497D")
1404            .title_bold(true)
1405    );
1406
1407    // =========================================================================
1408    // Build PresentationSettings with all advanced features
1409    // =========================================================================
1410    println!("\n⚙️  Building Presentation Settings...");
1411
1412    // Slide show settings (embedded in presProps.xml as <p:showPr>)
1413    let show_settings = SlideShowSettings::new()
1414        .show_type(ShowType::Speaker)
1415        .pen_color(PenColor::red())
1416        .use_timings(true);
1417    println!("   ├── Slide Show: Speaker mode, red pen, timings enabled");
1418    println!("   │   └── XML: {} bytes", show_settings.to_xml().len());
1419
1420    // Print settings (embedded in presProps.xml as <p:prnPr>)
1421    let print_settings = PrintSettings::new()
1422        .print_what(PrintWhat::Handouts)
1423        .color_mode(PrintColorMode::Grayscale)
1424        .handout_layout(GenHandoutLayout::SlidesPerPage6)
1425        .frame_slides(true)
1426        .header("Q1 2025 Strategy Review")
1427        .footer("Confidential - Internal Use Only")
1428        .print_date(true)
1429        .print_page_numbers(true);
1430    println!("   └── Print: Handouts, 6/page, grayscale, framed");
1431    println!("       └── XML: {} bytes", print_settings.to_prnpr_xml().len());
1432
1433    let pres_settings = PresentationSettings::new()
1434        .slide_show(show_settings)
1435        .print(print_settings);
1436    println!("   All settings configured → presProps.xml");
1437
1438    // =========================================================================
1439    // Generate PPTX with real integrated features
1440    // =========================================================================
1441    println!("\n📦 Generating PPTX with integrated features...");
1442    let pptx_data = create_pptx_with_settings(
1443        "PPTX-RS Element Showcase",
1444        slides.clone(),
1445        Some(pres_settings),
1446    )?;
1447    fs::write("comprehensive_demo.pptx", &pptx_data)?;
1448    println!("   ✓ Created comprehensive_demo.pptx ({} slides, {} bytes)", 
1449             slides.len(), pptx_data.len());
1450
1451    // =========================================================================
1452    // Package Analysis - Demonstrate Reading
1453    // =========================================================================
1454    println!("\n📖 Package Analysis (Read Capability):");
1455    
1456    let package = Package::open("comprehensive_demo.pptx")?;
1457    let paths = package.part_paths();
1458    
1459    let slide_count = paths.iter()
1460        .filter(|p| p.starts_with("ppt/slides/slide") && p.ends_with(".xml"))
1461        .count();
1462    
1463    println!("   ├── Total parts: {}", package.part_count());
1464    println!("   ├── Slides: {}", slide_count);
1465    println!("   └── Package opened and analyzed successfully");
1466
1467    // =========================================================================
1468    // NEW: Parts API Demonstration
1469    // =========================================================================
1470    println!("\n🧩 Parts API Demonstration:");
1471    
1472    // SlideLayoutPart - 11 layout types
1473    println!("   ┌── SlideLayoutPart (11 layout types):");
1474    let layouts = [
1475        LayoutType::Title,
1476        LayoutType::TitleAndContent,
1477        LayoutType::SectionHeader,
1478        LayoutType::TwoContent,
1479        LayoutType::Comparison,
1480        LayoutType::TitleOnly,
1481        LayoutType::Blank,
1482        LayoutType::ContentWithCaption,
1483        LayoutType::PictureWithCaption,
1484        LayoutType::TitleAndVerticalText,
1485        LayoutType::VerticalTitleAndText,
1486    ];
1487    for (i, layout_type) in layouts.iter().enumerate() {
1488        let layout = SlideLayoutPart::new(i + 1, *layout_type);
1489        if i < 3 {
1490            println!("   │   ├── {}: {} ({})", i + 1, layout_type.name(), layout.path());
1491        }
1492    }
1493    println!("   │   └── ... and {} more layout types", layouts.len() - 3);
1494    
1495    // SlideMasterPart
1496    println!("   ├── SlideMasterPart:");
1497    let mut master = SlideMasterPart::new(1);
1498    master.set_name("Custom Master");
1499    master.add_layout_rel_id("rId2");
1500    master.add_layout_rel_id("rId3");
1501    println!("   │   ├── Name: {}", master.name());
1502    println!("   │   ├── Path: {}", master.path());
1503    println!("   │   └── Layouts: {} linked", master.layout_rel_ids().len());
1504    
1505    // ThemePart - Colors and Fonts
1506    println!("   ├── ThemePart (colors & fonts):");
1507    let mut theme = ThemePart::new(1);
1508    theme.set_name("Corporate Theme");
1509    theme.set_major_font("Arial");
1510    theme.set_minor_font("Calibri");
1511    theme.set_color("accent1", "FF5733");
1512    theme.set_color("accent2", "33FF57");
1513    let theme_xml = theme.to_xml()?;
1514    println!("   │   ├── Name: {}", theme.name());
1515    println!("   │   ├── Major Font: Arial");
1516    println!("   │   ├── Minor Font: Calibri");
1517    println!("   │   └── XML size: {} bytes", theme_xml.len());
1518    
1519    // NotesSlidePart - Speaker notes
1520    println!("   ├── NotesSlidePart (speaker notes):");
1521    let notes = NotesSlidePart::with_text(1, "Remember to:\n- Introduce yourself\n- Explain the agenda\n- Ask for questions");
1522    let notes_xml = notes.to_xml()?;
1523    println!("   │   ├── Path: {}", notes.path());
1524    println!("   │   ├── Text: \"{}...\"", &notes.notes_text()[..20.min(notes.notes_text().len())]);
1525    println!("   │   └── XML size: {} bytes", notes_xml.len());
1526    
1527    // AppPropertiesPart - Application metadata
1528    println!("   ├── AppPropertiesPart (metadata):");
1529    let mut app_props = AppPropertiesPart::new();
1530    app_props.set_company("Acme Corporation");
1531    app_props.set_slides(slides.len() as u32);
1532    let app_xml = app_props.to_xml()?;
1533    println!("   │   ├── Company: Acme Corporation");
1534    println!("   │   ├── Slides: {}", slides.len());
1535    println!("   │   └── XML size: {} bytes", app_xml.len());
1536    
1537    // MediaPart - Video/Audio formats
1538    println!("   ├── MediaPart (10 media formats):");
1539    println!("   │   ├── Video: mp4, webm, avi, wmv, mov");
1540    println!("   │   ├── Audio: mp3, wav, wma, m4a, ogg");
1541    let sample_media = MediaPart::new(1, MediaFormat::Mp4, vec![0; 100]);
1542    println!("   │   └── Sample: {} ({})", sample_media.path(), sample_media.format().mime_type());
1543    
1544    // TablePart - Table with formatting
1545    println!("   ├── TablePart (cell formatting):");
1546    let table_part = TablePart::new()
1547        .add_row(TableRowPart::new(vec![
1548            TableCellPart::new("Header 1").bold().background("4472C4"),
1549            TableCellPart::new("Header 2").bold().background("4472C4"),
1550        ]))
1551        .add_row(TableRowPart::new(vec![
1552            TableCellPart::new("Data 1").color("333333"),
1553            TableCellPart::new("Data 2").italic(),
1554        ]))
1555        .position(EMU_PER_INCH, EMU_PER_INCH * 2)
1556        .size(EMU_PER_INCH * 6, EMU_PER_INCH * 2);
1557    let table_xml = table_part.to_slide_xml(10);
1558    println!("   │   ├── Rows: {}", table_part.rows.len());
1559    println!("   │   ├── Features: bold, italic, colors, backgrounds");
1560    println!("   │   └── XML size: {} bytes", table_xml.len());
1561    
1562    // ContentTypesPart
1563    println!("   └── ContentTypesPart:");
1564    let mut content_types = ContentTypesPart::new();
1565    content_types.add_presentation();
1566    content_types.add_slide(1);
1567    content_types.add_slide_layout(1);
1568    content_types.add_slide_master(1);
1569    content_types.add_theme(1);
1570    content_types.add_core_properties();
1571    content_types.add_app_properties();
1572    let ct_xml = content_types.to_xml()?;
1573    println!("       ├── Path: {}", content_types.path());
1574    println!("       └── XML size: {} bytes", ct_xml.len());
1575
1576    // =========================================================================
1577    // NEW: Elements API Demonstration
1578    // =========================================================================
1579    println!("\n🎨 Elements API Demonstration:");
1580    
1581    // Color types
1582    println!("   ┌── Color Types:");
1583    let rgb = RgbColor::new(255, 87, 51);
1584    let rgb_hex = RgbColor::from_hex("#4472C4").unwrap();
1585    let scheme = SchemeColor::Accent1;
1586    let color = Color::rgb(100, 149, 237);
1587    println!("   │   ├── RgbColor::new(255, 87, 51) → {}", rgb.to_hex());
1588    println!("   │   ├── RgbColor::from_hex(\"#4472C4\") → {}", rgb_hex.to_hex());
1589    println!("   │   ├── SchemeColor::Accent1 → {}", scheme.as_str());
1590    println!("   │   └── Color::rgb(100, 149, 237) → XML: {}", color.to_xml().chars().take(30).collect::<String>());
1591    
1592    // Position and Size
1593    println!("   ├── Position & Size (EMU units):");
1594    let pos = Position::from_inches(1.0, 2.0);
1595    let size = Size::from_inches(4.0, 3.0);
1596    println!("   │   ├── Position::from_inches(1.0, 2.0) → x={}, y={}", pos.x, pos.y);
1597    println!("   │   ├── Size::from_inches(4.0, 3.0) → w={}, h={}", size.width, size.height);
1598    println!("   │   └── EMU_PER_INCH = {}", EMU_PER_INCH);
1599    
1600    // Transform
1601    println!("   └── Transform (position + size + rotation):");
1602    let transform = Transform::from_inches(1.0, 1.5, 3.0, 2.0).with_rotation(45.0);
1603    let transform_xml = transform.to_xml();
1604    println!("       ├── Transform::from_inches(1.0, 1.5, 3.0, 2.0)");
1605    println!("       ├── .with_rotation(45.0)");
1606    println!("       └── XML: {}...", &transform_xml[..50.min(transform_xml.len())]);
1607
1608    // =========================================================================
1609    // NEW: Advanced Features Demonstration
1610    // =========================================================================
1611    println!("\n🚀 Advanced Features Demonstration:");
1612
1613    // -------------------------------------------------------------------------
1614    // Complex Table Examples
1615    // -------------------------------------------------------------------------
1616    println!("   ┌── Complex Table Examples:");
1617    
1618    // Example 1: Financial Report Table
1619    println!("   │   ┌── Financial Report Table (5x4 with formatting):");
1620    let financial_table = TablePart::new()
1621        .add_row(TableRowPart::new(vec![
1622            TableCellPart::new("Q1 2024 Financial Summary")
1623                .col_span(4)
1624                .bold()
1625                .center()
1626                .background("1F4E79")
1627                .color("FFFFFF")
1628                .font_size(14)
1629                .font("Arial Black"),
1630        ]))
1631        .add_row(TableRowPart::new(vec![
1632            TableCellPart::new("Category").bold().center().background("2E75B6").color("FFFFFF"),
1633            TableCellPart::new("Revenue").bold().center().background("2E75B6").color("FFFFFF"),
1634            TableCellPart::new("Expenses").bold().center().background("2E75B6").color("FFFFFF"),
1635            TableCellPart::new("Profit").bold().center().background("2E75B6").color("FFFFFF"),
1636        ]))
1637        .add_row(TableRowPart::new(vec![
1638            TableCellPart::new("Product Sales").align(HorizontalAlign::Left),
1639            TableCellPart::new("$1,250,000").align(HorizontalAlign::Right).color("2E7D32"),
1640            TableCellPart::new("$450,000").align(HorizontalAlign::Right).color("C62828"),
1641            TableCellPart::new("$800,000").align(HorizontalAlign::Right).bold().color("2E7D32"),
1642        ]))
1643        .add_row(TableRowPart::new(vec![
1644            TableCellPart::new("Services").align(HorizontalAlign::Left),
1645            TableCellPart::new("$890,000").align(HorizontalAlign::Right).color("2E7D32"),
1646            TableCellPart::new("$320,000").align(HorizontalAlign::Right).color("C62828"),
1647            TableCellPart::new("$570,000").align(HorizontalAlign::Right).bold().color("2E7D32"),
1648        ]))
1649        .add_row(TableRowPart::new(vec![
1650            TableCellPart::new("Total").bold().background("E7E6E6"),
1651            TableCellPart::new("$2,140,000").bold().align(HorizontalAlign::Right).background("E7E6E6"),
1652            TableCellPart::new("$770,000").bold().align(HorizontalAlign::Right).background("E7E6E6"),
1653            TableCellPart::new("$1,370,000").bold().align(HorizontalAlign::Right).background("C6EFCE").color("006100"),
1654        ]))
1655        .position(EMU_PER_INCH / 2, EMU_PER_INCH * 2)
1656        .size(EMU_PER_INCH * 8, EMU_PER_INCH * 3);
1657    let fin_xml = financial_table.to_slide_xml(100);
1658    println!("   │   │   ├── Merged header spanning 4 columns");
1659    println!("   │   │   ├── Color-coded values (green=positive, red=negative)");
1660    println!("   │   │   ├── Custom fonts and sizes");
1661    println!("   │   │   └── XML: {} bytes", fin_xml.len());
1662
1663    // Example 2: Comparison Matrix
1664    println!("   │   ├── Comparison Matrix (features vs products):");
1665    let _matrix_table = TablePart::new()
1666        .add_row(TableRowPart::new(vec![
1667            TableCellPart::new("Feature").bold().center().background("4472C4").color("FFFFFF"),
1668            TableCellPart::new("Basic").bold().center().background("4472C4").color("FFFFFF"),
1669            TableCellPart::new("Pro").bold().center().background("4472C4").color("FFFFFF"),
1670            TableCellPart::new("Enterprise").bold().center().background("4472C4").color("FFFFFF"),
1671        ]))
1672        .add_row(TableRowPart::new(vec![
1673            TableCellPart::new("Storage").align(HorizontalAlign::Left),
1674            TableCellPart::new("5 GB").center(),
1675            TableCellPart::new("50 GB").center(),
1676            TableCellPart::new("Unlimited").center().bold().color("2E7D32"),
1677        ]))
1678        .add_row(TableRowPart::new(vec![
1679            TableCellPart::new("Users").align(HorizontalAlign::Left),
1680            TableCellPart::new("1").center(),
1681            TableCellPart::new("10").center(),
1682            TableCellPart::new("Unlimited").center().bold().color("2E7D32"),
1683        ]))
1684        .add_row(TableRowPart::new(vec![
1685            TableCellPart::new("Support").align(HorizontalAlign::Left),
1686            TableCellPart::new("Email").center(),
1687            TableCellPart::new("24/7 Chat").center(),
1688            TableCellPart::new("Dedicated").center().bold().color("2E7D32"),
1689        ]))
1690        .add_row(TableRowPart::new(vec![
1691            TableCellPart::new("Price/mo").bold().background("F2F2F2"),
1692            TableCellPart::new("$9").center().bold().background("F2F2F2"),
1693            TableCellPart::new("$29").center().bold().background("F2F2F2"),
1694            TableCellPart::new("$99").center().bold().background("F2F2F2"),
1695        ]));
1696    println!("   │   │   └── 5x4 matrix with alternating styles");
1697
1698    // Example 3: Schedule/Timeline Table
1699    println!("   │   └── Schedule Table (with row spans):");
1700    let _schedule_table = TablePart::new()
1701        .add_row(TableRowPart::new(vec![
1702            TableCellPart::new("Time").bold().center().background("70AD47").color("FFFFFF"),
1703            TableCellPart::new("Monday").bold().center().background("70AD47").color("FFFFFF"),
1704            TableCellPart::new("Tuesday").bold().center().background("70AD47").color("FFFFFF"),
1705        ]))
1706        .add_row(TableRowPart::new(vec![
1707            TableCellPart::new("9:00 AM").center().background("E2EFDA"),
1708            TableCellPart::new("Team Standup").center().row_span(2).valign(VerticalAlign::Middle).background("BDD7EE"),
1709            TableCellPart::new("Code Review").center(),
1710        ]))
1711        .add_row(TableRowPart::new(vec![
1712            TableCellPart::new("10:00 AM").center().background("E2EFDA"),
1713            TableCellPart::merged(),
1714            TableCellPart::new("Sprint Planning").center().background("FCE4D6"),
1715        ]));
1716    println!("   │       └── Row spans for multi-hour events");
1717
1718    // -------------------------------------------------------------------------
1719    // Complex Animation Sequences
1720    // -------------------------------------------------------------------------
1721    println!("   ├── Complex Animation Sequences:");
1722    
1723    // Sequence 1: Title entrance with staggered content
1724    println!("   │   ┌── Staggered Entrance Sequence:");
1725    let title_anim = Animation::new(2, AnimationEffect::Fade)
1726        .trigger(AnimationTrigger::OnClick)
1727        .duration(500);
1728    let content1 = Animation::new(3, AnimationEffect::FlyIn)
1729        .trigger(AnimationTrigger::AfterPrevious)
1730        .direction(AnimationDirection::Left)
1731        .duration(400)
1732        .delay(200);
1733    let content2 = Animation::new(4, AnimationEffect::FlyIn)
1734        .trigger(AnimationTrigger::AfterPrevious)
1735        .direction(AnimationDirection::Left)
1736        .duration(400)
1737        .delay(100);
1738    let content3 = Animation::new(5, AnimationEffect::FlyIn)
1739        .trigger(AnimationTrigger::AfterPrevious)
1740        .direction(AnimationDirection::Left)
1741        .duration(400)
1742        .delay(100);
1743    let staggered = SlideAnimations::new()
1744        .add(title_anim)
1745        .add(content1)
1746        .add(content2)
1747        .add(content3)
1748        .transition(SlideTransition::new(TransitionEffect::Push).direction(AnimationDirection::Left).duration(750));
1749    let staggered_xml = staggered.to_timing_xml()?;
1750    println!("   │   │   ├── Title: Fade on click");
1751    println!("   │   │   ├── Content 1-3: FlyIn with 100ms stagger");
1752    println!("   │   │   ├── Transition: Push from left (750ms)");
1753    println!("   │   │   └── XML: {} bytes", staggered_xml.len());
1754
1755    // Sequence 2: Emphasis and exit
1756    println!("   │   ├── Emphasis + Exit Sequence:");
1757    let emphasis = Animation::new(6, AnimationEffect::Pulse)
1758        .trigger(AnimationTrigger::OnClick)
1759        .duration(1000)
1760        .repeat(3);
1761    let exit = Animation::new(6, AnimationEffect::FadeOut)
1762        .trigger(AnimationTrigger::AfterPrevious)
1763        .duration(500);
1764    let _emphasis_seq = SlideAnimations::new()
1765        .add(emphasis)
1766        .add(exit);
1767    println!("   │   │   ├── Pulse 3x on click, then fade out");
1768    println!("   │   │   └── Same shape, sequential effects");
1769
1770    // Sequence 3: Motion path
1771    println!("   │   └── Motion Path Animation:");
1772    let _motion = Animation::new(7, AnimationEffect::Lines)
1773        .trigger(AnimationTrigger::OnClick)
1774        .duration(2000);
1775    println!("   │       └── Custom path: Lines, Arcs, Turns, Loops");
1776
1777    // -------------------------------------------------------------------------
1778    // SmartArt Combinations
1779    // -------------------------------------------------------------------------
1780    println!("   ├── SmartArt Layout Examples:");
1781    
1782    // Process flow
1783    println!("   │   ┌── Process Flow (5 steps):");
1784    let process = SmartArtPart::new(1, SmartArtLayout::BasicProcess)
1785        .add_items(vec!["Research", "Design", "Develop", "Test", "Deploy"])
1786        .position(EMU_PER_INCH / 2, EMU_PER_INCH * 2)
1787        .size(EMU_PER_INCH * 8, EMU_PER_INCH * 2);
1788    println!("   │   │   └── {} nodes in horizontal flow", process.nodes().len());
1789
1790    // Organization chart
1791    println!("   │   ├── Organization Chart:");
1792    let org = SmartArtPart::new(2, SmartArtLayout::OrgChart)
1793        .add_items(vec!["CEO", "CTO", "CFO", "VP Engineering", "VP Sales"]);
1794    println!("   │   │   └── Hierarchical structure with {} positions", org.nodes().len());
1795
1796    // Cycle diagram
1797    println!("   │   ├── Cycle Diagram:");
1798    let cycle = SmartArtPart::new(3, SmartArtLayout::BasicCycle)
1799        .add_items(vec!["Plan", "Do", "Check", "Act"]);
1800    println!("   │   │   └── PDCA cycle with {} phases", cycle.nodes().len());
1801
1802    // Venn diagram
1803    println!("   │   ├── Venn Diagram:");
1804    let _venn = SmartArtPart::new(4, SmartArtLayout::BasicVenn)
1805        .add_items(vec!["Skills", "Passion", "Market Need"]);
1806    println!("   │   │   └── 3-circle Venn for Ikigai concept");
1807
1808    // Pyramid
1809    println!("   │   └── Pyramid:");
1810    let pyramid = SmartArtPart::new(5, SmartArtLayout::BasicPyramid)
1811        .add_items(vec!["Self-Actualization", "Esteem", "Love/Belonging", "Safety", "Physiological"]);
1812    println!("   │       └── Maslow's hierarchy with {} levels", pyramid.nodes().len());
1813
1814    // -------------------------------------------------------------------------
1815    // 3D Model Configurations
1816    // -------------------------------------------------------------------------
1817    println!("   ├── 3D Model Configurations:");
1818    
1819    // Product showcase
1820    println!("   │   ┌── Product Showcase:");
1821    let _product_3d = Model3DPart::new(1, Model3DFormat::Glb, vec![0; 100])
1822        .camera(CameraPreset::IsometricTopUp)
1823        .rotation(0.0, 45.0, 0.0)
1824        .zoom(1.2)
1825        .position(EMU_PER_INCH * 2, EMU_PER_INCH * 2)
1826        .size(EMU_PER_INCH * 4, EMU_PER_INCH * 4);
1827    println!("   │   │   ├── Camera: Isometric top-up view");
1828    println!("   │   │   ├── Rotation: 45° Y-axis for best angle");
1829    println!("   │   │   └── Zoom: 1.2x for detail");
1830
1831    // Architectural model
1832    println!("   │   ├── Architectural Model:");
1833    let _arch_3d = Model3DPart::new(2, Model3DFormat::Gltf, vec![0; 100])
1834        .camera(CameraPreset::Front)
1835        .rotation(15.0, -30.0, 0.0)
1836        .ambient_light("FFFFCC");
1837    println!("   │   │   ├── Camera: Front view with tilt");
1838    println!("   │   │   └── Ambient: Warm lighting (FFFFCC)");
1839
1840    // Technical diagram
1841    println!("   │   └── Technical Diagram:");
1842    let _tech_3d = Model3DPart::new(3, Model3DFormat::Obj, vec![0; 100])
1843        .camera(CameraPreset::IsometricOffAxis1Top)
1844        .rotation(0.0, 0.0, 0.0);
1845    println!("   │       └── Camera: Off-axis isometric for exploded view");
1846
1847    // -------------------------------------------------------------------------
1848    // Theme + Master + Layout Combination
1849    // -------------------------------------------------------------------------
1850    println!("   ├── Theme + Master + Layout Integration:");
1851    
1852    // Corporate theme
1853    let mut corp_theme = ThemePart::new(1);
1854    corp_theme.set_name("Corporate Blue");
1855    corp_theme.set_major_font("Segoe UI");
1856    corp_theme.set_minor_font("Segoe UI Light");
1857    corp_theme.set_color("dk1", "000000");
1858    corp_theme.set_color("lt1", "FFFFFF");
1859    corp_theme.set_color("dk2", "1F497D");
1860    corp_theme.set_color("lt2", "EEECE1");
1861    corp_theme.set_color("accent1", "4472C4");
1862    corp_theme.set_color("accent2", "ED7D31");
1863    corp_theme.set_color("accent3", "A5A5A5");
1864    corp_theme.set_color("accent4", "FFC000");
1865    corp_theme.set_color("accent5", "5B9BD5");
1866    corp_theme.set_color("accent6", "70AD47");
1867    let theme_xml = corp_theme.to_xml()?;
1868    println!("   │   ├── Theme: Corporate Blue");
1869    println!("   │   │   ├── Fonts: Segoe UI / Segoe UI Light");
1870    println!("   │   │   ├── 12 color slots defined");
1871    println!("   │   │   └── XML: {} bytes", theme_xml.len());
1872
1873    // Master with multiple layouts
1874    let mut corp_master = SlideMasterPart::new(1);
1875    corp_master.set_name("Corporate Master");
1876    corp_master.add_layout_rel_id("rId2"); // Title
1877    corp_master.add_layout_rel_id("rId3"); // Title + Content
1878    corp_master.add_layout_rel_id("rId4"); // Section Header
1879    corp_master.add_layout_rel_id("rId5"); // Two Content
1880    corp_master.add_layout_rel_id("rId6"); // Comparison
1881    corp_master.add_layout_rel_id("rId7"); // Title Only
1882    corp_master.add_layout_rel_id("rId8"); // Blank
1883    println!("   │   └── Master: {} with {} layouts linked", corp_master.name(), corp_master.layout_rel_ids().len());
1884
1885    // -------------------------------------------------------------------------
1886    // VBA + Custom XML Integration
1887    // -------------------------------------------------------------------------
1888    println!("   ├── VBA + Custom XML Integration:");
1889    
1890    // VBA with multiple modules
1891    let _vba_project = VbaProjectPart::new()
1892        .add_module(VbaModule::new("AutoRun", r#"
1893Sub Auto_Open()
1894    MsgBox "Welcome to the presentation!"
1895End Sub
1896
1897Sub NavigateToSlide(slideNum As Integer)
1898    SlideShowWindows(1).View.GotoSlide slideNum
1899End Sub
1900"#))
1901        .add_module(VbaModule::new("DataHelpers", r#"
1902Function GetCustomData(key As String) As String
1903    ' Read from Custom XML part
1904    GetCustomData = ActivePresentation.CustomXMLParts(1).SelectSingleNode("//" & key).Text
1905End Function
1906"#))
1907        .add_module(VbaModule::class("SlideController", r#"
1908Private currentSlide As Integer
1909
1910Public Sub NextSlide()
1911    currentSlide = currentSlide + 1
1912    NavigateToSlide currentSlide
1913End Sub
1914"#));
1915    println!("   │   ├── VBA Project:");
1916    println!("   │   │   ├── AutoRun: Auto_Open, NavigateToSlide");
1917    println!("   │   │   ├── DataHelpers: GetCustomData (reads Custom XML)");
1918    println!("   │   │   └── SlideController: Class for navigation");
1919
1920    // Custom XML with structured data
1921    let app_config = CustomXmlPart::new(1, "presentationConfig")
1922        .namespace("http://company.com/pptx/config")
1923        .property("version", "2.1.0")
1924        .property("author", "Demo User")
1925        .property("department", "Engineering")
1926        .property("confidentiality", "Internal")
1927        .property("lastModified", "2024-01-15T10:30:00Z");
1928    let config_xml = app_config.to_xml()?;
1929    println!("   │   └── Custom XML:");
1930    println!("   │       ├── Namespace: http://company.com/pptx/config");
1931    println!("   │       ├── Properties: version, author, department, etc.");
1932    println!("   │       └── XML: {} bytes", config_xml.len());
1933
1934    // -------------------------------------------------------------------------
1935    // Embedded Fonts with Variants
1936    // -------------------------------------------------------------------------
1937    println!("   ├── Embedded Font Collection:");
1938    let mut font_collection = EmbeddedFontCollection::new();
1939    font_collection.add("Corporate Sans", vec![0; 1000]);
1940    font_collection.add_with_type("Corporate Sans", vec![0; 1000], FontEmbedType::Bold);
1941    font_collection.add_with_type("Corporate Sans", vec![0; 1000], FontEmbedType::Italic);
1942    font_collection.add_with_type("Corporate Sans", vec![0; 1000], FontEmbedType::BoldItalic);
1943    font_collection.add("Code Mono", vec![0; 800]);
1944    let fonts_xml = font_collection.to_xml();
1945    println!("   │   ├── Corporate Sans: Regular, Bold, Italic, BoldItalic");
1946    println!("   │   ├── Code Mono: Regular");
1947    println!("   │   ├── Total: {} font files", font_collection.len());
1948    println!("   │   └── XML: {} bytes", fonts_xml.len());
1949
1950    // -------------------------------------------------------------------------
1951    // Handout with Full Configuration
1952    // -------------------------------------------------------------------------
1953    println!("   └── Handout Master Configuration:");
1954    let handout = HandoutMasterPart::new()
1955        .layout(HandoutLayout::SlidesPerPage6)
1956        .header("Q1 2024 Strategy Review")
1957        .footer("Confidential - Internal Use Only");
1958    let handout_xml = handout.to_xml()?;
1959    println!("       ├── Layout: 6 slides per page");
1960    println!("       ├── Header: Q1 2024 Strategy Review");
1961    println!("       ├── Footer: Confidential - Internal Use Only");
1962    println!("       └── XML: {} bytes", handout_xml.len());
1963
1964    // =========================================================================
1965    // Summary
1966    // =========================================================================
1967    println!("\n╔══════════════════════════════════════════════════════════════╗");
1968    println!("║                    Element Coverage Summary                   ║");
1969    println!("╠══════════════════════════════════════════════════════════════╣");
1970    println!("║  LAYOUTS (6 types):                                          ║");
1971    println!("║    ✓ CenteredTitle    ✓ TitleOnly      ✓ TitleAndContent     ║");
1972    println!("║    ✓ TitleAndBigContent  ✓ TwoColumn   ✓ Blank               ║");
1973    println!("╠══════════════════════════════════════════════════════════════╣");
1974    println!("║  TEXT FORMATTING:                                            ║");
1975    println!("║    ✓ Bold            ✓ Italic         ✓ Underline            ║");
1976    println!("║    ✓ Font Size       ✓ Font Color     ✓ Title/Content styles ║");
1977    println!("╠══════════════════════════════════════════════════════════════╣");
1978    println!("║  TABLES:                                                     ║");
1979    println!("║    ✓ Multiple rows/columns  ✓ Bold cells  ✓ Background colors║");
1980    println!("║    ✓ Header styling         ✓ Position control               ║");
1981    println!("╠══════════════════════════════════════════════════════════════╣");
1982    println!("║  CHARTS:                                                     ║");
1983    println!("║    ✓ Bar Chart       ✓ Line Chart     ✓ Pie Chart            ║");
1984    println!("║    ✓ Multiple series ✓ Categories                            ║");
1985    println!("╠══════════════════════════════════════════════════════════════╣");
1986    println!("║  SHAPES:                                                     ║");
1987    println!("║    ✓ Rectangle       ✓ Ellipse        ✓ RoundedRectangle     ║");
1988    println!("║    ✓ Triangle        ✓ Diamond        ✓ Color fills          ║");
1989    println!("║    ✓ Gradient fills  ✓ Transparency   ✓ Text in shapes       ║");
1990    println!("╠══════════════════════════════════════════════════════════════╣");
1991    println!("║  CONNECTORS (NEW):                                           ║");
1992    println!("║    ✓ Straight        ✓ Elbow          ✓ Curved               ║");
1993    println!("║    ✓ Arrow types     ✓ Dash styles    ✓ Line colors/widths   ║");
1994    println!("╠══════════════════════════════════════════════════════════════╣");
1995    println!("║  IMAGES:                                                     ║");
1996    println!("║    ✓ Image placeholders  ✓ Position   ✓ Dimensions           ║");
1997    println!("╠══════════════════════════════════════════════════════════════╣");
1998    println!("║  PACKAGE:                                                    ║");
1999    println!("║    ✓ Create PPTX     ✓ Read PPTX      ✓ Analyze contents     ║");
2000    println!("╠══════════════════════════════════════════════════════════════╣");
2001    println!("║  PARTS API (NEW):                                            ║");
2002    println!("║    ✓ SlideLayoutPart (11 types)  ✓ SlideMasterPart           ║");
2003    println!("║    ✓ ThemePart (colors/fonts)    ✓ NotesSlidePart            ║");
2004    println!("║    ✓ AppPropertiesPart           ✓ MediaPart (10 formats)    ║");
2005    println!("║    ✓ TablePart (cell formatting) ✓ ContentTypesPart          ║");
2006    println!("╠══════════════════════════════════════════════════════════════╣");
2007    println!("║  ELEMENTS API:                                               ║");
2008    println!("║    ✓ RgbColor        ✓ SchemeColor    ✓ Color enum           ║");
2009    println!("║    ✓ Position        ✓ Size           ✓ Transform            ║");
2010    println!("║    ✓ EMU conversions (inches, cm, mm, pt)                    ║");
2011    println!("╠══════════════════════════════════════════════════════════════╣");
2012    println!("║  ADVANCED FEATURES (NEW):                                    ║");
2013    println!("║    ✓ Animation (50+ effects)  ✓ Transitions (27 types)       ║");
2014    println!("║    ✓ SmartArt (25 layouts)    ✓ 3D Models (GLB/GLTF/OBJ)     ║");
2015    println!("║    ✓ VBA Macros (.pptm)       ✓ Embedded Fonts               ║");
2016    println!("║    ✓ Custom XML               ✓ Handout Master               ║");
2017    println!("║    ✓ Table borders/alignment  ✓ Merged cells                 ║");
2018    println!("╠══════════════════════════════════════════════════════════════╣");
2019    println!("║  DIMENSION API (NEW):                                        ║");
2020    println!("║    ✓ EMU / Inches / Cm / Pt / Ratio / Percent units          ║");
2021    println!("║    ✓ from_dimensions() constructor                           ║");
2022    println!("║    ✓ Fluent .at() and .with_dimensions() chaining            ║");
2023    println!("║    ✓ Mixed-unit positioning (e.g. inches + percent)          ║");
2024    println!("╠══════════════════════════════════════════════════════════════╣");
2025    println!("║  Output: comprehensive_demo.pptx ({} slides, {} KB)         ║", 
2026             slides.len(), pptx_data.len() / 1024);
2027    println!("╚══════════════════════════════════════════════════════════════╝");
2028
2029    Ok(())
2030}
Source

pub fn black() -> Self

Common colors

Source

pub fn white() -> Self

Source

pub fn red() -> Self

Source

pub fn green() -> Self

Source

pub fn blue() -> Self

Trait Implementations§

Source§

impl Clone for RgbColor

Source§

fn clone(&self) -> RgbColor

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for RgbColor

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for RgbColor

Source§

fn default() -> Self

Returns the “default value” for a type. Read more
Source§

impl PartialEq for RgbColor

Source§

fn eq(&self, other: &RgbColor) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
Source§

impl ToXml for RgbColor

Source§

fn to_xml(&self) -> String

Generate XML representation of this element
Source§

fn write_xml(&self, writer: &mut String)

Write XML to a string buffer (more efficient for large documents)
Source§

impl Eq for RgbColor

Source§

impl StructuralPartialEq for RgbColor

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where Q: Eq + ?Sized, K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where Q: Eq + ?Sized, K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more