Public/Charts/New-CardChartHorizontalBar.ps1

function New-CardChartHorizontalBar {
    <#
    .SYNOPSIS
    Creates a horizontal bar chart element for Adaptive Cards.
 
    .DESCRIPTION
    Creates a Chart.HorizontalBar element with configurable data points, colors, and display options.
 
    .PARAMETER Data
    Array of data points for the chart. Each data point should be a hashtable with properties like label, value, and optional color.
 
    .PARAMETER Title
    The title of the chart.
 
    .PARAMETER Color
    The color to use for all data points. Valid values include: good, warning, attention, neutral, and various categorical, sequential, and diverging colors.
 
    .PARAMETER ColorSet
    The name of the set of colors to use to render the chart. Valid values: categorical, sequential, diverging.
 
    .PARAMETER DisplayMode
    Controls how the chart should be visually laid out. Valid values: AbsoluteWithAxis, AbsoluteNoAxis, PartToWhole. Default is AbsoluteWithAxis.
 
    .PARAMETER XAxisTitle
    The title of the x axis.
 
    .PARAMETER YAxisTitle
    The title of the y axis.
 
    .PARAMETER Id
    A unique identifier for the element.
 
    .PARAMETER Height
    The height of the element. Valid values: auto, stretch.
 
    .PARAMETER HorizontalAlignment
    Controls how the element should be horizontally aligned. Valid values: Left, Center, Right.
 
    .PARAMETER Separator
    Controls whether a separator line should be displayed above the element.
 
    .PARAMETER Spacing
    Controls the amount of space between this element and the previous one. Valid values: None, ExtraSmall, Small, Default, Medium, Large, ExtraLarge, Padding.
 
    .PARAMETER IsVisible
    Controls the visibility of the element.
 
    .PARAMETER IsSortKey
    Controls whether the element should be used as a sort key.
 
    .PARAMETER TargetWidth
    Controls for which card width the element should be displayed.
 
    .PARAMETER GridArea
    The area of a Layout.AreaGrid layout in which an element should be displayed.
 
    .PARAMETER Lang
    The locale associated with the element.
 
    .PARAMETER Fallback
    An alternate element to render if this element type is unsupported.
 
    .PARAMETER Requires
    A hashtable of capabilities the element requires the host application to support.
 
    .EXAMPLE
    New-CardChartHorizontalBar -Title "Sales Data" -Data @(
        @{ label = "Q1"; value = 100 },
        @{ label = "Q2"; value = 150 },
        @{ label = "Q3"; value = 120 }
    ) -ColorSet "categorical"
 
    .EXAMPLE
    New-CardChartHorizontalBar -Title "Progress" -Data @(
        @{ label = "Complete"; value = 75; color = "good" },
        @{ label = "Remaining"; value = 25; color = "neutral" }
    ) -DisplayMode "PartToWhole"
    #>

    [CmdletBinding()]
    param(
        [Parameter(Mandatory = $true)]
        [Array]$Data,

        [Parameter(Mandatory = $false)]
        [string]$Title,

        [Parameter(Mandatory = $false)]
        [ValidateSet('good', 'warning', 'attention', 'neutral', 'categoricalRed', 'categoricalPurple',
            'categoricalLavender', 'categoricalBlue', 'categoricalLightBlue', 'categoricalTeal',
            'categoricalGreen', 'categoricalLime', 'categoricalMarigold', 'sequential1', 'sequential2',
            'sequential3', 'sequential4', 'sequential5', 'sequential6', 'sequential7', 'sequential8',
            'divergingBlue', 'divergingLightBlue', 'divergingCyan', 'divergingTeal', 'divergingYellow',
            'divergingPeach', 'divergingLightRed', 'divergingRed', 'divergingMaroon', 'divergingGray')]
        [string]$Color,

        [Parameter(Mandatory = $false)]
        [ValidateSet('categorical', 'sequential', 'diverging')]
        [string]$ColorSet,

        [Parameter(Mandatory = $false)]
        [ValidateSet('AbsoluteWithAxis', 'AbsoluteNoAxis', 'PartToWhole')]
        [string]$DisplayMode = 'AbsoluteWithAxis',

        [Parameter(Mandatory = $false)]
        [string]$XAxisTitle,

        [Parameter(Mandatory = $false)]
        [string]$YAxisTitle,

        [Parameter(Mandatory = $false)]
        [string]$Id,

        [Parameter(Mandatory = $false)]
        [ValidateSet('auto', 'stretch')]
        [string]$Height,

        [Parameter(Mandatory = $false)]
        [ValidateSet('Left', 'Center', 'Right')]
        [string]$HorizontalAlignment,

        [Parameter(Mandatory = $false)]
        [switch]$Separator,

        [Parameter(Mandatory = $false)]
        [ValidateSet('None', 'ExtraSmall', 'Small', 'Default', 'Medium', 'Large', 'ExtraLarge', 'Padding')]
        [string]$Spacing,

        [Parameter(Mandatory = $false)]
        [bool]$IsVisible = $true,

        [Parameter(Mandatory = $false)]
        [bool]$IsSortKey = $false,

        [Parameter(Mandatory = $false)]
        [ValidateSet('VeryNarrow', 'Narrow', 'Standard', 'Wide', 'atLeast:VeryNarrow', 'atMost:VeryNarrow',
            'atLeast:Narrow', 'atMost:Narrow', 'atLeast:Standard', 'atMost:Standard', 'atLeast:Wide', 'atMost:Wide')]
        [string]$TargetWidth,

        [Parameter(Mandatory = $false)]
        [string]$GridArea,

        [Parameter(Mandatory = $false)]
        [string]$Lang,

        [Parameter(Mandatory = $false)]
        [scriptblock]$Fallback,

        [Parameter(Mandatory = $false)]
        [hashtable]$Requires
    )

    $element = @{
        type = 'Chart.HorizontalBar'
        data = $Data
    }

    if ($Title) { $element.title = $Title }
    if ($Color) { $element.color = $Color }
    if ($ColorSet) { $element.colorSet = $ColorSet }
    if ($DisplayMode) { $element.displayMode = $DisplayMode }
    if ($XAxisTitle) { $element.xAxisTitle = $XAxisTitle }
    if ($YAxisTitle) { $element.yAxisTitle = $YAxisTitle }
    if ($Id) { $element.id = $Id }
    if ($Height) { $element.height = $Height }
    if ($HorizontalAlignment) { $element.horizontalAlignment = $HorizontalAlignment }
    if ($Separator) { $element.separator = $true }
    if ($Spacing) { $element.spacing = $Spacing }
    if ($PSBoundParameters.ContainsKey('IsVisible')) { $element.isVisible = $IsVisible }
    if ($IsSortKey) { $element.isSortKey = $true }
    if ($TargetWidth) { $element.targetWidth = $TargetWidth }
    if ($GridArea) { $element.'grid.area' = $GridArea }
    if ($Lang) { $element.lang = $Lang }
    if ($Fallback) {
        $element.fallback = Invoke-Command -ScriptBlock $Fallback
    }
    if ($Requires) { $element.requires = $Requires }

    return $element
}