Public/Start-TerminalSlidesDemo.ps1
|
function New-TerminalSlidesDemoPresentation { $presentation = New-TerminalPresentation -Title 'TerminalSlides Feature Tour' -Subtitle 'A guided walkthrough of terminal-native presentations' -Author 'TerminalSlides' -Theme Midnight $photoPath = Join-Path $script:ModuleRoot 'Assets/presentation-team-photo.jpg' $presentation | Add-TerminalSlide -Title 'Welcome' -Content { Add-SlideTitle 'Present from the terminal' Add-SlideSubtitle 'Press Right to reveal each point' Add-SlideText 'TerminalSlides turns familiar PowerShell objects into a focused, keyboard-driven presentation.' Add-SlideBullet 'Build decks with PowerShell' -RevealStep 1 Add-SlideBullet 'Reveal ideas at your pace' -RevealStep 2 Add-SlideBullet 'Use Q or Escape to exit at any time' -RevealStep 3 Add-SlideNotes 'Introduce the deck, then use Right Arrow to show incremental reveals.' } | Out-Null $presentation | Add-TerminalSlide -Title 'Code' -Content { Add-SlideCode -Language powershell -Border -Code @' $deck = New-TerminalPresentation -Title 'Demo' $deck | Add-TerminalSlide -Title 'Hello' -Content { Add-SlideText 'Built in PowerShell' } Show-TerminalPresentation -Presentation $deck '@ } | Out-Null $presentation | Add-TerminalSlide -Title 'Tables' -Content { Add-SlideTable -Border -Data @( [pscustomobject]@{ Feature = 'Text'; Purpose = 'Narrative and annotations' } [pscustomobject]@{ Feature = 'Code'; Purpose = 'Syntax-highlighted snippets' } [pscustomobject]@{ Feature = 'Data'; Purpose = 'Tables and charts' } ) } | Out-Null $presentation | Add-TerminalSlide -Title 'Charts' -Content { Add-SlideChart -ChartType HorizontalBar -Title 'Build confidence' -Data @( [pscustomobject]@{ Label = 'Design'; Value = 35 } [pscustomobject]@{ Label = 'Data'; Value = 65 } [pscustomobject]@{ Label = 'Delivery'; Value = 90 } ) } | Out-Null $presentation | Add-TerminalSlide -Title 'Diagrams' -Content { Add-SlideDiagram -Content { Add-SlideDiagramNode -Id 'idea' -Label 'Idea' Add-SlideDiagramNode -Id 'deck' -Label 'Deck' Add-SlideDiagramNode -Id 'terminal' -Label 'Terminal' Add-SlideDiagramEdge -From 'idea' -To 'deck' -Label 'compose' Add-SlideDiagramEdge -From 'deck' -To 'terminal' -Label 'present' } } | Out-Null $presentation | Add-TerminalSlide -Title 'Callouts and media' -Content { Add-SlideQuote -Text 'The best presentation tool is the one already in your workflow.' -Attribution 'TerminalSlides' Add-SlideBox -Text 'Use callout boxes to make a decision, warning, or takeaway impossible to miss.' } | Out-Null $presentation | Add-TerminalSlide -Title 'Visual storytelling' -Layout ImageFocus -Content { Add-SlideImage -Path $photoPath -AltText 'Three software engineers collaborating around a laptop during a presentation rehearsal.' -Region Image } | Out-Null $presentation | Add-TerminalSlide -Title 'Presentation controls' -Content { Add-SlideText 'Navigate with arrows, Space, N, PageUp, PageDown, Home, and End.' Add-SlideText 'Toggle notes, overview, blanking, timer, and help with S, O, B, T, and H.' -RevealStep 1 Add-SlideBox -Text 'Try ? for the in-presentation control reference, then Q to return to PowerShell.' -RevealStep 2 } | Out-Null return $presentation } function New-IntuneHydrationKitDemoPresentation { $presentation = New-TerminalPresentation ` -Title 'Intune Hydration Kit' ` -Subtitle 'Automate. Hydrate. Protect.' ` -Author 'Jorgeasaurus' ` -Description 'A guided tour of production-first Microsoft Intune tenant hydration.' ` -Theme PowerShell ` -Metadata @{ Showcase = 'IntuneHydrationKit'; SourceVersion = '1.2.0' } $tuiPath = Join-Path $script:ModuleRoot 'Assets/intune-hydration-kit-tui.png' $presentation | Add-TerminalSlide -Title 'Intune Hydration Kit' -Content { Add-SlideTitle 'Automate. Hydrate. Protect.' Add-SlideSubtitle 'Production-first Microsoft Intune tenant hydration' Add-SlideText 'Turn a deliberate workload plan into repeatable Microsoft Graph operations.' Add-SlideBullet 'Start with a guided terminal experience' -RevealStep 1 Add-SlideBullet 'Move the same plan into repeatable automation' -RevealStep 2 Add-SlideBullet 'Keep safety checks and evidence in every run' -RevealStep 3 Add-SlideNotes 'Frame the kit as an orchestration layer: curated templates, guarded execution, and auditable results.' } | Out-Null $presentation | Add-TerminalSlide -Title 'One command. 1,000+ building blocks.' -Content { Add-SlideChart -ChartType HorizontalBar -Title 'Bundled, validated catalog' -Data @( [pscustomobject]@{ Label = 'CIS policies'; Value = 728 } [pscustomobject]@{ Label = 'Open baseline'; Value = 99 } [pscustomobject]@{ Label = 'Groups'; Value = 64 } [pscustomobject]@{ Label = 'Filters'; Value = 38 } [pscustomobject]@{ Label = 'Apps'; Value = 36 } ) Add-SlideBox -Text 'Baselines, targeting, compliance, enrollment, apps, and access controls ship as a tested catalog.' -RevealStep 1 } | Out-Null $presentation | Add-TerminalSlide -Title 'Install, then hydrate' -Layout CodeFocus -Content { Add-SlideCode -Language powershell -Border -Region Code -Code @' Install-Module -Name IntuneHydrationKit -Scope CurrentUser # Launch the guided terminal workflow. Invoke-IntuneHydration # Explore the complete public surface. Get-Command -Module IntuneHydrationKit Get-Help Invoke-IntuneHydration -Detailed '@ } | Out-Null $presentation | Add-TerminalSlide -Title 'Guided TUI, deliberate choices' -Layout ImageFocus -Content { Add-SlideImage ` -Path $tuiPath ` -AltText 'Intune Hydration Kit terminal review showing an obfuscated tenant, create operation, selected workloads, and confirmation prompt.' ` -Region Image Add-SlideNotes 'The TUI reviews the cloud, operation, workloads, platforms, logging, and final confirmation before execution.' } | Out-Null $presentation | Add-TerminalSlide -Title 'Choose only what you need' -Content { Add-SlideTable -Border -Data @( [pscustomobject]@{ Area = 'Targeting'; Workloads = 'Dynamic groups, static groups, device filters' } [pscustomobject]@{ Area = 'Baselines'; Workloads = 'OpenIntuneBaseline, CIS baselines' } [pscustomobject]@{ Area = 'Endpoint'; Workloads = 'Compliance, app protection, enrollment' } [pscustomobject]@{ Area = 'Access'; Workloads = 'Conditional Access starter policies' } [pscustomobject]@{ Area = 'Apps'; Workloads = 'Mobile apps and WinGet Win32 apps' } [pscustomobject]@{ Area = 'Messaging'; Workloads = 'Notification templates' } ) Add-SlideText 'Platform filters narrow supported workloads to Windows, macOS, iOS, Android, or Linux.' -RevealStep 1 } | Out-Null $presentation | Add-TerminalSlide -Title 'Preview before Graph writes' -Layout CodeFocus -Content { Add-SlideCode -Language powershell -Border -Region Code -Code @' Invoke-IntuneHydration ` -TenantId '00000000-0000-0000-0000-000000000000' ` -Interactive ` -Create ` -DeviceFilters ` -Platform Windows ` -WhatIf '@ Add-SlideNotes 'Dry-run create in the TUI follows the same preview path. Authentication and read-only prerequisite checks still run.' } | Out-Null $presentation | Add-TerminalSlide -Title 'Windows apps, ready for Intune' -Layout TwoColumn -Content { Add-SlideCode -Language powershell -Border -Region Left -Code @' Import-IntuneWinGetApp ` -PresetId 'starter-pack' Import-IntuneWinGetApp ` -TemplateId 'google-chrome' '@ Add-SlideBullet 'Builds .intunewin content without IntuneWinAppUtil.exe' -Region Right Add-SlideBullet 'Uses the bundled WinGet application catalog' -Region Right -RevealStep 1 Add-SlideBullet 'Leaves generated remediations unassigned for review' -Region Right -RevealStep 2 Add-SlideBox -Text 'Package once. Review assignments. Deploy intentionally.' -Region Right -RevealStep 3 } | Out-Null $presentation | Add-TerminalSlide -Title 'Repeatable automation' -Layout TwoColumn -Content { Add-SlideCode -Language powershell -Border -Region Left -Code @' Copy-Item ` settings.example.json ` settings.json Invoke-IntuneHydration ` -SettingsPath ./settings.json ` -WhatIf '@ Add-SlideDiagram -Region Right -Content { Add-SlideDiagramNode -Id 'settings' -Label 'Plan' Add-SlideDiagramNode -Id 'engine' -Label 'Engine' Add-SlideDiagramNode -Id 'reports' -Label 'Reports' Add-SlideDiagramEdge -From 'settings' -To 'engine' -Label 'apply' Add-SlideDiagramEdge -From 'engine' -To 'reports' -Label 'record' } } | Out-Null $presentation | Add-TerminalSlide -Title 'Guardrails, not guesswork' -Content { Add-SlideBullet 'Idempotent imports skip existing configurations' Add-SlideBullet 'Dry-run and -WhatIf preview intended changes' -RevealStep 1 Add-SlideBullet 'Cleanup targets only kit-owned objects' -RevealStep 2 Add-SlideBullet 'Conditional Access starter policies are created disabled' -RevealStep 3 Add-SlideBox -Text 'Test in a non-production tenant first. Review every selected workload before applying.' -RevealStep 4 } | Out-Null $presentation | Add-TerminalSlide -Title 'Evidence at the finish line' -Content { Add-SlideTable -Border -Data @( [pscustomobject]@{ Evidence = 'Live status'; Purpose = 'Created, updated, skipped, previewed, or failed' } [pscustomobject]@{ Evidence = 'Detailed log'; Purpose = 'Operational audit trail and diagnostics' } [pscustomobject]@{ Evidence = 'Markdown'; Purpose = 'Human-readable hydration summary' } [pscustomobject]@{ Evidence = 'JSON'; Purpose = 'Machine-readable result processing' } [pscustomobject]@{ Evidence = 'Elapsed time'; Purpose = 'End-to-end execution duration' } ) Add-SlideBox -Text 'First run: launch the TUI, choose Dry-run create, select Device Filters, then review.' -RevealStep 1 Add-SlideNotes 'Close with the smallest safe first step, not an all-workloads production run.' } | Out-Null return $presentation } function Start-TerminalSlidesDemo { [CmdletBinding()] param( [ValidateSet('TerminalSlides', 'IntuneHydrationKit')] [string]$Name = 'TerminalSlides', [ValidateSet('Blocks', 'Sixel')] [string]$ImageRenderer = 'Sixel', [switch]$PassThru ) $presentation = switch ($Name) { 'IntuneHydrationKit' { New-IntuneHydrationKitDemoPresentation } default { New-TerminalSlidesDemoPresentation } } if ($PassThru) { return $presentation } Show-TerminalPresentation -Presentation $presentation -ImageRenderer $ImageRenderer } |