Skip to main content

Position

Struct Position 

Source
pub struct Position {
    pub x: i64,
    pub y: i64,
}
Expand description

Position in EMU

Fields§

§x: i64§y: i64

Implementations§

Source§

impl Position

Source

pub fn new(x: i64, y: i64) -> Self

Create position from EMU values

Source

pub fn from_inches(x: f64, y: f64) -> Self

Create position from inches

Examples found in repository?
examples/comprehensive_demo.rs (line 1594)
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_cm(x: f64, y: f64) -> Self

Create position from centimeters

Source

pub fn x_inches(&self) -> f64

Get X in inches

Source

pub fn y_inches(&self) -> f64

Get Y in inches

Trait Implementations§

Source§

impl Clone for Position

Source§

fn clone(&self) -> Position

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 Position

Source§

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

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

impl Default for Position

Source§

fn default() -> Position

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

impl PartialEq for Position

Source§

fn eq(&self, other: &Position) -> 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 Copy for Position

Source§

impl Eq for Position

Source§

impl StructuralPartialEq for Position

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