From ad923bd189f2184611fddec1877852ea78677a47 Mon Sep 17 00:00:00 2001 From: Shephard Tseisi Date: Thu, 22 Oct 2026 23:12:40 +0200 Subject: [PATCH 1/4] feat: add PromptSuggestions, Reasoning, ToolCall, Field and JsonViewer PromptSuggestions shows clickable chips for an empty chat. Reasoning streams a model's thinking, open while IsStreaming and folded to "Thought for N seconds" after. ToolCall shows a tool's name and a pending, running, done or error badge, and opens to its arguments, result or error. Field puts a label, control, description and validation message together, vertical or horizontal. JsonViewer renders a highlighted, foldable JSON tree from a string or an object, with a copy button; it recurses through a hidden json-viewer-node part. Each ships as a package component and a CLI template. Safelist regenerated. Closes #62 --- src/ShellUI.Components/Components/Field.razor | 70 +++++++++++ .../Components/JsonViewer.razor | 57 +++++++++ .../Components/JsonViewerNode.razor | 83 +++++++++++++ .../Components/PromptSuggestions.razor | 22 ++++ .../Components/Reasoning.razor | 52 +++++++++ .../Components/ToolCall.razor | 91 +++++++++++++++ .../build/ShellUI.Components.targets | 13 +++ .../wwwroot/shellui-classes.txt | 13 +++ src/ShellUI.Templates/ComponentRegistry.cs | 12 ++ .../Templates/FieldTemplate.cs | 89 ++++++++++++++ .../Templates/JsonViewerNodeTemplate.cs | 102 ++++++++++++++++ .../Templates/JsonViewerTemplate.cs | 76 ++++++++++++ .../Templates/PromptSuggestionsTemplate.cs | 41 +++++++ .../Templates/ReasoningTemplate.cs | 71 +++++++++++ .../Templates/ToolCallTemplate.cs | 110 ++++++++++++++++++ 15 files changed, 902 insertions(+) create mode 100644 src/ShellUI.Components/Components/Field.razor create mode 100644 src/ShellUI.Components/Components/JsonViewer.razor create mode 100644 src/ShellUI.Components/Components/JsonViewerNode.razor create mode 100644 src/ShellUI.Components/Components/PromptSuggestions.razor create mode 100644 src/ShellUI.Components/Components/Reasoning.razor create mode 100644 src/ShellUI.Components/Components/ToolCall.razor create mode 100644 src/ShellUI.Templates/Templates/FieldTemplate.cs create mode 100644 src/ShellUI.Templates/Templates/JsonViewerNodeTemplate.cs create mode 100644 src/ShellUI.Templates/Templates/JsonViewerTemplate.cs create mode 100644 src/ShellUI.Templates/Templates/PromptSuggestionsTemplate.cs create mode 100644 src/ShellUI.Templates/Templates/ReasoningTemplate.cs create mode 100644 src/ShellUI.Templates/Templates/ToolCallTemplate.cs diff --git a/src/ShellUI.Components/Components/Field.razor b/src/ShellUI.Components/Components/Field.razor new file mode 100644 index 0000000..e722b3d --- /dev/null +++ b/src/ShellUI.Components/Components/Field.razor @@ -0,0 +1,70 @@ +@namespace ShellUI.Components +@using System.Linq.Expressions +@using Microsoft.AspNetCore.Components.Forms + + +
+ @if (IsHorizontal) + { +
+ @if (!string.IsNullOrEmpty(Label)) + { + + } + @if (!string.IsNullOrEmpty(Description)) + { +

@Description

+ } + +
+
@ChildContent
+ } + else + { + @if (!string.IsNullOrEmpty(Label)) + { + + } + @ChildContent + @if (!string.IsNullOrEmpty(Description)) + { +

@Description

+ } + + } +
+
+ +@code { + [Parameter] public string? Label { get; set; } + // The id of the control inside, so clicking the label focuses it. + [Parameter] public string? LabelFor { get; set; } + [Parameter] public string? Description { get; set; } + // Shown instead of the EditForm's validation messages for For. + [Parameter] public string? Error { get; set; } + // The model property whose validation messages to show, as in FormField. + [Parameter] public Expression>? For { get; set; } + [Parameter] public bool Required { get; set; } + // "vertical" or "horizontal" (label and description beside the control, for switches and checkboxes). + [Parameter] public string Orientation { get; set; } = "vertical"; + [Parameter] public RenderFragment? ChildContent { get; set; } + [Parameter] public string? Class { get; set; } + [Parameter(CaptureUnmatchedValues = true)] + public Dictionary? AdditionalAttributes { get; set; } + + private bool IsHorizontal => string.Equals(Orientation, "horizontal", StringComparison.OrdinalIgnoreCase); + + private FieldIdentifier FieldIdentifier => For != null ? FieldIdentifier.Create(For) : default; +} diff --git a/src/ShellUI.Components/Components/JsonViewer.razor b/src/ShellUI.Components/Components/JsonViewer.razor new file mode 100644 index 0000000..cd28932 --- /dev/null +++ b/src/ShellUI.Components/Components/JsonViewer.razor @@ -0,0 +1,57 @@ +@namespace ShellUI.Components +@using System.Text.Json + +
+ @if (_error != null) + { +

@_error

+ } + else if (_root is { } root) + { + @if (ShowCopy) + { + + } + @* Keyed on the source so new JSON resets which nodes are open. *@ + + } +
+ +@code { + [Parameter] public string? Json { get; set; } + // Serialized with System.Text.Json when Json is not set. + [Parameter] public object? Value { get; set; } + // Levels open on first render; deeper objects and arrays start collapsed. + [Parameter] public int ExpandDepth { get; set; } = 2; + [Parameter] public bool ShowCopy { get; set; } = true; + [Parameter] public string? Class { get; set; } + [Parameter(CaptureUnmatchedValues = true)] + public Dictionary? AdditionalAttributes { get; set; } + + private static readonly JsonSerializerOptions Indented = new() { WriteIndented = true }; + + private string? _source; + private JsonElement? _root; + private string? _formatted; + private string? _error; + + protected override void OnParametersSet() + { + var source = Json ?? (Value == null ? null : JsonSerializer.Serialize(Value)); + if (source == _source) return; + _source = source; + _root = null; + _error = null; + if (string.IsNullOrWhiteSpace(source)) return; + try + { + using var doc = JsonDocument.Parse(source); + _root = doc.RootElement.Clone(); + _formatted = JsonSerializer.Serialize(_root.Value, Indented); + } + catch (JsonException ex) + { + _error = $"Invalid JSON: {ex.Message}"; + } + } +} diff --git a/src/ShellUI.Components/Components/JsonViewerNode.razor b/src/ShellUI.Components/Components/JsonViewerNode.razor new file mode 100644 index 0000000..e853cb3 --- /dev/null +++ b/src/ShellUI.Components/Components/JsonViewerNode.razor @@ -0,0 +1,83 @@ +@namespace ShellUI.Components +@using System.Text.Json + +
+ @if (IsContainer) + { + + @if (_open) + { +
+ @foreach (var (child, name, index) in Children) + { + + } +
+ @(Close)@Comma + } + } + else + { + + @if (Name != null) + { + "@Name": + } + @Element.GetRawText()@Comma + + } +
+ +@code { + [Parameter] public JsonElement Element { get; set; } + // The property name, or null for array items and the root. + [Parameter] public string? Name { get; set; } + [Parameter] public int Depth { get; set; } + [Parameter] public int ExpandDepth { get; set; } = 2; + [Parameter] public bool Last { get; set; } = true; + + private bool _open; + + private bool IsObject => Element.ValueKind == JsonValueKind.Object; + private bool IsContainer => IsObject || Element.ValueKind == JsonValueKind.Array; + private int Count => IsObject ? Element.EnumerateObject().Count() : IsContainer ? Element.GetArrayLength() : 0; + private string Open => IsObject ? "{" : "["; + private string Close => IsObject ? "}" : "]"; + private string Comma => Last ? "" : ","; + private string Summary => IsObject ? (Count == 1 ? "1 key" : $"{Count} keys") : (Count == 1 ? "1 item" : $"{Count} items"); + + private IEnumerable<(JsonElement Child, string? Name, int Index)> Children => IsObject + ? Element.EnumerateObject().Select((p, i) => (p.Value, (string?)p.Name, i)) + : Element.EnumerateArray().Select((e, i) => (e, (string?)null, i)); + + private string ValueClass => Element.ValueKind switch + { + JsonValueKind.String => "text-emerald-700 dark:text-emerald-400", + JsonValueKind.Number => "text-amber-700 dark:text-amber-400", + JsonValueKind.True or JsonValueKind.False => "text-violet-700 dark:text-violet-400", + _ => "text-muted-foreground" + }; + + protected override void OnInitialized() => _open = Depth < ExpandDepth; + + private void Toggle() => _open = !_open; +} diff --git a/src/ShellUI.Components/Components/PromptSuggestions.razor b/src/ShellUI.Components/Components/PromptSuggestions.razor new file mode 100644 index 0000000..ae2688f --- /dev/null +++ b/src/ShellUI.Components/Components/PromptSuggestions.razor @@ -0,0 +1,22 @@ +@namespace ShellUI.Components + +
+ @foreach (var suggestion in Suggestions) + { + + } +
+ +@code { + [Parameter] public IEnumerable Suggestions { get; set; } = Array.Empty(); + [Parameter] public EventCallback OnSelect { get; set; } + [Parameter] public bool Disabled { get; set; } + [Parameter] public string? Class { get; set; } + [Parameter(CaptureUnmatchedValues = true)] + public Dictionary? AdditionalAttributes { get; set; } +} diff --git a/src/ShellUI.Components/Components/Reasoning.razor b/src/ShellUI.Components/Components/Reasoning.razor new file mode 100644 index 0000000..c2e80e8 --- /dev/null +++ b/src/ShellUI.Components/Components/Reasoning.razor @@ -0,0 +1,52 @@ +@namespace ShellUI.Components + +
+ + @if (_open) + { +
@(Text)@ChildContent
+ } +
+ +@code { + [Parameter] public string? Text { get; set; } + [Parameter] public RenderFragment? ChildContent { get; set; } + // Opens while streaming and closes when streaming ends. + [Parameter] public bool IsStreaming { get; set; } + // How long the model thought, shown once streaming ends. + [Parameter] public TimeSpan? Duration { get; set; } + // Replaces the "Thinking…" / "Thought for …" label. + [Parameter] public string? Title { get; set; } + [Parameter] public bool DefaultOpen { get; set; } + [Parameter] public string? Class { get; set; } + [Parameter(CaptureUnmatchedValues = true)] + public Dictionary? AdditionalAttributes { get; set; } + + private bool _open; + private bool? _wasStreaming; + + private string Label => Title ?? (IsStreaming ? "Thinking…" : Duration is { } d ? $"Thought for {Seconds(d)}" : "Reasoning"); + + private static string Seconds(TimeSpan d) + { + var s = Math.Max(1, (int)Math.Round(d.TotalSeconds)); + return s == 1 ? "1 second" : $"{s} seconds"; + } + + protected override void OnParametersSet() + { + if (_wasStreaming == IsStreaming) return; + _open = _wasStreaming == null ? DefaultOpen || IsStreaming : IsStreaming; + _wasStreaming = IsStreaming; + } + + private void Toggle() => _open = !_open; +} diff --git a/src/ShellUI.Components/Components/ToolCall.razor b/src/ShellUI.Components/Components/ToolCall.razor new file mode 100644 index 0000000..29efc8d --- /dev/null +++ b/src/ShellUI.Components/Components/ToolCall.razor @@ -0,0 +1,91 @@ +@namespace ShellUI.Components + +
+ + @if (_open) + { +
+ @if (!string.IsNullOrEmpty(Arguments)) + { +
+

Arguments

+
@Arguments
+
+ } + @if (!string.IsNullOrEmpty(Result)) + { +
+

Result

+
@Result
+
+ } + @if (!string.IsNullOrEmpty(Error)) + { +
+

Error

+
@Error
+
+ } + @ChildContent +
+ } +
+ +@code { + [Parameter] public string Name { get; set; } = ""; + // "pending", "running", "done" or "error". + [Parameter] public string State { get; set; } = "pending"; + [Parameter] public string? Arguments { get; set; } + [Parameter] public string? Result { get; set; } + [Parameter] public string? Error { get; set; } + [Parameter] public RenderFragment? ChildContent { get; set; } + [Parameter] public bool DefaultOpen { get; set; } + [Parameter] public string? Class { get; set; } + [Parameter(CaptureUnmatchedValues = true)] + public Dictionary? AdditionalAttributes { get; set; } + + private bool _open; + + private string StateKey => State.ToLowerInvariant(); + + private string StateLabel => StateKey switch + { + "running" => "Running", + "done" => "Done", + "error" => "Error", + _ => "Pending" + }; + + private string StateClass => StateKey switch + { + "running" => "bg-primary/10 text-primary", + "done" => "bg-emerald-500/10 text-emerald-600 dark:text-emerald-400", + "error" => "bg-destructive/10 text-destructive", + _ => "bg-muted text-muted-foreground" + }; + + protected override void OnInitialized() => _open = DefaultOpen; + + private void Toggle() => _open = !_open; +} diff --git a/src/ShellUI.Components/build/ShellUI.Components.targets b/src/ShellUI.Components/build/ShellUI.Components.targets index 2c8371c..5825172 100644 --- a/src/ShellUI.Components/build/ShellUI.Components.targets +++ b/src/ShellUI.Components/build/ShellUI.Components.targets @@ -30,6 +30,7 @@ + @@ -86,10 +87,13 @@ + + + @@ -354,9 +358,11 @@ + + @@ -512,6 +518,7 @@ + @@ -524,6 +531,7 @@ + @@ -531,6 +539,7 @@ + @@ -548,7 +557,9 @@ + + @@ -565,6 +576,7 @@ + @@ -615,6 +627,7 @@ + diff --git a/src/ShellUI.Components/wwwroot/shellui-classes.txt b/src/ShellUI.Components/wwwroot/shellui-classes.txt index 0ec99c4..b8429df 100644 --- a/src/ShellUI.Components/wwwroot/shellui-classes.txt +++ b/src/ShellUI.Components/wwwroot/shellui-classes.txt @@ -27,6 +27,7 @@ bg-border bg-card bg-current bg-destructive +bg-destructive/10 bg-emerald-500/10 bg-green-50 bg-green-500 @@ -83,10 +84,13 @@ dark:bg-green-900/20 dark:bg-green-900/30 dark:bg-yellow-900/20 dark:bg-yellow-900/30 +dark:text-amber-400 dark:text-blue-100 dark:text-emerald-400 dark:text-green-100 dark:text-red-400 +dark:text-sky-400 +dark:text-violet-400 dark:text-yellow-100 data-[disabled]:opacity-50 data-[disabled]:pointer-events-none @@ -351,9 +355,11 @@ min-w-8 min-w-[12rem] min-w-[640px] min-w-[8rem] +ml-0.5 ml-1 ml-2 ml-4 +ml-[5px] ml-auto motion-reduce:animate-none motion-reduce:transition-none @@ -509,6 +515,7 @@ space-x-4 space-y-0.5 space-y-1.5 space-y-2 +space-y-3 space-y-4 space-y-6 sr-only @@ -521,6 +528,7 @@ text-[10px] text-[11px] text-[8px] text-accent-foreground +text-amber-700 text-base text-blue-700 text-card-foreground @@ -528,6 +536,7 @@ text-center text-destructive text-destructive-foreground text-emerald-600 +text-emerald-700 text-foreground text-foreground/70 text-green-700 @@ -545,7 +554,9 @@ text-sidebar-accent-foreground text-sidebar-foreground text-sidebar-foreground/70 text-sidebar-primary-foreground +text-sky-700 text-sm +text-violet-700 text-white text-xl text-xs @@ -562,6 +573,7 @@ top-full top-right touch-none tracking-tight +tracking-wide transition-[grid-template-rows] transition-[left,right,width] transition-[width,height,padding] @@ -612,6 +624,7 @@ w-max w-px whitespace-nowrap whitespace-pre-line +whitespace-pre-wrap width: z-10 z-40 diff --git a/src/ShellUI.Templates/ComponentRegistry.cs b/src/ShellUI.Templates/ComponentRegistry.cs index dc9687e..9d3fafc 100644 --- a/src/ShellUI.Templates/ComponentRegistry.cs +++ b/src/ShellUI.Templates/ComponentRegistry.cs @@ -119,6 +119,7 @@ public static class ComponentRegistry { "table-cell", TableCellTemplate.Metadata }, { "form", FormTemplate.Metadata }, { "form-message", FormMessageTemplate.Metadata }, + { "field", FieldTemplate.Metadata }, { "form-description", FormDescriptionTemplate.Metadata }, { "form-control", FormControlTemplate.Metadata }, { "form-label", FormLabelTemplate.Metadata }, @@ -251,6 +252,11 @@ public static class ComponentRegistry { "chat-message", ChatMessageTemplate.Metadata }, { "chat-input", ChatInputTemplate.Metadata }, { "chat", ChatTemplate.Metadata }, + { "prompt-suggestions", PromptSuggestionsTemplate.Metadata }, + { "reasoning", ReasoningTemplate.Metadata }, + { "tool-call", ToolCallTemplate.Metadata }, + { "json-viewer", JsonViewerTemplate.Metadata }, + { "json-viewer-node", JsonViewerNodeTemplate.Metadata }, { "command-models", CommandModelsTemplate.Metadata }, { "stepper-models", StepperModelsTemplate.Metadata }, }; @@ -371,6 +377,7 @@ public static class ComponentRegistry "table-cell" => TableCellTemplate.Content, "form" => FormTemplate.Content, "form-message" => FormMessageTemplate.Content, + "field" => FieldTemplate.Content, "form-description" => FormDescriptionTemplate.Content, "form-control" => FormControlTemplate.Content, "form-label" => FormLabelTemplate.Content, @@ -503,6 +510,11 @@ public static class ComponentRegistry "chat-message" => ChatMessageTemplate.Content, "chat-input" => ChatInputTemplate.Content, "chat" => ChatTemplate.Content, + "prompt-suggestions" => PromptSuggestionsTemplate.Content, + "reasoning" => ReasoningTemplate.Content, + "tool-call" => ToolCallTemplate.Content, + "json-viewer" => JsonViewerTemplate.Content, + "json-viewer-node" => JsonViewerNodeTemplate.Content, "command-models" => CommandModelsTemplate.Content, "stepper-models" => StepperModelsTemplate.Content, _ => null diff --git a/src/ShellUI.Templates/Templates/FieldTemplate.cs b/src/ShellUI.Templates/Templates/FieldTemplate.cs new file mode 100644 index 0000000..2caae04 --- /dev/null +++ b/src/ShellUI.Templates/Templates/FieldTemplate.cs @@ -0,0 +1,89 @@ +using ShellUI.Core.Models; + +namespace ShellUI.Templates.Templates; + +public static class FieldTemplate +{ + public static ComponentMetadata Metadata => new() + { + Name = "field", + DisplayName = "Field", + Description = "Label, control, description and validation message as one unit", + Category = ComponentCategory.Form, + FilePath = "Field.razor", + Dependencies = new List { "form-message" }, + Tags = new List { "form", "field", "label", "validation" } + }; + + public static string Content => @"@namespace YourProjectNamespace.Components.UI +@using System.Linq.Expressions +@using Microsoft.AspNetCore.Components.Forms + + +
+ @if (IsHorizontal) + { +
+ @if (!string.IsNullOrEmpty(Label)) + { + + } + @if (!string.IsNullOrEmpty(Description)) + { +

@Description

+ } + +
+
@ChildContent
+ } + else + { + @if (!string.IsNullOrEmpty(Label)) + { + + } + @ChildContent + @if (!string.IsNullOrEmpty(Description)) + { +

@Description

+ } + + } +
+
+ +@code { + [Parameter] public string? Label { get; set; } + // The id of the control inside, so clicking the label focuses it. + [Parameter] public string? LabelFor { get; set; } + [Parameter] public string? Description { get; set; } + // Shown instead of the EditForm's validation messages for For. + [Parameter] public string? Error { get; set; } + // The model property whose validation messages to show, as in FormField. + [Parameter] public Expression>? For { get; set; } + [Parameter] public bool Required { get; set; } + // ""vertical"" or ""horizontal"" (label and description beside the control, for switches and checkboxes). + [Parameter] public string Orientation { get; set; } = ""vertical""; + [Parameter] public RenderFragment? ChildContent { get; set; } + [Parameter] public string? Class { get; set; } + [Parameter(CaptureUnmatchedValues = true)] + public Dictionary? AdditionalAttributes { get; set; } + + private bool IsHorizontal => string.Equals(Orientation, ""horizontal"", StringComparison.OrdinalIgnoreCase); + + private FieldIdentifier FieldIdentifier => For != null ? FieldIdentifier.Create(For) : default; +} +"; +} diff --git a/src/ShellUI.Templates/Templates/JsonViewerNodeTemplate.cs b/src/ShellUI.Templates/Templates/JsonViewerNodeTemplate.cs new file mode 100644 index 0000000..a4616d3 --- /dev/null +++ b/src/ShellUI.Templates/Templates/JsonViewerNodeTemplate.cs @@ -0,0 +1,102 @@ +using ShellUI.Core.Models; + +namespace ShellUI.Templates.Templates; + +public static class JsonViewerNodeTemplate +{ + public static ComponentMetadata Metadata => new() + { + Name = "json-viewer-node", + DisplayName = "JSON Viewer Node", + Description = "One node of the JSON tree", + Category = ComponentCategory.DataDisplay, + FilePath = "JsonViewerNode.razor", + IsAvailable = false, + Dependencies = new List() + }; + + public static string Content => @"@namespace YourProjectNamespace.Components.UI +@using System.Text.Json + +
+ @if (IsContainer) + { + + @if (_open) + { +
+ @foreach (var (child, name, index) in Children) + { + + } +
+ @(Close)@Comma + } + } + else + { + + @if (Name != null) + { + ""@Name"": + } + @Element.GetRawText()@Comma + + } +
+ +@code { + [Parameter] public JsonElement Element { get; set; } + // The property name, or null for array items and the root. + [Parameter] public string? Name { get; set; } + [Parameter] public int Depth { get; set; } + [Parameter] public int ExpandDepth { get; set; } = 2; + [Parameter] public bool Last { get; set; } = true; + + private bool _open; + + private bool IsObject => Element.ValueKind == JsonValueKind.Object; + private bool IsContainer => IsObject || Element.ValueKind == JsonValueKind.Array; + private int Count => IsObject ? Element.EnumerateObject().Count() : IsContainer ? Element.GetArrayLength() : 0; + private string Open => IsObject ? ""{"" : ""[""; + private string Close => IsObject ? ""}"" : ""]""; + private string Comma => Last ? """" : "",""; + private string Summary => IsObject ? (Count == 1 ? ""1 key"" : $""{Count} keys"") : (Count == 1 ? ""1 item"" : $""{Count} items""); + + private IEnumerable<(JsonElement Child, string? Name, int Index)> Children => IsObject + ? Element.EnumerateObject().Select((p, i) => (p.Value, (string?)p.Name, i)) + : Element.EnumerateArray().Select((e, i) => (e, (string?)null, i)); + + private string ValueClass => Element.ValueKind switch + { + JsonValueKind.String => ""text-emerald-700 dark:text-emerald-400"", + JsonValueKind.Number => ""text-amber-700 dark:text-amber-400"", + JsonValueKind.True or JsonValueKind.False => ""text-violet-700 dark:text-violet-400"", + _ => ""text-muted-foreground"" + }; + + protected override void OnInitialized() => _open = Depth < ExpandDepth; + + private void Toggle() => _open = !_open; +} +"; +} diff --git a/src/ShellUI.Templates/Templates/JsonViewerTemplate.cs b/src/ShellUI.Templates/Templates/JsonViewerTemplate.cs new file mode 100644 index 0000000..7ce5e84 --- /dev/null +++ b/src/ShellUI.Templates/Templates/JsonViewerTemplate.cs @@ -0,0 +1,76 @@ +using ShellUI.Core.Models; + +namespace ShellUI.Templates.Templates; + +public static class JsonViewerTemplate +{ + public static ComponentMetadata Metadata => new() + { + Name = "json-viewer", + DisplayName = "JSON Viewer", + Description = "Collapsible, highlighted JSON tree with copy", + Category = ComponentCategory.DataDisplay, + FilePath = "JsonViewer.razor", + Dependencies = new List { "json-viewer-node", "copy-button" }, + Tags = new List { "json", "tree", "viewer", "code" } + }; + + public static string Content => @"@namespace YourProjectNamespace.Components.UI +@using System.Text.Json + +
+ @if (_error != null) + { +

@_error

+ } + else if (_root is { } root) + { + @if (ShowCopy) + { + + } + @* Keyed on the source so new JSON resets which nodes are open. *@ + + } +
+ +@code { + [Parameter] public string? Json { get; set; } + // Serialized with System.Text.Json when Json is not set. + [Parameter] public object? Value { get; set; } + // Levels open on first render; deeper objects and arrays start collapsed. + [Parameter] public int ExpandDepth { get; set; } = 2; + [Parameter] public bool ShowCopy { get; set; } = true; + [Parameter] public string? Class { get; set; } + [Parameter(CaptureUnmatchedValues = true)] + public Dictionary? AdditionalAttributes { get; set; } + + private static readonly JsonSerializerOptions Indented = new() { WriteIndented = true }; + + private string? _source; + private JsonElement? _root; + private string? _formatted; + private string? _error; + + protected override void OnParametersSet() + { + var source = Json ?? (Value == null ? null : JsonSerializer.Serialize(Value)); + if (source == _source) return; + _source = source; + _root = null; + _error = null; + if (string.IsNullOrWhiteSpace(source)) return; + try + { + using var doc = JsonDocument.Parse(source); + _root = doc.RootElement.Clone(); + _formatted = JsonSerializer.Serialize(_root.Value, Indented); + } + catch (JsonException ex) + { + _error = $""Invalid JSON: {ex.Message}""; + } + } +} +"; +} diff --git a/src/ShellUI.Templates/Templates/PromptSuggestionsTemplate.cs b/src/ShellUI.Templates/Templates/PromptSuggestionsTemplate.cs new file mode 100644 index 0000000..ac5790a --- /dev/null +++ b/src/ShellUI.Templates/Templates/PromptSuggestionsTemplate.cs @@ -0,0 +1,41 @@ +using ShellUI.Core.Models; + +namespace ShellUI.Templates.Templates; + +public static class PromptSuggestionsTemplate +{ + public static ComponentMetadata Metadata => new() + { + Name = "prompt-suggestions", + DisplayName = "Prompt Suggestions", + Description = "Clickable suggestion chips for an empty chat", + Category = ComponentCategory.DataDisplay, + FilePath = "PromptSuggestions.razor", + Dependencies = new List(), + Tags = new List { "chat", "ai", "suggestions", "prompt" } + }; + + public static string Content => @"@namespace YourProjectNamespace.Components.UI + +
+ @foreach (var suggestion in Suggestions) + { + + } +
+ +@code { + [Parameter] public IEnumerable Suggestions { get; set; } = Array.Empty(); + [Parameter] public EventCallback OnSelect { get; set; } + [Parameter] public bool Disabled { get; set; } + [Parameter] public string? Class { get; set; } + [Parameter(CaptureUnmatchedValues = true)] + public Dictionary? AdditionalAttributes { get; set; } +} +"; +} diff --git a/src/ShellUI.Templates/Templates/ReasoningTemplate.cs b/src/ShellUI.Templates/Templates/ReasoningTemplate.cs new file mode 100644 index 0000000..e088076 --- /dev/null +++ b/src/ShellUI.Templates/Templates/ReasoningTemplate.cs @@ -0,0 +1,71 @@ +using ShellUI.Core.Models; + +namespace ShellUI.Templates.Templates; + +public static class ReasoningTemplate +{ + public static ComponentMetadata Metadata => new() + { + Name = "reasoning", + DisplayName = "Reasoning", + Description = "Collapsible block that streams a model's reasoning", + Category = ComponentCategory.DataDisplay, + FilePath = "Reasoning.razor", + Dependencies = new List(), + Tags = new List { "chat", "ai", "reasoning", "thinking", "collapsible" } + }; + + public static string Content => @"@namespace YourProjectNamespace.Components.UI + +
+ + @if (_open) + { +
@(Text)@ChildContent
+ } +
+ +@code { + [Parameter] public string? Text { get; set; } + [Parameter] public RenderFragment? ChildContent { get; set; } + // Opens while streaming and closes when streaming ends. + [Parameter] public bool IsStreaming { get; set; } + // How long the model thought, shown once streaming ends. + [Parameter] public TimeSpan? Duration { get; set; } + // Replaces the ""Thinking…"" / ""Thought for …"" label. + [Parameter] public string? Title { get; set; } + [Parameter] public bool DefaultOpen { get; set; } + [Parameter] public string? Class { get; set; } + [Parameter(CaptureUnmatchedValues = true)] + public Dictionary? AdditionalAttributes { get; set; } + + private bool _open; + private bool? _wasStreaming; + + private string Label => Title ?? (IsStreaming ? ""Thinking…"" : Duration is { } d ? $""Thought for {Seconds(d)}"" : ""Reasoning""); + + private static string Seconds(TimeSpan d) + { + var s = Math.Max(1, (int)Math.Round(d.TotalSeconds)); + return s == 1 ? ""1 second"" : $""{s} seconds""; + } + + protected override void OnParametersSet() + { + if (_wasStreaming == IsStreaming) return; + _open = _wasStreaming == null ? DefaultOpen || IsStreaming : IsStreaming; + _wasStreaming = IsStreaming; + } + + private void Toggle() => _open = !_open; +} +"; +} diff --git a/src/ShellUI.Templates/Templates/ToolCallTemplate.cs b/src/ShellUI.Templates/Templates/ToolCallTemplate.cs new file mode 100644 index 0000000..5739111 --- /dev/null +++ b/src/ShellUI.Templates/Templates/ToolCallTemplate.cs @@ -0,0 +1,110 @@ +using ShellUI.Core.Models; + +namespace ShellUI.Templates.Templates; + +public static class ToolCallTemplate +{ + public static ComponentMetadata Metadata => new() + { + Name = "tool-call", + DisplayName = "Tool Call", + Description = "Collapsible card with a tool's name, arguments, result and running, done or error state", + Category = ComponentCategory.DataDisplay, + FilePath = "ToolCall.razor", + Dependencies = new List(), + Tags = new List { "chat", "ai", "tool", "function-call" } + }; + + public static string Content => @"@namespace YourProjectNamespace.Components.UI + +
+ + @if (_open) + { +
+ @if (!string.IsNullOrEmpty(Arguments)) + { +
+

Arguments

+
@Arguments
+
+ } + @if (!string.IsNullOrEmpty(Result)) + { +
+

Result

+
@Result
+
+ } + @if (!string.IsNullOrEmpty(Error)) + { +
+

Error

+
@Error
+
+ } + @ChildContent +
+ } +
+ +@code { + [Parameter] public string Name { get; set; } = """"; + // ""pending"", ""running"", ""done"" or ""error"". + [Parameter] public string State { get; set; } = ""pending""; + [Parameter] public string? Arguments { get; set; } + [Parameter] public string? Result { get; set; } + [Parameter] public string? Error { get; set; } + [Parameter] public RenderFragment? ChildContent { get; set; } + [Parameter] public bool DefaultOpen { get; set; } + [Parameter] public string? Class { get; set; } + [Parameter(CaptureUnmatchedValues = true)] + public Dictionary? AdditionalAttributes { get; set; } + + private bool _open; + + private string StateKey => State.ToLowerInvariant(); + + private string StateLabel => StateKey switch + { + ""running"" => ""Running"", + ""done"" => ""Done"", + ""error"" => ""Error"", + _ => ""Pending"" + }; + + private string StateClass => StateKey switch + { + ""running"" => ""bg-primary/10 text-primary"", + ""done"" => ""bg-emerald-500/10 text-emerald-600 dark:text-emerald-400"", + ""error"" => ""bg-destructive/10 text-destructive"", + _ => ""bg-muted text-muted-foreground"" + }; + + protected override void OnInitialized() => _open = DefaultOpen; + + private void Toggle() => _open = !_open; +} +"; +} From f0a2243c057175629663ef79c54c93d6db508865 Mon Sep 17 00:00:00 2001 From: Shephard Tseisi Date: Thu, 22 Oct 2026 23:12:40 +0200 Subject: [PATCH 2/4] test: cover the AI chat components, Field and JsonViewer Sync-checks the six new templates and adds behaviour tests: suggestion clicks, Reasoning opening and folding with streaming, ToolCall states and content, Field's label, description and error, and JsonViewer's folding and invalid-JSON message. --- ShellUI.Tests/PackageBehaviorTests.cs | 118 ++++++++++++++++++++++++++ ShellUI.Tests/TemplateSyncTests.cs | 12 +++ 2 files changed, 130 insertions(+) diff --git a/ShellUI.Tests/PackageBehaviorTests.cs b/ShellUI.Tests/PackageBehaviorTests.cs index ab4b685..abe9b08 100644 --- a/ShellUI.Tests/PackageBehaviorTests.cs +++ b/ShellUI.Tests/PackageBehaviorTests.cs @@ -262,4 +262,122 @@ public void ContextMenu_DestructiveItem_IsRed() Assert.DoesNotContain("text-destructive", buttons[0].ClassList); Assert.Contains("text-destructive", buttons[1].ClassList); } + + [Fact] + public void PromptSuggestions_RaisesTheClickedSuggestion() + { + using var ctx = new BunitContext(); + var picked = new List(); + + var chips = ctx.Render(p => p + .Add(c => c.Suggestions, new[] { "Summarise this", "Write a test" }) + .Add(c => c.OnSelect, EventCallback.Factory.Create(this, v => picked.Add(v)))); + + chips.FindAll("button")[1].Click(); + + Assert.Equal(new[] { "Write a test" }, picked); + } + + [Fact] + public void Reasoning_OpensWhileStreamingAndClosesWhenDone() + { + using var ctx = new BunitContext(); + + var reasoning = ctx.Render(p => p + .Add(c => c.IsStreaming, true) + .Add(c => c.Text, "Looking at the data")); + + Assert.Contains("Thinking", reasoning.Find("button").TextContent); + Assert.Contains("Looking at the data", reasoning.Markup); + + reasoning.Render(p => p + .Add(c => c.IsStreaming, false) + .Add(c => c.Duration, TimeSpan.FromSeconds(3))); + + Assert.Contains("Thought for 3 seconds", reasoning.Find("button").TextContent); + Assert.DoesNotContain("Looking at the data", reasoning.Markup); + + reasoning.Find("button").Click(); + Assert.Contains("Looking at the data", reasoning.Markup); + } + + [Theory] + [InlineData("running", "Running", "text-primary")] + [InlineData("done", "Done", "text-emerald-600")] + [InlineData("error", "Error", "text-destructive")] + [InlineData("pending", "Pending", "text-muted-foreground")] + public void ToolCall_ShowsItsState(string state, string label, string colour) + { + using var ctx = new BunitContext(); + + var tool = ctx.Render(p => p.Add(c => c.Name, "search").Add(c => c.State, state)); + + var badge = tool.FindAll("button span").Single(s => s.TextContent.Trim() == label); + Assert.Contains(colour, badge.ClassList); + } + + [Fact] + public void ToolCall_ShowsArgumentsAndResultWhenOpened() + { + using var ctx = new BunitContext(); + + var tool = ctx.Render(p => p + .Add(c => c.Name, "search") + .Add(c => c.Arguments, "{\"q\":\"blazor\"}") + .Add(c => c.Result, "3 results")); + + Assert.DoesNotContain("3 results", tool.Markup); + tool.Find("button").Click(); + + Assert.Contains("{\"q\":\"blazor\"}", tool.Markup); + Assert.Contains("3 results", tool.Markup); + } + + [Fact] + public void Field_LinksTheLabelAndShowsDescriptionAndError() + { + using var ctx = new BunitContext(); + + var field = ctx.Render(p => p + .Add(c => c.Label, "Email") + .Add(c => c.LabelFor, "email") + .Add(c => c.Required, true) + .Add(c => c.Description, "We never share it.") + .Add(c => c.Error, "Email is required.") + .AddChildContent("")); + + Assert.Equal("email", field.Find("label").GetAttribute("for")); + Assert.Contains("*", field.Find("label").TextContent); + Assert.Contains("We never share it.", field.Markup); + Assert.Equal("Email is required.", field.Find("p.text-destructive").TextContent.Trim()); + } + + [Fact] + public void JsonViewer_RendersTheTreeAndCollapsesBeyondExpandDepth() + { + using var ctx = new BunitContext(); + ctx.JSInterop.Mode = JSRuntimeMode.Loose; + + var viewer = ctx.Render(p => p + .Add(c => c.Json, "{\"name\":\"ShellUI\",\"tags\":[\"blazor\",\"ui\"],\"meta\":{\"stars\":42}}") + .Add(c => c.ExpandDepth, 1)); + + Assert.Contains("\"ShellUI\"", viewer.Markup); + Assert.Contains("2 items", viewer.Markup); + Assert.DoesNotContain("42", viewer.Markup); + + viewer.FindAll("button[aria-expanded]").Single(b => b.TextContent.Contains("meta")).Click(); + + Assert.Contains("42", viewer.Markup); + } + + [Fact] + public void JsonViewer_ReportsInvalidJson() + { + using var ctx = new BunitContext(); + + var viewer = ctx.Render(p => p.Add(c => c.Json, "{ nope")); + + Assert.Contains("Invalid JSON", viewer.Find("p.text-destructive").TextContent); + } } diff --git a/ShellUI.Tests/TemplateSyncTests.cs b/ShellUI.Tests/TemplateSyncTests.cs index 617a3d1..52421d4 100644 --- a/ShellUI.Tests/TemplateSyncTests.cs +++ b/ShellUI.Tests/TemplateSyncTests.cs @@ -170,6 +170,12 @@ public class TemplateSyncTests [InlineData("textarea", "Textarea.razor")] [InlineData("sheet", "Sheet.razor")] [InlineData("drawer", "Drawer.razor")] + [InlineData("prompt-suggestions", "PromptSuggestions.razor")] + [InlineData("reasoning", "Reasoning.razor")] + [InlineData("tool-call", "ToolCall.razor")] + [InlineData("field", "Field.razor")] + [InlineData("json-viewer", "JsonViewer.razor")] + [InlineData("json-viewer-node", "JsonViewerNode.razor")] [InlineData("copy-button", "CopyButton.razor")] [InlineData("sidebar-provider", "SidebarProvider.razor")] [InlineData("app-sidebar", "AppSidebar.razor")] @@ -236,6 +242,12 @@ public void TemplateCodeBlock_MatchesLiveLibrary(string templateName, string raz [InlineData("textarea", "Textarea.razor")] [InlineData("sheet", "Sheet.razor")] [InlineData("drawer", "Drawer.razor")] + [InlineData("prompt-suggestions", "PromptSuggestions.razor")] + [InlineData("reasoning", "Reasoning.razor")] + [InlineData("tool-call", "ToolCall.razor")] + [InlineData("field", "Field.razor")] + [InlineData("json-viewer", "JsonViewer.razor")] + [InlineData("json-viewer-node", "JsonViewerNode.razor")] public void TemplateMarkup_MatchesLiveLibrary(string templateName, string razorFileName) { var liveContent = WithoutClassNameAlias(File.ReadAllText(GetLiveRazorPath(razorFileName))); From 60f00290b5aee0d6a857877df484124fb6c59116 Mon Sep 17 00:00:00 2001 From: Shephard Tseisi Date: Thu, 22 Oct 2026 23:12:41 +0200 Subject: [PATCH 3/4] docs: list the new components and correct the registry counts The registry has 252 entries (98 direct, 154 hidden). The docs said 243 because the variants and models templates from #68 were never counted. Adds the missing input, textarea and stepper-models dependency rows. --- README.md | 2 +- docs/ARCHITECTURE.md | 10 +++++----- docs/CLI_SYNTAX.md | 4 ++-- docs/COMPARISON.md | 6 +++--- docs/COMPONENT_DEPENDENCIES.md | 14 +++++++++----- docs/COMPONENT_ROADMAP.md | 14 +++++++------- 6 files changed, 27 insertions(+), 23 deletions(-) diff --git a/README.md b/README.md index 8c03f85..031723c 100644 --- a/README.md +++ b/README.md @@ -36,7 +36,7 @@ ShellUI is pre-1.0, so APIs and generated output can still change between minor ## Capabilities - The CLI commands are `init`, `add`, `list`, `remove`, `update` and `doctor`, plus `theme init`, `theme apply`, and `theme update`. -- The component registry has **243 entries**: **93 direct install targets** and **150 hidden dependency entries**. `list` shows direct targets; `add` resolves hidden dependencies. +- The component registry has **252 entries**: **98 direct install targets** and **154 hidden dependency entries**. `list` shows direct targets; `add` resolves hidden dependencies. - `0.4.0-alpha.1` adds `kbd`, `aspect-ratio`, `button-group`, `toggle-group`, `input-group`, `number-input`, `stat-card`, `timeline`, `tree-view`, `qr-code`, `image-viewer`, `chat`, `chat-message`, `chat-input`, and the `auth-01`, `auth-02` and `auth-03` blocks. - `0.3.0` added `typed-select`, `command-palette`, `data-picker`, `multi-select`, `tag-input`, `donut-chart`, `radar-chart`, and `radial-chart`. - `ShellUI.Components` supports a release-generated precompiled CSS bundle and a generated safelist for existing Tailwind builds. diff --git a/docs/ARCHITECTURE.md b/docs/ARCHITECTURE.md index df6d89c..24f288e 100644 --- a/docs/ARCHITECTURE.md +++ b/docs/ARCHITECTURE.md @@ -11,7 +11,7 @@ This document describes the ShellUI source tree. | Tailwind CSS | `4.3.2` | | Solution | `ShellUI.slnx` | | Solution projects | 6 | -| Registry | 243 entries: 93 direct targets and 150 hidden dependency entries | +| Registry | 252 entries: 98 direct targets and 154 hidden dependency entries | ShellUI is a CLI-first Blazor component library. The CLI copies source into a consumer project, while `ShellUI.Components` is an independent Razor class library (RCL) for consumers who prefer NuGet. @@ -89,13 +89,13 @@ The implemented command tree is: ## Registry Model and Counts -`ComponentRegistry` contains 243 metadata entries: +`ComponentRegistry` contains 252 metadata entries: | Registry classification | Count | Meaning | |---|---:|---| -| Direct targets | 93 | Entries with `IsAvailable = true`; these are the normal targets shown by `shellui list`. | -| Hidden entries | 150 | Entries with `IsAvailable = false`; these are generally installed through a parent target. | -| **Total** | **243** | All registered templates, sub-components, variants, models, services, and assets. | +| Direct targets | 98 | Entries with `IsAvailable = true`; these are the normal targets shown by `shellui list`. | +| Hidden entries | 154 | Entries with `IsAvailable = false`; these are generally installed through a parent target. | +| **Total** | **252** | All registered templates, sub-components, variants, models, services, and assets. | A dependency entry is still real source and is written to the consumer project when the dependency walk reaches it. The two counts describe registry visibility, not two different component libraries. diff --git a/docs/CLI_SYNTAX.md b/docs/CLI_SYNTAX.md index b776b02..396d15f 100644 --- a/docs/CLI_SYNTAX.md +++ b/docs/CLI_SYNTAX.md @@ -1,6 +1,6 @@ # ShellUI CLI Syntax -This reference covers CLI `0.4.0-alpha.3` (prerelease): it runs on .NET 8 or later (`0.4.0-alpha.3` itself needs .NET 10), sets up Blazor projects on .NET 8, 9 and 10, uses Tailwind CSS `4.3.2`, and has 93 direct component targets. Some options, such as `--dashboard`, are not in the stable 0.3.4; see the [v0.3.4 reference](https://github.com/shellui-dev/shellui/blob/v0.3.4/docs/CLI_SYNTAX.md) for that version. +This reference covers CLI `0.4.0-alpha.3` (prerelease): it runs on .NET 8 or later (`0.4.0-alpha.3` itself needs .NET 10), sets up Blazor projects on .NET 8, 9 and 10, uses Tailwind CSS `4.3.2`, and has 98 direct component targets. Some options, such as `--dashboard`, are not in the stable 0.3.4; see the [v0.3.4 reference](https://github.com/shellui-dev/shellui/blob/v0.3.4/docs/CLI_SYNTAX.md) for that version. ## Command prefix @@ -138,7 +138,7 @@ shellui list --installed shellui list --available ``` -There are 93 direct targets. Registry entries used only as dependencies are not counted as direct targets. Choose either `--installed` or `--available` to filter the output. +There are 98 direct targets. Registry entries used only as dependencies are not counted as direct targets. Choose either `--installed` or `--available` to filter the output. ## `remove` diff --git a/docs/COMPARISON.md b/docs/COMPARISON.md index 77d47ea..94fd551 100644 --- a/docs/COMPARISON.md +++ b/docs/COMPARISON.md @@ -6,7 +6,7 @@ This is a qualitative comparison, not a benchmark report. Library features, pack - **Target framework:** .NET 8, 9 and 10 - **Tailwind CSS:** `4.3.2` -- **CLI inventory:** 93 direct targets, 243 registry entries, and 150 hidden entries +- **CLI inventory:** 98 direct targets, 252 registry entries, and 154 hidden entries - **Distribution:** the CLI copies source into an application; the repository also contains the packable `ShellUI.Components` package - **Packaging boundary:** only `ShellUI.CLI` and `ShellUI.Components` are packable. `ShellUI.Core` and `ShellUI.Templates` are internal/non-packable projects. @@ -18,7 +18,7 @@ The direct-target count is the number users invoke with `shellui add`. It is not |---|---|---|---|---|---|---| | Distribution | CLI source-copy workflow; `ShellUI.Components` is packable | NuGet package | NuGet package | NuGet package | NuGet package | NuGet package | | CSS model | Tailwind CSS `4.3.2` | Material-oriented component styling | Project-specific component styling | Provider-based CSS options | Ant Design styling | Project-specific styling | -| Direct component count | 93 CLI targets; 243 registry entries; 150 hidden | Not audited here | Not audited here | Not audited here | Not audited here | Not audited here | +| Direct component count | 98 CLI targets; 252 registry entries; 154 hidden | Not audited here | Not audited here | Not audited here | Not audited here | Not audited here | | Source customization | Copied component source can be edited | Package/API customization | Package/API customization | Package/API customization | Package/API customization | Package/API customization | | CLI workflow | Yes | No CLI in this comparison | No CLI in this comparison | No CLI in this comparison | No CLI in this comparison | No CLI in this comparison | | Accessibility status | Semantic markup is used; no current WCAG conformance claim | Not audited here | Not audited here | Not audited here | Not audited here | Not audited here | @@ -39,7 +39,7 @@ ShellUI templates use Tailwind utility classes and CSS variables. ShellUI pins T ### Registry-driven dependencies -`ComponentRegistry` is authoritative for the 93 direct targets, 150 hidden support entries, source dependencies, and NuGet dependencies. A component's visible sub-components or support files do not imply that it is a standalone package. +`ComponentRegistry` is authoritative for the 98 direct targets, 154 hidden support entries, source dependencies, and NuGet dependencies. A component's visible sub-components or support files do not imply that it is a standalone package. ### Compositional APIs diff --git a/docs/COMPONENT_DEPENDENCIES.md b/docs/COMPONENT_DEPENDENCIES.md index 70262b8..4d4868a 100644 --- a/docs/COMPONENT_DEPENDENCIES.md +++ b/docs/COMPONENT_DEPENDENCIES.md @@ -4,10 +4,10 @@ ## Registry snapshot -- **243** total registry entries -- **93** direct CLI targets (`IsAvailable = true`) -- **150** hidden entries (`IsAvailable = false`) -- `shellui list` displays the 93 direct targets; hidden sub-components, variants, models, services, and support assets are omitted from the public list. +- **252** total registry entries +- **98** direct CLI targets (`IsAvailable = true`) +- **154** hidden entries (`IsAvailable = false`) +- `shellui list` displays the 98 direct targets; hidden sub-components, variants, models, services, and support assets are omitted from the public list. `Dependencies` contains registry-declared source/template dependencies. `NuGetDependencies` is separate and is used by the installer to add package references. A relationship visible in rendered markup is not automatically a registry dependency, so do not infer a dependency graph from component names or visual composition. @@ -45,10 +45,13 @@ The following table summarizes the non-empty `Dependencies` declared by the curr | `drawer` | `drawer-variants`, `drawer-trigger`, `drawer-content`, `drawer-header`, `drawer-title`, `drawer-description`, `drawer-footer`, `drawer-close` | — | | `dropdown` | `dropdown-trigger`, `dropdown-content`, `dropdown-item` | — | | `empty-state` | `button` | — | +| `field` | `form-message` | — | | `file-upload` | `shellui-js` | — | | `form` | `label`, `input`, `button`, `form-field`, `form-item`, `form-label`, `form-control`, `form-description`, `form-message` | — | | `hover-card` | `hover-card-trigger`, `hover-card-content` | — | +| `input` | `input-variants` | — | | `input-otp` | `shellui-js` | — | +| `json-viewer` | `json-viewer-node`, `copy-button` | — | | `line-chart` | `chart` | — | | `menubar` | `menubar-item`, `menubar-menu`, `menubar-trigger`, `menubar-content`, `menubar-separator` | — | | `multi-series-chart` | `chart`, `chart-series` | — | @@ -64,9 +67,10 @@ The following table summarizes the non-empty `Dependencies` declared by the curr | `sheet` | `sheet-variants`, `sheet-trigger`, `sheet-content`, `sheet-header`, `sheet-title`, `sheet-description`, `sheet-footer`, `sheet-close` | — | | `sidebar` | `shell`, `sidebar-models`, `sidebar-provider`, `sidebar-header`, `sidebar-content`, `sidebar-footer`, `sidebar-group`, `sidebar-group-label`, `sidebar-group-content`, `sidebar-menu`, `sidebar-menu-item`, `sidebar-menu-button`, `sidebar-menu-sub`, `sidebar-menu-sub-item`, `sidebar-menu-sub-button`, `sidebar-menu-action`, `sidebar-menu-badge`, `sidebar-separator`, `sidebar-trigger`, `sidebar-inset`, `sidebar-rail` | — | | `sonner` | `sonner-variants`, `sonner-service` | — | -| `stepper` | `stepper-list`, `stepper-step`, `stepper-content` | — | +| `stepper` | `stepper-models`, `stepper-list`, `stepper-step`, `stepper-content` | — | | `table` | `table-header`, `table-body`, `table-row`, `table-cell`, `table-head` | — | | `tabs` | `tabs-list`, `tabs-trigger`, `tabs-content`, `tab-models` | — | +| `textarea` | `textarea-variants` | — | | `theme-toggle` | `shellui-js` | — | | `timeline` | `timeline-item` | — | | `toggle` | `toggle-variants` | — | diff --git a/docs/COMPONENT_ROADMAP.md b/docs/COMPONENT_ROADMAP.md index 95b5b94..b2fe6c3 100644 --- a/docs/COMPONENT_ROADMAP.md +++ b/docs/COMPONENT_ROADMAP.md @@ -14,16 +14,16 @@ Hidden entries are not counted as direct targets. They can still be installed recursively when a parent target declares them. -### Implemented direct targets (93) +### Implemented direct targets (98) The following categories describe the direct targets in the current registry, not a promise about future scope. -- [x] **Form (26):** Button, ButtonGroup, ChatInput, Checkbox, Combobox, DataPicker, DatePicker, DateRangePicker, FileUpload, Form, Input, InputGroup, InputOTP, Label, MultiSelect, NumberInput, RadioGroup, Select, Slider, Switch, TagInput, Textarea, TimePicker, Toggle, ToggleGroup, TypedSelect +- [x] **Form (27):** Button, ButtonGroup, ChatInput, Checkbox, Combobox, DataPicker, DatePicker, DateRangePicker, Field, FileUpload, Form, Input, InputGroup, InputOTP, Label, MultiSelect, NumberInput, RadioGroup, Select, Slider, Switch, TagInput, Textarea, TimePicker, Toggle, ToggleGroup, TypedSelect - [x] **Layout (16):** Accordion, AspectRatio, AuthLayout01, AuthLayout02, AuthLayout03, Breadcrumb, Card, Collapsible, DashboardLayout01, DashboardLayout02, LinkCard, Navbar, Resizable, ScrollArea, Separator, Sidebar - [x] **Feedback (9):** Alert, Callout, EmptyState, Loading, Progress, Skeleton, Sonner, Toast, Tooltip - [x] **Overlay (9):** AlertDialog, Command, CommandPalette, Dialog, Drawer, Dropdown, HoverCard, Popover, Sheet - [x] **Navigation (8):** ContextMenu, Menubar, NavigationMenu, Pagination, PrevNextNav, Stepper, Tabs, TreeView -- [x] **Data Display (21):** AreaChart, Avatar, Badge, BarChart, Calendar, Carousel, Chart, ChartSeries, Chat, ChatMessage, DataTable, DonutChart, LineChart, MultiSeriesChart, PieChart, QrCode, RadarChart, RadialChart, StatCard, Table, Timeline +- [x] **Data Display (25):** AreaChart, Avatar, Badge, BarChart, Calendar, Carousel, Chart, ChartSeries, Chat, ChatMessage, DataTable, DonutChart, JsonViewer, LineChart, MultiSeriesChart, PieChart, PromptSuggestions, QrCode, RadarChart, RadialChart, Reasoning, StatCard, Table, Timeline, ToolCall - [x] **Typography (1):** Kbd - [x] **Media (1):** ImageViewer - [x] **Utility (2):** CopyButton, ThemeToggle @@ -42,6 +42,10 @@ The following categories describe the direct targets in the current registry, no - [x] **QrCode** — QR code rendered as SVG (QRCoder) - [x] **ImageViewer** — thumbnail with zoomable lightbox - [x] **Chat, ChatMessage, ChatInput** — AI chat panel, message bubbles with streaming indicator, and a prompt input (Enter sends, Shift+Enter adds a newline) +- [x] **PromptSuggestions** — clickable suggestion chips for an empty chat +- [x] **Reasoning, ToolCall** — collapsible blocks for streamed model reasoning and tool calls (pending, running, done, error) +- [x] **Field** — label, control, description and validation message as one unit +- [x] **JsonViewer** — collapsible, highlighted JSON tree with copy ## ShellDocs (done) @@ -86,13 +90,10 @@ These are unscheduled ideas. They are not current registry targets, and no date ### AI -- [ ] **PromptSuggestions** — clickable suggestion chips for empty chats -- [ ] **Reasoning / ToolCall** — collapsible blocks for model reasoning and tool results - [ ] **CodeBlock (ShellUI)** — copyable code block for chat responses ### Forms and input -- [ ] **Field** — label, description and validation message wrapper - [ ] **ColorPicker** — swatches and HEX/RGB input - [ ] **Rating** — star rating input - [ ] **SignaturePad** — draw-to-sign canvas @@ -103,7 +104,6 @@ These are unscheduled ideas. They are not current registry targets, and no date - [ ] **InfiniteScroll** — load more on scroll - [ ] **KanbanBoard** — drag-and-drop columns and cards - [ ] **SortableList** — drag-and-drop reordering -- [ ] **JsonViewer** — collapsible JSON tree with copy ### Media From 4fb9477e5736a11c199ba67305073b2db363cbe4 Mon Sep 17 00:00:00 2001 From: Shephard Tseisi Date: Thu, 22 Oct 2026 23:12:42 +0200 Subject: [PATCH 4/4] chore(demo): show the AI chat components, Field and JsonViewer The chat offers suggestions while empty, a Run button streams reasoning into a tool call, and new sections show a validated Field form and a JSON viewer. app.css is rebuilt; it predated the new classes. --- .../Components/Demo/NewComponentsDemo.razor | 104 ++++++++++++++++++ .../Pages/Components/NewComponents.razor | 2 +- .../Components/UI/Field.razor | 70 ++++++++++++ .../Components/UI/FormMessage.razor | 48 ++++++++ .../Components/UI/JsonViewer.razor | 57 ++++++++++ .../Components/UI/JsonViewerNode.razor | 83 ++++++++++++++ .../Components/UI/PromptSuggestions.razor | 22 ++++ .../Components/UI/Reasoning.razor | 52 +++++++++ .../Components/UI/ToolCall.razor | 91 +++++++++++++++ NET10/BlazorInteractiveServer/shellui.json | 57 +++++++++- NET10/BlazorInteractiveServer/wwwroot/app.css | 2 +- 11 files changed, 585 insertions(+), 3 deletions(-) create mode 100644 NET10/BlazorInteractiveServer/Components/UI/Field.razor create mode 100644 NET10/BlazorInteractiveServer/Components/UI/FormMessage.razor create mode 100644 NET10/BlazorInteractiveServer/Components/UI/JsonViewer.razor create mode 100644 NET10/BlazorInteractiveServer/Components/UI/JsonViewerNode.razor create mode 100644 NET10/BlazorInteractiveServer/Components/UI/PromptSuggestions.razor create mode 100644 NET10/BlazorInteractiveServer/Components/UI/Reasoning.razor create mode 100644 NET10/BlazorInteractiveServer/Components/UI/ToolCall.razor diff --git a/NET10/BlazorInteractiveServer/Components/Demo/NewComponentsDemo.razor b/NET10/BlazorInteractiveServer/Components/Demo/NewComponentsDemo.razor index dfc739c..c140a0a 100644 --- a/NET10/BlazorInteractiveServer/Components/Demo/NewComponentsDemo.razor +++ b/NET10/BlazorInteractiveServer/Components/Demo/NewComponentsDemo.razor @@ -29,11 +29,57 @@ }
+ @if (_messages.Count == 1) + { + + }
+
+
+
+

Reasoning & Tool Call

+

Reasoning opens while it streams and folds away when done. The tool call goes from running to done.

+
+ +
+
+ + + +
+
+ +
+

Field

+

Label, control, description and error as one unit. Submit with the email empty to see validation.

+ + + + + + + + +
+ + @if (_signedUp) + { + Subscribed. + } +
+
+
+ +
+

JSON Viewer

+

Two levels open by default. Click a key to fold it, or copy the whole document.

+ +
+

Toggle Group & Button Group

@@ -156,6 +202,64 @@ private const string SampleImage = "data:image/svg+xml;utf8,"; + private readonly string[] _suggestions = { "What is ShellUI?", "Show me a dialog example", "How do I add a theme?" }; + + private string? _reasoning; + private bool _reasoningStreaming; + private TimeSpan? _reasoningTime; + private string _toolState = "pending"; + private string? _toolResult; + private bool _agentRunning; + private const string ToolArguments = "{ \"query\": \"dialog focus trap\", \"limit\": 3 }"; + + private async Task RunAgentAsync() + { + _agentRunning = true; + _reasoning = ""; + _reasoningTime = null; + _toolState = "pending"; + _toolResult = null; + _reasoningStreaming = true; + var started = DateTime.UtcNow; + foreach (var word in "The user wants to know how dialogs keep focus. I should search the docs for the focus trap, then summarise what Tab does inside an open dialog.".Split(' ')) + { + _reasoning += word + " "; + StateHasChanged(); + await Task.Delay(90); + } + _reasoningStreaming = false; + _reasoningTime = DateTime.UtcNow - started; + _toolState = "running"; + StateHasChanged(); + await Task.Delay(1500); + _toolResult = "[\n \"overlays/dialog.md#focus\",\n \"guides/accessibility.md\",\n \"changelog.md#0-3-5\"\n]"; + _toolState = "done"; + _agentRunning = false; + } + + private sealed class SignupModel + { + [System.ComponentModel.DataAnnotations.Required(ErrorMessage = "Email is required.")] + [System.ComponentModel.DataAnnotations.EmailAddress(ErrorMessage = "Enter a valid email address.")] + public string Email { get; set; } = ""; + + public bool Digest { get; set; } = true; + } + + private readonly SignupModel _signup = new(); + private bool _signedUp; + + private readonly object _sampleJson = new + { + name = "ShellUI", + version = "0.4.0-alpha.3", + stable = false, + stars = 42, + targets = new[] { "net8.0", "net10.0" }, + theme = new { radius = "0.5rem", colors = new { primary = "oklch(0.21 0.006 285.88)", destructive = "oklch(0.58 0.24 28.48)" } }, + homepage = (string?)null + }; + private async Task SendAsync(string text) { _messages.Add(("user", text)); diff --git a/NET10/BlazorInteractiveServer/Components/Pages/Components/NewComponents.razor b/NET10/BlazorInteractiveServer/Components/Pages/Components/NewComponents.razor index b5ce4f4..e680b59 100644 --- a/NET10/BlazorInteractiveServer/Components/Pages/Components/NewComponents.razor +++ b/NET10/BlazorInteractiveServer/Components/Pages/Components/NewComponents.razor @@ -8,7 +8,7 @@

New in 0.4

-

Kbd, AspectRatio, ButtonGroup, ToggleGroup, InputGroup, NumberInput, StatCard, Timeline, TreeView, QrCode, ImageViewer and Chat.

+

Kbd, AspectRatio, ButtonGroup, ToggleGroup, InputGroup, NumberInput, StatCard, Timeline, TreeView, QrCode, ImageViewer, Chat, PromptSuggestions, Reasoning, ToolCall, Field and JsonViewer.

diff --git a/NET10/BlazorInteractiveServer/Components/UI/Field.razor b/NET10/BlazorInteractiveServer/Components/UI/Field.razor new file mode 100644 index 0000000..bfaec52 --- /dev/null +++ b/NET10/BlazorInteractiveServer/Components/UI/Field.razor @@ -0,0 +1,70 @@ +@namespace BlazorInteractiveServer.Components.UI +@using System.Linq.Expressions +@using Microsoft.AspNetCore.Components.Forms + + +
+ @if (IsHorizontal) + { +
+ @if (!string.IsNullOrEmpty(Label)) + { + + } + @if (!string.IsNullOrEmpty(Description)) + { +

@Description

+ } + +
+
@ChildContent
+ } + else + { + @if (!string.IsNullOrEmpty(Label)) + { + + } + @ChildContent + @if (!string.IsNullOrEmpty(Description)) + { +

@Description

+ } + + } +
+
+ +@code { + [Parameter] public string? Label { get; set; } + // The id of the control inside, so clicking the label focuses it. + [Parameter] public string? LabelFor { get; set; } + [Parameter] public string? Description { get; set; } + // Shown instead of the EditForm's validation messages for For. + [Parameter] public string? Error { get; set; } + // The model property whose validation messages to show, as in FormField. + [Parameter] public Expression>? For { get; set; } + [Parameter] public bool Required { get; set; } + // "vertical" or "horizontal" (label and description beside the control, for switches and checkboxes). + [Parameter] public string Orientation { get; set; } = "vertical"; + [Parameter] public RenderFragment? ChildContent { get; set; } + [Parameter] public string? Class { get; set; } + [Parameter(CaptureUnmatchedValues = true)] + public Dictionary? AdditionalAttributes { get; set; } + + private bool IsHorizontal => string.Equals(Orientation, "horizontal", StringComparison.OrdinalIgnoreCase); + + private FieldIdentifier FieldIdentifier => For != null ? FieldIdentifier.Create(For) : default; +} diff --git a/NET10/BlazorInteractiveServer/Components/UI/FormMessage.razor b/NET10/BlazorInteractiveServer/Components/UI/FormMessage.razor new file mode 100644 index 0000000..6833745 --- /dev/null +++ b/NET10/BlazorInteractiveServer/Components/UI/FormMessage.razor @@ -0,0 +1,48 @@ +@namespace BlazorInteractiveServer.Components.UI +@using Microsoft.AspNetCore.Components.Forms +@implements IDisposable + +@if (Messages.Length > 0) +{ +

+ @string.Join(", ", Messages) +

+} + +@code { + [CascadingParameter] private EditContext? EditContext { get; set; } + [CascadingParameter(Name = "ShellUIFormField")] private FieldIdentifier Field { get; set; } + [Parameter] public string? Message { get; set; } + [Parameter] public string? FieldName { get; set; } + [Parameter] public string? Class { get; set; } + [Parameter(CaptureUnmatchedValues = true)] + public Dictionary? AdditionalAttributes { get; set; } + + private EditContext? _subscribed; + + private string[] Messages + { + get + { + if (!string.IsNullOrEmpty(Message)) return new[] { Message }; + if (EditContext == null) return Array.Empty(); + var target = string.IsNullOrEmpty(FieldName) ? Field : new FieldIdentifier(EditContext.Model, FieldName); + return target.Model == null ? Array.Empty() : EditContext.GetValidationMessages(target).ToArray(); + } + } + + protected override void OnParametersSet() + { + if (_subscribed == EditContext) return; + if (_subscribed != null) _subscribed.OnValidationStateChanged -= OnValidationStateChanged; + _subscribed = EditContext; + if (_subscribed != null) _subscribed.OnValidationStateChanged += OnValidationStateChanged; + } + + private void OnValidationStateChanged(object? sender, ValidationStateChangedEventArgs e) => InvokeAsync(StateHasChanged); + + public void Dispose() + { + if (_subscribed != null) _subscribed.OnValidationStateChanged -= OnValidationStateChanged; + } +} diff --git a/NET10/BlazorInteractiveServer/Components/UI/JsonViewer.razor b/NET10/BlazorInteractiveServer/Components/UI/JsonViewer.razor new file mode 100644 index 0000000..01cea13 --- /dev/null +++ b/NET10/BlazorInteractiveServer/Components/UI/JsonViewer.razor @@ -0,0 +1,57 @@ +@namespace BlazorInteractiveServer.Components.UI +@using System.Text.Json + +
+ @if (_error != null) + { +

@_error

+ } + else if (_root is { } root) + { + @if (ShowCopy) + { + + } + @* Keyed on the source so new JSON resets which nodes are open. *@ + + } +
+ +@code { + [Parameter] public string? Json { get; set; } + // Serialized with System.Text.Json when Json is not set. + [Parameter] public object? Value { get; set; } + // Levels open on first render; deeper objects and arrays start collapsed. + [Parameter] public int ExpandDepth { get; set; } = 2; + [Parameter] public bool ShowCopy { get; set; } = true; + [Parameter] public string? Class { get; set; } + [Parameter(CaptureUnmatchedValues = true)] + public Dictionary? AdditionalAttributes { get; set; } + + private static readonly JsonSerializerOptions Indented = new() { WriteIndented = true }; + + private string? _source; + private JsonElement? _root; + private string? _formatted; + private string? _error; + + protected override void OnParametersSet() + { + var source = Json ?? (Value == null ? null : JsonSerializer.Serialize(Value)); + if (source == _source) return; + _source = source; + _root = null; + _error = null; + if (string.IsNullOrWhiteSpace(source)) return; + try + { + using var doc = JsonDocument.Parse(source); + _root = doc.RootElement.Clone(); + _formatted = JsonSerializer.Serialize(_root.Value, Indented); + } + catch (JsonException ex) + { + _error = $"Invalid JSON: {ex.Message}"; + } + } +} diff --git a/NET10/BlazorInteractiveServer/Components/UI/JsonViewerNode.razor b/NET10/BlazorInteractiveServer/Components/UI/JsonViewerNode.razor new file mode 100644 index 0000000..b336013 --- /dev/null +++ b/NET10/BlazorInteractiveServer/Components/UI/JsonViewerNode.razor @@ -0,0 +1,83 @@ +@namespace BlazorInteractiveServer.Components.UI +@using System.Text.Json + +
+ @if (IsContainer) + { + + @if (_open) + { +
+ @foreach (var (child, name, index) in Children) + { + + } +
+ @(Close)@Comma + } + } + else + { + + @if (Name != null) + { + "@Name": + } + @Element.GetRawText()@Comma + + } +
+ +@code { + [Parameter] public JsonElement Element { get; set; } + // The property name, or null for array items and the root. + [Parameter] public string? Name { get; set; } + [Parameter] public int Depth { get; set; } + [Parameter] public int ExpandDepth { get; set; } = 2; + [Parameter] public bool Last { get; set; } = true; + + private bool _open; + + private bool IsObject => Element.ValueKind == JsonValueKind.Object; + private bool IsContainer => IsObject || Element.ValueKind == JsonValueKind.Array; + private int Count => IsObject ? Element.EnumerateObject().Count() : IsContainer ? Element.GetArrayLength() : 0; + private string Open => IsObject ? "{" : "["; + private string Close => IsObject ? "}" : "]"; + private string Comma => Last ? "" : ","; + private string Summary => IsObject ? (Count == 1 ? "1 key" : $"{Count} keys") : (Count == 1 ? "1 item" : $"{Count} items"); + + private IEnumerable<(JsonElement Child, string? Name, int Index)> Children => IsObject + ? Element.EnumerateObject().Select((p, i) => (p.Value, (string?)p.Name, i)) + : Element.EnumerateArray().Select((e, i) => (e, (string?)null, i)); + + private string ValueClass => Element.ValueKind switch + { + JsonValueKind.String => "text-emerald-700 dark:text-emerald-400", + JsonValueKind.Number => "text-amber-700 dark:text-amber-400", + JsonValueKind.True or JsonValueKind.False => "text-violet-700 dark:text-violet-400", + _ => "text-muted-foreground" + }; + + protected override void OnInitialized() => _open = Depth < ExpandDepth; + + private void Toggle() => _open = !_open; +} diff --git a/NET10/BlazorInteractiveServer/Components/UI/PromptSuggestions.razor b/NET10/BlazorInteractiveServer/Components/UI/PromptSuggestions.razor new file mode 100644 index 0000000..07e30d9 --- /dev/null +++ b/NET10/BlazorInteractiveServer/Components/UI/PromptSuggestions.razor @@ -0,0 +1,22 @@ +@namespace BlazorInteractiveServer.Components.UI + +
+ @foreach (var suggestion in Suggestions) + { + + } +
+ +@code { + [Parameter] public IEnumerable Suggestions { get; set; } = Array.Empty(); + [Parameter] public EventCallback OnSelect { get; set; } + [Parameter] public bool Disabled { get; set; } + [Parameter] public string? Class { get; set; } + [Parameter(CaptureUnmatchedValues = true)] + public Dictionary? AdditionalAttributes { get; set; } +} diff --git a/NET10/BlazorInteractiveServer/Components/UI/Reasoning.razor b/NET10/BlazorInteractiveServer/Components/UI/Reasoning.razor new file mode 100644 index 0000000..e7be890 --- /dev/null +++ b/NET10/BlazorInteractiveServer/Components/UI/Reasoning.razor @@ -0,0 +1,52 @@ +@namespace BlazorInteractiveServer.Components.UI + +
+ + @if (_open) + { +
@(Text)@ChildContent
+ } +
+ +@code { + [Parameter] public string? Text { get; set; } + [Parameter] public RenderFragment? ChildContent { get; set; } + // Opens while streaming and closes when streaming ends. + [Parameter] public bool IsStreaming { get; set; } + // How long the model thought, shown once streaming ends. + [Parameter] public TimeSpan? Duration { get; set; } + // Replaces the "Thinking…" / "Thought for …" label. + [Parameter] public string? Title { get; set; } + [Parameter] public bool DefaultOpen { get; set; } + [Parameter] public string? Class { get; set; } + [Parameter(CaptureUnmatchedValues = true)] + public Dictionary? AdditionalAttributes { get; set; } + + private bool _open; + private bool? _wasStreaming; + + private string Label => Title ?? (IsStreaming ? "Thinking…" : Duration is { } d ? $"Thought for {Seconds(d)}" : "Reasoning"); + + private static string Seconds(TimeSpan d) + { + var s = Math.Max(1, (int)Math.Round(d.TotalSeconds)); + return s == 1 ? "1 second" : $"{s} seconds"; + } + + protected override void OnParametersSet() + { + if (_wasStreaming == IsStreaming) return; + _open = _wasStreaming == null ? DefaultOpen || IsStreaming : IsStreaming; + _wasStreaming = IsStreaming; + } + + private void Toggle() => _open = !_open; +} diff --git a/NET10/BlazorInteractiveServer/Components/UI/ToolCall.razor b/NET10/BlazorInteractiveServer/Components/UI/ToolCall.razor new file mode 100644 index 0000000..5093a15 --- /dev/null +++ b/NET10/BlazorInteractiveServer/Components/UI/ToolCall.razor @@ -0,0 +1,91 @@ +@namespace BlazorInteractiveServer.Components.UI + +
+ + @if (_open) + { +
+ @if (!string.IsNullOrEmpty(Arguments)) + { +
+

Arguments

+
@Arguments
+
+ } + @if (!string.IsNullOrEmpty(Result)) + { +
+

Result

+
@Result
+
+ } + @if (!string.IsNullOrEmpty(Error)) + { +
+

Error

+
@Error
+
+ } + @ChildContent +
+ } +
+ +@code { + [Parameter] public string Name { get; set; } = ""; + // "pending", "running", "done" or "error". + [Parameter] public string State { get; set; } = "pending"; + [Parameter] public string? Arguments { get; set; } + [Parameter] public string? Result { get; set; } + [Parameter] public string? Error { get; set; } + [Parameter] public RenderFragment? ChildContent { get; set; } + [Parameter] public bool DefaultOpen { get; set; } + [Parameter] public string? Class { get; set; } + [Parameter(CaptureUnmatchedValues = true)] + public Dictionary? AdditionalAttributes { get; set; } + + private bool _open; + + private string StateKey => State.ToLowerInvariant(); + + private string StateLabel => StateKey switch + { + "running" => "Running", + "done" => "Done", + "error" => "Error", + _ => "Pending" + }; + + private string StateClass => StateKey switch + { + "running" => "bg-primary/10 text-primary", + "done" => "bg-emerald-500/10 text-emerald-600 dark:text-emerald-400", + "error" => "bg-destructive/10 text-destructive", + _ => "bg-muted text-muted-foreground" + }; + + protected override void OnInitialized() => _open = DefaultOpen; + + private void Toggle() => _open = !_open; +} diff --git a/NET10/BlazorInteractiveServer/shellui.json b/NET10/BlazorInteractiveServer/shellui.json index 50f573f..530781a 100644 --- a/NET10/BlazorInteractiveServer/shellui.json +++ b/NET10/BlazorInteractiveServer/shellui.json @@ -433,7 +433,7 @@ }, { "Name": "shellui-js", - "Version": "0.3.0-rc.2", + "Version": "0.4.0-alpha.3", "InstalledAt": "2026-09-26T17:01:28.0644172Z", "IsCustomized": false }, @@ -472,6 +472,61 @@ "Version": "0.3.0-rc.2", "InstalledAt": "2026-09-26T18:08:10.295392Z", "IsCustomized": false + }, + { + "Name": "prompt-suggestions", + "Version": "0.4.0-alpha.3", + "InstalledAt": "2026-10-22T20:46:37.5789814Z", + "IsCustomized": false, + "Hash": "b6762d46232eeba7629d42bb9f87aa423fc81c66796ff482989fdaf985eba5c0" + }, + { + "Name": "reasoning", + "Version": "0.4.0-alpha.3", + "InstalledAt": "2026-10-22T20:46:37.5817583Z", + "IsCustomized": false, + "Hash": "e8dab11b6ae7a630bdffb4e2d79d91ef9b886c917e40101a67baad2571d1c612" + }, + { + "Name": "tool-call", + "Version": "0.4.0-alpha.3", + "InstalledAt": "2026-10-22T20:46:37.5831327Z", + "IsCustomized": false, + "Hash": "c1a6b64422c3a0246e9a77c753f4a75ecfaccebb5440513621a5879031aa0bfd" + }, + { + "Name": "form-message", + "Version": "0.4.0-alpha.3", + "InstalledAt": "2026-10-22T20:46:37.5847002Z", + "IsCustomized": false, + "Hash": "1b8d9f7946d86a75225b7621fffd3962d65e77df037f3eca9bbbe72c39589ac9" + }, + { + "Name": "field", + "Version": "0.4.0-alpha.3", + "InstalledAt": "2026-10-22T20:46:37.5875642Z", + "IsCustomized": false, + "Hash": "c81bf713314272c48cfafbb665ccd4a38bf1aeefc59ad43ce32a5dc8c1a05e6b" + }, + { + "Name": "json-viewer-node", + "Version": "0.4.0-alpha.3", + "InstalledAt": "2026-10-22T20:46:37.5900247Z", + "IsCustomized": false, + "Hash": "1d5458f4785f751fd365d01039720627098834b62353f0dea20a8ae77e352aa9" + }, + { + "Name": "copy-button", + "Version": "0.4.0-alpha.3", + "InstalledAt": "2026-10-22T20:46:37.5949889Z", + "IsCustomized": false + }, + { + "Name": "json-viewer", + "Version": "0.4.0-alpha.3", + "InstalledAt": "2026-10-22T20:46:37.5961373Z", + "IsCustomized": false, + "Hash": "3c8be5c6eab39cf83cace12e187720489f44a7b26e246db1aa2992438939a126" } ], "ProjectType": 1 diff --git a/NET10/BlazorInteractiveServer/wwwroot/app.css b/NET10/BlazorInteractiveServer/wwwroot/app.css index 4d6198f..2299f9c 100644 --- a/NET10/BlazorInteractiveServer/wwwroot/app.css +++ b/NET10/BlazorInteractiveServer/wwwroot/app.css @@ -1,2 +1,2 @@ /*! tailwindcss v4.3.2 | MIT License | https://tailwindcss.com */ -@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-scrollbar-thumb:#0000;--tw-scrollbar-track:#0000;--tw-space-y-reverse:0;--tw-space-x-reverse:0;--tw-border-style:solid;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-ordinal:initial;--tw-slashed-zero:initial;--tw-numeric-figure:initial;--tw-numeric-spacing:initial;--tw-numeric-fraction:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-outline-style:solid;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial;--tw-duration:initial;--tw-ease:initial;--tw-scale-x:1;--tw-scale-y:1;--tw-scale-z:1;--tw-content:""}}}@layer theme{:root,:host{--font-sans:var(--font-sans);--font-serif:var(--font-serif);--font-mono:var(--font-mono);--color-red-400:oklch(70.4% .191 22.216);--color-red-500:oklch(63.7% .237 25.331);--color-red-600:oklch(57.7% .245 27.325);--color-red-700:oklch(50.5% .213 27.518);--color-amber-400:oklch(82.8% .189 84.429);--color-amber-500:oklch(76.9% .188 70.08);--color-amber-600:oklch(66.6% .179 58.318);--color-amber-700:oklch(55.5% .163 48.998);--color-yellow-100:oklch(97.3% .071 103.193);--color-yellow-400:oklch(85.2% .199 91.936);--color-yellow-500:oklch(79.5% .184 86.047);--color-yellow-600:oklch(68.1% .162 75.834);--color-yellow-700:oklch(55.4% .135 66.442);--color-yellow-800:oklch(47.6% .114 61.907);--color-yellow-900:oklch(42.1% .095 57.708);--color-green-50:oklch(98.2% .018 155.826);--color-green-100:oklch(96.2% .044 156.743);--color-green-400:oklch(79.2% .209 151.711);--color-green-500:oklch(72.3% .219 149.579);--color-green-600:oklch(62.7% .194 149.214);--color-green-700:oklch(52.7% .154 150.069);--color-green-900:oklch(39.3% .095 152.535);--color-emerald-400:oklch(76.5% .177 163.223);--color-emerald-500:oklch(69.6% .17 162.48);--color-emerald-600:oklch(59.6% .145 163.225);--color-emerald-700:oklch(50.8% .118 165.612);--color-blue-100:oklch(93.2% .032 255.585);--color-blue-400:oklch(70.7% .165 254.624);--color-blue-500:oklch(62.3% .214 259.815);--color-blue-600:oklch(54.6% .245 262.881);--color-blue-700:oklch(48.8% .243 264.376);--color-blue-900:oklch(37.9% .146 265.522);--color-black:#000;--color-white:#fff;--spacing:.25rem;--container-xs:20rem;--container-sm:24rem;--container-md:28rem;--container-lg:32rem;--container-xl:36rem;--container-2xl:42rem;--container-4xl:56rem;--text-xs:.75rem;--text-xs--line-height:calc(1 / .75);--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--text-base:1rem;--text-base--line-height:calc(1.5 / 1);--text-lg:1.125rem;--text-lg--line-height:calc(1.75 / 1.125);--text-xl:1.25rem;--text-xl--line-height:calc(1.75 / 1.25);--text-2xl:1.5rem;--text-2xl--line-height:calc(2 / 1.5);--text-3xl:1.875rem;--text-3xl--line-height:calc(2.25 / 1.875);--text-4xl:2.25rem;--text-4xl--line-height:calc(2.5 / 2.25);--text-5xl:3rem;--text-5xl--line-height:1;--font-weight-normal:400;--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--tracking-tight:-.025em;--leading-tight:1.25;--leading-relaxed:1.625;--shadow-2xs:var(--shadow-2xs);--shadow-xs:var(--shadow-xs);--shadow-sm:var(--shadow-sm);--shadow-md:var(--shadow-md);--shadow-lg:var(--shadow-lg);--shadow-xl:var(--shadow-xl);--shadow-2xl:var(--shadow-2xl);--ease-out:cubic-bezier(0, 0, .2, 1);--ease-in-out:cubic-bezier(.4, 0, .2, 1);--animate-spin:spin 1s linear infinite;--animate-pulse:pulse 2s cubic-bezier(.4, 0, .6, 1) infinite;--animate-bounce:bounce 1s infinite;--blur-sm:8px;--blur-md:12px;--aspect-video:16 / 9;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono);--shadow:var(--shadow)}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab, red, red)){::placeholder{color:color-mix(in oklab, currentcolor 50%, transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}@supports (color:color-mix(in lab, red, red)){*{outline-color:color-mix(in oklab, var(--ring) 50%, transparent)}}h1:focus{outline:none}*{border-color:var(--border);outline-color:var(--ring)}@supports (color:color-mix(in lab, red, red)){*{outline-color:color-mix(in oklab, var(--ring) 50%, transparent)}}body{background-color:var(--background);color:var(--foreground)}}@layer components;@layer utilities{.pointer-events-auto{pointer-events:auto}.pointer-events-none{pointer-events:none}.collapse{visibility:collapse}.visible{visibility:visible}.sr-only{clip-path:inset(50%);white-space:nowrap;border-width:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.static{position:static}.sticky{position:sticky}.inset-0{inset:0}.inset-x-0{inset-inline:0}.inset-y-0{inset-block:0}.top-0{top:0}.top-1\.5{top:calc(var(--spacing) * 1.5)}.top-1\/2{top:50%}.top-2{top:calc(var(--spacing) * 2)}.top-4{top:calc(var(--spacing) * 4)}.top-5{top:calc(var(--spacing) * 5)}.top-8{top:calc(var(--spacing) * 8)}.top-\[1px\]{top:1px}.top-\[15vh\]{top:15vh}.top-\[50\%\]{top:50%}.top-full{top:100%}.right-0{right:0}.right-1{right:var(--spacing)}.right-2{right:calc(var(--spacing) * 2)}.right-4{right:calc(var(--spacing) * 4)}.right-full{right:100%}.bottom-0{bottom:0}.bottom-4{bottom:calc(var(--spacing) * 4)}.bottom-full{bottom:100%}.left-0{left:0}.left-1\/2{left:50%}.left-2{left:calc(var(--spacing) * 2)}.left-3\.5{left:calc(var(--spacing) * 3.5)}.left-4{left:calc(var(--spacing) * 4)}.left-\[50\%\]{left:50%}.left-full{left:100%}.isolate{isolation:isolate}.z-10{z-index:10}.z-20{z-index:20}.z-40{z-index:40}.z-50{z-index:50}.container{width:100%}@media (min-width:40rem){.container{max-width:40rem}}@media (min-width:48rem){.container{max-width:48rem}}@media (min-width:64rem){.container{max-width:64rem}}@media (min-width:80rem){.container{max-width:80rem}}@media (min-width:96rem){.container{max-width:96rem}}.-mx-2{margin-inline:calc(var(--spacing) * -2)}.mx-2{margin-inline:calc(var(--spacing) * 2)}.mx-3\.5{margin-inline:calc(var(--spacing) * 3.5)}.mx-4{margin-inline:calc(var(--spacing) * 4)}.mx-auto{margin-inline:auto}.my-1{margin-block:var(--spacing)}.my-4{margin-block:calc(var(--spacing) * 4)}.my-6{margin-block:calc(var(--spacing) * 6)}.-mt-20{margin-top:calc(var(--spacing) * -20)}.mt-0\.5{margin-top:calc(var(--spacing) * .5)}.mt-1{margin-top:var(--spacing)}.mt-2{margin-top:calc(var(--spacing) * 2)}.mt-3{margin-top:calc(var(--spacing) * 3)}.mt-4{margin-top:calc(var(--spacing) * 4)}.mt-6{margin-top:calc(var(--spacing) * 6)}.mt-8{margin-top:calc(var(--spacing) * 8)}.mt-10{margin-top:calc(var(--spacing) * 10)}.mt-12{margin-top:calc(var(--spacing) * 12)}.mt-24{margin-top:calc(var(--spacing) * 24)}.mt-auto{margin-top:auto}.mr-2{margin-right:calc(var(--spacing) * 2)}.mr-3{margin-right:calc(var(--spacing) * 3)}.-mb-20{margin-bottom:calc(var(--spacing) * -20)}.mb-1{margin-bottom:var(--spacing)}.mb-2{margin-bottom:calc(var(--spacing) * 2)}.mb-3{margin-bottom:calc(var(--spacing) * 3)}.mb-4{margin-bottom:calc(var(--spacing) * 4)}.mb-6{margin-bottom:calc(var(--spacing) * 6)}.mb-8{margin-bottom:calc(var(--spacing) * 8)}.mb-24{margin-bottom:calc(var(--spacing) * 24)}.-ml-1{margin-left:calc(var(--spacing) * -1)}.ml-1{margin-left:var(--spacing)}.ml-2{margin-left:calc(var(--spacing) * 2)}.ml-4{margin-left:calc(var(--spacing) * 4)}.ml-64{margin-left:calc(var(--spacing) * 64)}.ml-auto{margin-left:auto}.block{display:block}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline{display:inline}.inline-block{display:inline-block}.inline-flex{display:inline-flex}.table{display:table}.table-cell{display:table-cell}.table-row{display:table-row}.aspect-square{aspect-ratio:1}.aspect-video{aspect-ratio:var(--aspect-video)}.size-4{width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}.size-8{width:calc(var(--spacing) * 8);height:calc(var(--spacing) * 8)}.h-1\.5{height:calc(var(--spacing) * 1.5)}.h-1\/2{height:50%}.h-2{height:calc(var(--spacing) * 2)}.h-2\.5{height:calc(var(--spacing) * 2.5)}.h-3{height:calc(var(--spacing) * 3)}.h-3\.5{height:calc(var(--spacing) * 3.5)}.h-4{height:calc(var(--spacing) * 4)}.h-5{height:calc(var(--spacing) * 5)}.h-6{height:calc(var(--spacing) * 6)}.h-7{height:calc(var(--spacing) * 7)}.h-8{height:calc(var(--spacing) * 8)}.h-9{height:calc(var(--spacing) * 9)}.h-10{height:calc(var(--spacing) * 10)}.h-11{height:calc(var(--spacing) * 11)}.h-12{height:calc(var(--spacing) * 12)}.h-14{height:calc(var(--spacing) * 14)}.h-16{height:calc(var(--spacing) * 16)}.h-20{height:calc(var(--spacing) * 20)}.h-24{height:calc(var(--spacing) * 24)}.h-32{height:calc(var(--spacing) * 32)}.h-64{height:calc(var(--spacing) * 64)}.h-96{height:calc(var(--spacing) * 96)}.h-\[1px\]{height:1px}.h-auto{height:auto}.h-full{height:100%}.h-px{height:1px}.h-svh{height:100svh}.max-h-48{max-height:calc(var(--spacing) * 48)}.max-h-60{max-height:calc(var(--spacing) * 60)}.max-h-\[90vh\]{max-height:90vh}.max-h-\[min\(360px\,55vh\)\]{max-height:min(360px,55vh)}.max-h-screen{max-height:100vh}.\!min-h-0{min-height:0!important}.min-h-0{min-height:0}.min-h-7{min-height:calc(var(--spacing) * 7)}.min-h-8{min-height:calc(var(--spacing) * 8)}.min-h-10{min-height:calc(var(--spacing) * 10)}.min-h-\[50vh\]{min-height:50vh}.min-h-\[60px\]{min-height:60px}.min-h-\[80px\]{min-height:80px}.min-h-\[160px\]{min-height:160px}.min-h-\[420px\]{min-height:420px}.min-h-screen{min-height:100vh}.min-h-svh{min-height:100svh}.w-1\.5{width:calc(var(--spacing) * 1.5)}.w-1\/2{width:50%}.w-2{width:calc(var(--spacing) * 2)}.w-2\.5{width:calc(var(--spacing) * 2.5)}.w-2\/3{width:66.6667%}.w-2\/5{width:40%}.w-3{width:calc(var(--spacing) * 3)}.w-3\.5{width:calc(var(--spacing) * 3.5)}.w-3\/4{width:75%}.w-4{width:calc(var(--spacing) * 4)}.w-5{width:calc(var(--spacing) * 5)}.w-6{width:calc(var(--spacing) * 6)}.w-7{width:calc(var(--spacing) * 7)}.w-8{width:calc(var(--spacing) * 8)}.w-9{width:calc(var(--spacing) * 9)}.w-10{width:calc(var(--spacing) * 10)}.w-11{width:calc(var(--spacing) * 11)}.w-12{width:calc(var(--spacing) * 12)}.w-16{width:calc(var(--spacing) * 16)}.w-24{width:calc(var(--spacing) * 24)}.w-56{width:calc(var(--spacing) * 56)}.w-64{width:calc(var(--spacing) * 64)}.w-72{width:calc(var(--spacing) * 72)}.w-80{width:calc(var(--spacing) * 80)}.w-\[1px\]{width:1px}.w-\[70px\]{width:70px}.w-\[100px\]{width:100px}.w-\[380px\]{width:380px}.w-\[calc\(100\%-2rem\)\]{width:calc(100% - 2rem)}.w-auto{width:auto}.w-fit{width:fit-content}.w-full{width:100%}.w-max{width:max-content}.w-px{width:1px}.max-w-2xl{max-width:var(--container-2xl)}.max-w-4xl{max-width:var(--container-4xl)}.max-w-\[80\%\]{max-width:80%}.max-w-\[90vw\]{max-width:90vw}.max-w-\[400px\]{max-width:400px}.max-w-lg{max-width:var(--container-lg)}.max-w-max{max-width:max-content}.max-w-md{max-width:var(--container-md)}.max-w-sm{max-width:var(--container-sm)}.max-w-xl{max-width:var(--container-xl)}.max-w-xs{max-width:var(--container-xs)}.min-w-0{min-width:0}.min-w-5{min-width:calc(var(--spacing) * 5)}.min-w-8{min-width:calc(var(--spacing) * 8)}.min-w-9{min-width:calc(var(--spacing) * 9)}.min-w-24{min-width:calc(var(--spacing) * 24)}.min-w-\[8rem\]{min-width:8rem}.min-w-\[640px\]{min-width:640px}.flex-1{flex:1}.flex-shrink-0,.shrink-0{flex-shrink:0}.caption-bottom{caption-side:bottom}.origin-top-right{transform-origin:100% 0}.-translate-x-1\/2{--tw-translate-x:calc(calc(1 / 2 * 100%) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.-translate-x-px{--tw-translate-x:-1px;translate:var(--tw-translate-x) var(--tw-translate-y)}.translate-x-0{--tw-translate-x:0;translate:var(--tw-translate-x) var(--tw-translate-y)}.translate-x-5{--tw-translate-x:calc(var(--spacing) * 5);translate:var(--tw-translate-x) var(--tw-translate-y)}.translate-x-\[-50\%\]{--tw-translate-x:-50%;translate:var(--tw-translate-x) var(--tw-translate-y)}.translate-x-px{--tw-translate-x:1px;translate:var(--tw-translate-x) var(--tw-translate-y)}.-translate-y-1\/2{--tw-translate-y:calc(calc(1 / 2 * 100%) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.translate-y-\[-50\%\]{--tw-translate-y:-50%;translate:var(--tw-translate-x) var(--tw-translate-y)}.scale-\[1\.02\]{scale:1.02}.rotate-90{rotate:90deg}.rotate-180{rotate:180deg}.transform{transform:var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)}.animate-bounce{animation:var(--animate-bounce)}.animate-pulse{animation:var(--animate-pulse)}.animate-spin{animation:var(--animate-spin)}.cursor-default{cursor:default}.cursor-not-allowed{cursor:not-allowed}.cursor-pointer{cursor:pointer}.touch-none{touch-action:none}.resize{resize:both}.resize-none{resize:none}.scrollbar-thin{scrollbar-width:thin}.scrollbar-thumb-border{--tw-scrollbar-thumb:var(--border);scrollbar-color:var(--tw-scrollbar-thumb) var(--tw-scrollbar-track)}.scrollbar-track-transparent{--tw-scrollbar-track:transparent;scrollbar-color:var(--tw-scrollbar-thumb) var(--tw-scrollbar-track)}.list-inside{list-style-position:inside}.list-disc{list-style-type:disc}.list-none{list-style-type:none}.\[appearance\:textfield\]{appearance:textfield}.appearance-none{appearance:none}.auto-rows-min{grid-auto-rows:min-content}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.grid-cols-5{grid-template-columns:repeat(5,minmax(0,1fr))}.grid-cols-7{grid-template-columns:repeat(7,minmax(0,1fr))}.grid-rows-\[0fr\]{grid-template-rows:0fr}.flex-col{flex-direction:column}.flex-col-reverse{flex-direction:column-reverse}.flex-row{flex-direction:row}.flex-row-reverse{flex-direction:row-reverse}.flex-wrap{flex-wrap:wrap}.items-baseline{align-items:baseline}.items-center{align-items:center}.items-end{align-items:flex-end}.items-start{align-items:flex-start}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.justify-end{justify-content:flex-end}.gap-0{gap:0}.gap-0\.5{gap:calc(var(--spacing) * .5)}.gap-1{gap:var(--spacing)}.gap-1\.5{gap:calc(var(--spacing) * 1.5)}.gap-2{gap:calc(var(--spacing) * 2)}.gap-3{gap:calc(var(--spacing) * 3)}.gap-4{gap:calc(var(--spacing) * 4)}.gap-6{gap:calc(var(--spacing) * 6)}.gap-8{gap:calc(var(--spacing) * 8)}:where(.space-y-0>:not(:last-child)){--tw-space-y-reverse:0;margin-block:0}:where(.space-y-0\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * .5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * .5) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-1>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(var(--spacing) * var(--tw-space-y-reverse));margin-block-end:calc(var(--spacing) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-1\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 1.5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 1.5) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-2>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 2) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 2) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-3>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 3) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 3) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-4>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 4) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 4) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-6>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 6) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 6) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-8>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 8) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 8) * calc(1 - var(--tw-space-y-reverse)))}.gap-x-2{column-gap:calc(var(--spacing) * 2)}:where(.space-x-1>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(var(--spacing) * var(--tw-space-x-reverse));margin-inline-end:calc(var(--spacing) * calc(1 - var(--tw-space-x-reverse)))}:where(.space-x-2>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing) * 2) * var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing) * 2) * calc(1 - var(--tw-space-x-reverse)))}:where(.space-x-4>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing) * 4) * var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing) * 4) * calc(1 - var(--tw-space-x-reverse)))}:where(.space-x-6>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing) * 6) * var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing) * 6) * calc(1 - var(--tw-space-x-reverse)))}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-x-hidden{overflow-x:hidden}.overflow-y-auto{overflow-y:auto}.overscroll-contain{overscroll-behavior:contain}.\[border-radius\:var\(--radius\)\]{border-radius:var(--radius)}.rounded{border-radius:.25rem}.rounded-\[2px\]{border-radius:2px}.rounded-full{border-radius:3.40282e38px}.rounded-lg{border-radius:var(--radius)}.rounded-md{border-radius:calc(var(--radius) - 2px)}.rounded-sm{border-radius:calc(var(--radius) - 4px)}.rounded-xl{border-radius:calc(var(--radius) + 4px)}.rounded-t-\[10px\]{border-top-left-radius:10px;border-top-right-radius:10px}.rounded-b-\[10px\]{border-bottom-right-radius:10px;border-bottom-left-radius:10px}.rounded-b-xl{border-bottom-right-radius:calc(var(--radius) + 4px);border-bottom-left-radius:calc(var(--radius) + 4px)}.border{border-style:var(--tw-border-style);border-width:1px}.border-0{border-style:var(--tw-border-style);border-width:0}.border-2{border-style:var(--tw-border-style);border-width:2px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-r{border-right-style:var(--tw-border-style);border-right-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-l{border-left-style:var(--tw-border-style);border-left-width:1px}.border-dashed{--tw-border-style:dashed;border-style:dashed}.border-border,.border-border\/40{border-color:var(--border)}@supports (color:color-mix(in lab, red, red)){.border-border\/40{border-color:color-mix(in oklab, var(--border) 40%, transparent)}}.border-destructive{border-color:var(--destructive)}.border-green-500{border-color:var(--color-green-500)}.border-input{border-color:var(--input)}.border-muted{border-color:var(--muted)}.border-primary,.border-primary\/40{border-color:var(--primary)}@supports (color:color-mix(in lab, red, red)){.border-primary\/40{border-color:color-mix(in oklab, var(--primary) 40%, transparent)}}.border-ring{border-color:var(--ring)}.border-sidebar-border{border-color:var(--sidebar-border)}.border-transparent{border-color:#0000}.bg-accent,.bg-accent\/30{background-color:var(--accent)}@supports (color:color-mix(in lab, red, red)){.bg-accent\/30{background-color:color-mix(in oklab, var(--accent) 30%, transparent)}}.bg-accent\/50{background-color:var(--accent)}@supports (color:color-mix(in lab, red, red)){.bg-accent\/50{background-color:color-mix(in oklab, var(--accent) 50%, transparent)}}.bg-amber-500\/5{background-color:#f99c000d}@supports (color:color-mix(in lab, red, red)){.bg-amber-500\/5{background-color:color-mix(in oklab, var(--color-amber-500) 5%, transparent)}}.bg-background,.bg-background\/80{background-color:var(--background)}@supports (color:color-mix(in lab, red, red)){.bg-background\/80{background-color:color-mix(in oklab, var(--background) 80%, transparent)}}.bg-background\/95{background-color:var(--background)}@supports (color:color-mix(in lab, red, red)){.bg-background\/95{background-color:color-mix(in oklab, var(--background) 95%, transparent)}}.bg-black\/50{background-color:#00000080}@supports (color:color-mix(in lab, red, red)){.bg-black\/50{background-color:color-mix(in oklab, var(--color-black) 50%, transparent)}}.bg-black\/80{background-color:#000c}@supports (color:color-mix(in lab, red, red)){.bg-black\/80{background-color:color-mix(in oklab, var(--color-black) 80%, transparent)}}.bg-blue-500{background-color:var(--color-blue-500)}.bg-blue-500\/5{background-color:#3080ff0d}@supports (color:color-mix(in lab, red, red)){.bg-blue-500\/5{background-color:color-mix(in oklab, var(--color-blue-500) 5%, transparent)}}.bg-blue-500\/20{background-color:#3080ff33}@supports (color:color-mix(in lab, red, red)){.bg-blue-500\/20{background-color:color-mix(in oklab, var(--color-blue-500) 20%, transparent)}}.bg-border{background-color:var(--border)}.bg-card,.bg-card\/50{background-color:var(--card)}@supports (color:color-mix(in lab, red, red)){.bg-card\/50{background-color:color-mix(in oklab, var(--card) 50%, transparent)}}.bg-current{background-color:currentColor}.bg-destructive{background-color:var(--destructive)}.bg-emerald-500\/5{background-color:#00bb7f0d}@supports (color:color-mix(in lab, red, red)){.bg-emerald-500\/5{background-color:color-mix(in oklab, var(--color-emerald-500) 5%, transparent)}}.bg-emerald-500\/10{background-color:#00bb7f1a}@supports (color:color-mix(in lab, red, red)){.bg-emerald-500\/10{background-color:color-mix(in oklab, var(--color-emerald-500) 10%, transparent)}}.bg-green-50{background-color:var(--color-green-50)}.bg-green-500{background-color:var(--color-green-500)}.bg-green-500\/20{background-color:#00c75833}@supports (color:color-mix(in lab, red, red)){.bg-green-500\/20{background-color:color-mix(in oklab, var(--color-green-500) 20%, transparent)}}.bg-input{background-color:var(--input)}.bg-muted{background-color:var(--muted)}.bg-muted-foreground{background-color:var(--muted-foreground)}.bg-muted\/30{background-color:var(--muted)}@supports (color:color-mix(in lab, red, red)){.bg-muted\/30{background-color:color-mix(in oklab, var(--muted) 30%, transparent)}}.bg-muted\/40{background-color:var(--muted)}@supports (color:color-mix(in lab, red, red)){.bg-muted\/40{background-color:color-mix(in oklab, var(--muted) 40%, transparent)}}.bg-muted\/50{background-color:var(--muted)}@supports (color:color-mix(in lab, red, red)){.bg-muted\/50{background-color:color-mix(in oklab, var(--muted) 50%, transparent)}}.bg-popover{background-color:var(--popover)}.bg-primary,.bg-primary\/5{background-color:var(--primary)}@supports (color:color-mix(in lab, red, red)){.bg-primary\/5{background-color:color-mix(in oklab, var(--primary) 5%, transparent)}}.bg-primary\/10{background-color:var(--primary)}@supports (color:color-mix(in lab, red, red)){.bg-primary\/10{background-color:color-mix(in oklab, var(--primary) 10%, transparent)}}.bg-primary\/20{background-color:var(--primary)}@supports (color:color-mix(in lab, red, red)){.bg-primary\/20{background-color:color-mix(in oklab, var(--primary) 20%, transparent)}}.bg-red-500\/5{background-color:#fb2c360d}@supports (color:color-mix(in lab, red, red)){.bg-red-500\/5{background-color:color-mix(in oklab, var(--color-red-500) 5%, transparent)}}.bg-red-500\/10{background-color:#fb2c361a}@supports (color:color-mix(in lab, red, red)){.bg-red-500\/10{background-color:color-mix(in oklab, var(--color-red-500) 10%, transparent)}}.bg-secondary{background-color:var(--secondary)}.bg-sidebar{background-color:var(--sidebar)}.bg-sidebar-accent{background-color:var(--sidebar-accent)}.bg-sidebar-border{background-color:var(--sidebar-border)}.bg-sidebar-primary{background-color:var(--sidebar-primary)}.bg-transparent{background-color:#0000}.bg-white\/10{background-color:#ffffff1a}@supports (color:color-mix(in lab, red, red)){.bg-white\/10{background-color:color-mix(in oklab, var(--color-white) 10%, transparent)}}.bg-yellow-500{background-color:var(--color-yellow-500)}.bg-yellow-500\/20{background-color:#edb20033}@supports (color:color-mix(in lab, red, red)){.bg-yellow-500\/20{background-color:color-mix(in oklab, var(--color-yellow-500) 20%, transparent)}}.fill-primary-foreground{fill:var(--primary-foreground)}.object-contain{object-fit:contain}.object-cover{object-fit:cover}.p-0{padding:0}.p-0\.5{padding:calc(var(--spacing) * .5)}.p-1{padding:var(--spacing)}.p-1\.5{padding:calc(var(--spacing) * 1.5)}.p-2{padding:calc(var(--spacing) * 2)}.p-3{padding:calc(var(--spacing) * 3)}.p-4{padding:calc(var(--spacing) * 4)}.p-6{padding:calc(var(--spacing) * 6)}.p-8{padding:calc(var(--spacing) * 8)}.p-\[3px\]{padding:3px}.px-1{padding-inline:var(--spacing)}.px-1\.5{padding-inline:calc(var(--spacing) * 1.5)}.px-2{padding-inline:calc(var(--spacing) * 2)}.px-2\.5{padding-inline:calc(var(--spacing) * 2.5)}.px-3{padding-inline:calc(var(--spacing) * 3)}.px-4{padding-inline:calc(var(--spacing) * 4)}.px-5{padding-inline:calc(var(--spacing) * 5)}.px-8{padding-inline:calc(var(--spacing) * 8)}.py-0\.5{padding-block:calc(var(--spacing) * .5)}.py-1{padding-block:var(--spacing)}.py-1\.5{padding-block:calc(var(--spacing) * 1.5)}.py-2{padding-block:calc(var(--spacing) * 2)}.py-3{padding-block:calc(var(--spacing) * 3)}.py-4{padding-block:calc(var(--spacing) * 4)}.py-6{padding-block:calc(var(--spacing) * 6)}.py-10{padding-block:calc(var(--spacing) * 10)}.py-12{padding-block:calc(var(--spacing) * 12)}.pt-0{padding-top:0}.pt-2{padding-top:calc(var(--spacing) * 2)}.pt-3{padding-top:calc(var(--spacing) * 3)}.pt-6{padding-top:calc(var(--spacing) * 6)}.pr-2{padding-right:calc(var(--spacing) * 2)}.pr-2\.5{padding-right:calc(var(--spacing) * 2.5)}.pr-3{padding-right:calc(var(--spacing) * 3)}.pr-6{padding-right:calc(var(--spacing) * 6)}.pr-8{padding-right:calc(var(--spacing) * 8)}.pr-9{padding-right:calc(var(--spacing) * 9)}.pb-0\.5{padding-bottom:calc(var(--spacing) * .5)}.pb-1{padding-bottom:var(--spacing)}.pb-4{padding-bottom:calc(var(--spacing) * 4)}.pb-8{padding-bottom:calc(var(--spacing) * 8)}.pl-2{padding-left:calc(var(--spacing) * 2)}.pl-2\.5{padding-left:calc(var(--spacing) * 2.5)}.pl-3{padding-left:calc(var(--spacing) * 3)}.pl-4{padding-left:calc(var(--spacing) * 4)}.pl-8{padding-left:calc(var(--spacing) * 8)}.text-center{text-align:center}.text-left{text-align:left}.text-right{text-align:right}.align-middle{vertical-align:middle}.font-mono{font-family:var(--font-mono)}.text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.text-3xl{font-size:var(--text-3xl);line-height:var(--tw-leading,var(--text-3xl--line-height))}.text-5xl{font-size:var(--text-5xl);line-height:var(--tw-leading,var(--text-5xl--line-height))}.text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xl{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.text-\[8px\]{font-size:8px}.text-\[10px\]{font-size:10px}.text-\[11px\]{font-size:11px}.leading-none{--tw-leading:1;line-height:1}.leading-relaxed{--tw-leading:var(--leading-relaxed);line-height:var(--leading-relaxed)}.leading-tight{--tw-leading:var(--leading-tight);line-height:var(--leading-tight)}.font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-normal{--tw-font-weight:var(--font-weight-normal);font-weight:var(--font-weight-normal)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-tight{--tw-tracking:var(--tracking-tight);letter-spacing:var(--tracking-tight)}.break-words{overflow-wrap:break-word}.whitespace-nowrap{white-space:nowrap}.whitespace-pre-line{white-space:pre-line}.text-accent-foreground{color:var(--accent-foreground)}.text-amber-700{color:var(--color-amber-700)}.text-blue-700{color:var(--color-blue-700)}.text-card-foreground{color:var(--card-foreground)}.text-destructive{color:var(--destructive)}.text-destructive-foreground{color:var(--destructive-foreground)}.text-emerald-500{color:var(--color-emerald-500)}.text-emerald-600{color:var(--color-emerald-600)}.text-emerald-700{color:var(--color-emerald-700)}.text-foreground,.text-foreground\/70{color:var(--foreground)}@supports (color:color-mix(in lab, red, red)){.text-foreground\/70{color:color-mix(in oklab, var(--foreground) 70%, transparent)}}.text-green-700{color:var(--color-green-700)}.text-green-900{color:var(--color-green-900)}.text-muted-foreground{color:var(--muted-foreground)}.text-popover-foreground{color:var(--popover-foreground)}.text-primary{color:var(--primary)}.text-primary-foreground{color:var(--primary-foreground)}.text-red-600{color:var(--color-red-600)}.text-red-700{color:var(--color-red-700)}.text-secondary-foreground{color:var(--secondary-foreground)}.text-sidebar-accent-foreground{color:var(--sidebar-accent-foreground)}.text-sidebar-foreground,.text-sidebar-foreground\/70{color:var(--sidebar-foreground)}@supports (color:color-mix(in lab, red, red)){.text-sidebar-foreground\/70{color:color-mix(in oklab, var(--sidebar-foreground) 70%, transparent)}}.text-sidebar-primary-foreground{color:var(--sidebar-primary-foreground)}.text-white{color:var(--color-white)}.text-yellow-700{color:var(--color-yellow-700)}.text-yellow-800{color:var(--color-yellow-800)}.italic{font-style:italic}.tabular-nums{--tw-numeric-spacing:tabular-nums;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,)}.underline{text-decoration-line:underline}.underline-offset-4{text-underline-offset:4px}.opacity-0{opacity:0}.opacity-25{opacity:.25}.opacity-50{opacity:.5}.opacity-70{opacity:.7}.opacity-75{opacity:.75}.opacity-90{opacity:.9}.shadow-2xl{--tw-shadow:var(--shadow-2xl);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-lg{--tw-shadow:var(--shadow-lg);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-md{--tw-shadow:var(--shadow-md);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-sm{--tw-shadow:var(--shadow-sm);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-xl{--tw-shadow:var(--shadow-xl);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.ring{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.ring-0{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(0px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.ring-2{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.ring-4{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(4px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.\[box-shadow\:var\(--shadow\)\]{box-shadow:var(--shadow)}.ring-primary\/20{--tw-ring-color:var(--primary)}@supports (color:color-mix(in lab, red, red)){.ring-primary\/20{--tw-ring-color:color-mix(in oklab, var(--primary) 20%, transparent)}}.ring-ring{--tw-ring-color:var(--ring)}.ring-sidebar-ring{--tw-ring-color:var(--sidebar-ring)}.ring-offset-2{--tw-ring-offset-width:2px;--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color)}.ring-offset-background{--tw-ring-offset-color:var(--background)}.outline{outline-style:var(--tw-outline-style);outline-width:1px}.blur{--tw-blur:blur(8px);filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.filter{filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.backdrop-blur{--tw-backdrop-blur:blur(8px);-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.backdrop-blur-md{--tw-backdrop-blur:blur(var(--blur-md));-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.backdrop-blur-sm{--tw-backdrop-blur:blur(var(--blur-sm));-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\[grid-template-rows\]{transition-property:grid-template-rows;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\[left\,right\,width\]{transition-property:left,right,width;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\[margin\,opacity\]{transition-property:margin,opacity;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\[width\,height\,padding\]{transition-property:width,height,padding;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\[width\]{transition-property:width;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-all{transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-opacity{transition-property:opacity;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-transform{transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.duration-150{--tw-duration:.15s;transition-duration:.15s}.duration-200{--tw-duration:.2s;transition-duration:.2s}.duration-300{--tw-duration:.3s;transition-duration:.3s}.ease-\[cubic-bezier\(0\.4\,0\,0\.2\,1\)\]{--tw-ease:cubic-bezier(.4,0,.2,1);transition-timing-function:cubic-bezier(.4,0,.2,1)}.ease-in-out{--tw-ease:var(--ease-in-out);transition-timing-function:var(--ease-in-out)}.ease-linear{--tw-ease:linear;transition-timing-function:linear}.ease-out{--tw-ease:var(--ease-out);transition-timing-function:var(--ease-out)}.\[contain\:layout\]{contain:layout}.outline-none{--tw-outline-style:none;outline-style:none}.select-all{-webkit-user-select:all;user-select:all}.select-none{-webkit-user-select:none;user-select:none}.\[animation-delay\:-0\.3s\]{animation-delay:-.3s}.\[animation-delay\:-0\.15s\]{animation-delay:-.15s}.group-first\:top-3\.5:is(:where(.group):first-child *){top:calc(var(--spacing) * 3.5)}.group-last\:bottom-auto:is(:where(.group):last-child *){bottom:auto}.group-last\:h-3\.5:is(:where(.group):last-child *){height:calc(var(--spacing) * 3.5)}.group-only\:hidden:is(:where(.group):only-child *){display:none}.group-focus-within\/menu-item\:opacity-100:is(:where(.group\/menu-item):focus-within *){opacity:1}@media (hover:hover){.group-hover\:mt-0:is(:where(.group):hover *){margin-top:0}.group-hover\:mb-0:is(:where(.group):hover *){margin-bottom:0}.group-hover\:scale-105:is(:where(.group):hover *){--tw-scale-x:105%;--tw-scale-y:105%;--tw-scale-z:105%;scale:var(--tw-scale-x) var(--tw-scale-y)}.group-hover\:opacity-100:is(:where(.group):hover *),.group-hover\/menu-item\:opacity-100:is(:where(.group\/menu-item):hover *){opacity:1}}.group-has-\[\[data-sidebar\=menu-action\]\]\/menu-item\:pr-8:is(:where(.group\/menu-item):has([data-sidebar=menu-action]) *){padding-right:calc(var(--spacing) * 8)}.group-data-\[collapsible\=icon\]\:-mt-8:is(:where(.group)[data-collapsible=icon] *){margin-top:calc(var(--spacing) * -8)}.group-data-\[collapsible\=icon\]\:\!flex:is(:where(.group)[data-collapsible=icon] *){display:flex!important}.group-data-\[collapsible\=icon\]\:hidden:is(:where(.group)[data-collapsible=icon] *){display:none}.group-data-\[collapsible\=icon\]\:\!size-8:is(:where(.group)[data-collapsible=icon] *){width:calc(var(--spacing) * 8)!important;height:calc(var(--spacing) * 8)!important}.group-data-\[collapsible\=icon\]\:\!items-center:is(:where(.group)[data-collapsible=icon] *){align-items:center!important}.group-data-\[collapsible\=icon\]\:\!justify-center:is(:where(.group)[data-collapsible=icon] *){justify-content:center!important}.group-data-\[collapsible\=icon\]\:overflow-hidden:is(:where(.group)[data-collapsible=icon] *){overflow:hidden}.group-data-\[collapsible\=icon\]\:\!rounded-full:is(:where(.group)[data-collapsible=icon] *){border-radius:3.40282e38px!important}.group-data-\[collapsible\=icon\]\:\!bg-sidebar-primary:is(:where(.group)[data-collapsible=icon] *){background-color:var(--sidebar-primary)!important}.group-data-\[collapsible\=icon\]\:\!bg-white:is(:where(.group)[data-collapsible=icon] *){background-color:var(--color-white)!important}.group-data-\[collapsible\=icon\]\:\!p-0:is(:where(.group)[data-collapsible=icon] *){padding:0!important}.group-data-\[collapsible\=icon\]\:\!p-2:is(:where(.group)[data-collapsible=icon] *){padding:calc(var(--spacing) * 2)!important}.group-data-\[collapsible\=icon\]\:\!text-black:is(:where(.group)[data-collapsible=icon] *){color:var(--color-black)!important}.group-data-\[collapsible\=icon\]\:text-sidebar-primary-foreground:is(:where(.group)[data-collapsible=icon] *){color:var(--sidebar-primary-foreground)}.group-data-\[collapsible\=icon\]\:opacity-0:is(:where(.group)[data-collapsible=icon] *){opacity:0}.group-data-\[collapsible\=offcanvas\]\:translate-x-0:is(:where(.group)[data-collapsible=offcanvas] *){--tw-translate-x:0;translate:var(--tw-translate-x) var(--tw-translate-y)}.group-data-\[side\=left\]\:-right-4:is(:where(.group)[data-side=left] *){right:calc(var(--spacing) * -4)}.group-data-\[side\=right\]\:left-0:is(:where(.group)[data-side=right] *){left:0}.group-data-\[side\=right\]\:group-data-\[collapsible\=offcanvas\]\:-translate-x-full:is(:where(.group)[data-side=right] *):is(:where(.group)[data-collapsible=offcanvas] *){--tw-translate-x:-100%;translate:var(--tw-translate-x) var(--tw-translate-y)}.group-data-\[variant\=floating\]\:rounded-lg:is(:where(.group)[data-variant=floating] *){border-radius:var(--radius)}.group-data-\[variant\=floating\]\:border:is(:where(.group)[data-variant=floating] *){border-style:var(--tw-border-style);border-width:1px}.group-data-\[variant\=floating\]\:border-sidebar-border:is(:where(.group)[data-variant=floating] *){border-color:var(--sidebar-border)}.group-data-\[variant\=floating\]\:shadow:is(:where(.group)[data-variant=floating] *){--tw-shadow:var(--shadow);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}@media (hover:hover){.peer-hover\/menu-button\:text-sidebar-accent-foreground:is(:where(.peer\/menu-button):hover~*){color:var(--sidebar-accent-foreground)}}.peer-disabled\:cursor-not-allowed:is(:where(.peer):disabled~*){cursor:not-allowed}.peer-disabled\:opacity-70:is(:where(.peer):disabled~*){opacity:.7}.peer-data-\[active\=true\]\/menu-button\:text-sidebar-accent-foreground:is(:where(.peer\/menu-button)[data-active=true]~*){color:var(--sidebar-accent-foreground)}.peer-data-\[variant\=inset\]\:min-h-\[calc\(100svh-1rem\)\]:is(:where(.peer)[data-variant=inset]~*){min-height:calc(100svh - 1rem)}.file\:border-0::file-selector-button{border-style:var(--tw-border-style);border-width:0}.file\:bg-transparent::file-selector-button{background-color:#0000}.file\:text-sm::file-selector-button{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.file\:font-medium::file-selector-button{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.placeholder\:text-muted-foreground::placeholder{color:var(--muted-foreground)}.after\:absolute:after{content:var(--tw-content);position:absolute}.after\:-inset-2:after{content:var(--tw-content);inset:calc(var(--spacing) * -2)}.after\:inset-y-0:after{content:var(--tw-content);inset-block:0}.after\:left-1\/2:after{content:var(--tw-content);left:50%}.after\:w-\[2px\]:after{content:var(--tw-content);width:2px}.group-data-\[collapsible\=offcanvas\]\:after\:left-full:is(:where(.group)[data-collapsible=offcanvas] *):after{content:var(--tw-content);left:100%}.first\:pt-1\.5:first-child{padding-top:calc(var(--spacing) * 1.5)}.last\:border-b-0:last-child{border-bottom-style:var(--tw-border-style);border-bottom-width:0}.last\:pb-0:last-child{padding-bottom:0}.focus-within\:ring-2:focus-within{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.focus-within\:ring-ring:focus-within{--tw-ring-color:var(--ring)}.focus-within\:ring-offset-2:focus-within{--tw-ring-offset-width:2px;--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color)}@media (hover:hover){.hover\:gap-4:hover{gap:calc(var(--spacing) * 4)}.hover\:border-border:hover{border-color:var(--border)}.hover\:border-primary\/50:hover{border-color:var(--primary)}@supports (color:color-mix(in lab, red, red)){.hover\:border-primary\/50:hover{border-color:color-mix(in oklab, var(--primary) 50%, transparent)}}.hover\:bg-accent:hover,.hover\:bg-accent\/50:hover{background-color:var(--accent)}@supports (color:color-mix(in lab, red, red)){.hover\:bg-accent\/50:hover{background-color:color-mix(in oklab, var(--accent) 50%, transparent)}}.hover\:bg-background\/90:hover{background-color:var(--background)}@supports (color:color-mix(in lab, red, red)){.hover\:bg-background\/90:hover{background-color:color-mix(in oklab, var(--background) 90%, transparent)}}.hover\:bg-black\/70:hover{background-color:#000000b3}@supports (color:color-mix(in lab, red, red)){.hover\:bg-black\/70:hover{background-color:color-mix(in oklab, var(--color-black) 70%, transparent)}}.hover\:bg-blue-600:hover{background-color:var(--color-blue-600)}.hover\:bg-destructive\/80:hover{background-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.hover\:bg-destructive\/80:hover{background-color:color-mix(in oklab, var(--destructive) 80%, transparent)}}.hover\:bg-destructive\/90:hover{background-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.hover\:bg-destructive\/90:hover{background-color:color-mix(in oklab, var(--destructive) 90%, transparent)}}.hover\:bg-green-600:hover{background-color:var(--color-green-600)}.hover\:bg-muted:hover,.hover\:bg-muted\/50:hover{background-color:var(--muted)}@supports (color:color-mix(in lab, red, red)){.hover\:bg-muted\/50:hover{background-color:color-mix(in oklab, var(--muted) 50%, transparent)}}.hover\:bg-primary:hover,.hover\:bg-primary\/10:hover{background-color:var(--primary)}@supports (color:color-mix(in lab, red, red)){.hover\:bg-primary\/10:hover{background-color:color-mix(in oklab, var(--primary) 10%, transparent)}}.hover\:bg-primary\/80:hover{background-color:var(--primary)}@supports (color:color-mix(in lab, red, red)){.hover\:bg-primary\/80:hover{background-color:color-mix(in oklab, var(--primary) 80%, transparent)}}.hover\:bg-primary\/90:hover{background-color:var(--primary)}@supports (color:color-mix(in lab, red, red)){.hover\:bg-primary\/90:hover{background-color:color-mix(in oklab, var(--primary) 90%, transparent)}}.hover\:bg-secondary\/80:hover{background-color:var(--secondary)}@supports (color:color-mix(in lab, red, red)){.hover\:bg-secondary\/80:hover{background-color:color-mix(in oklab, var(--secondary) 80%, transparent)}}.hover\:bg-sidebar-accent:hover,.hover\:bg-sidebar-accent\/90:hover{background-color:var(--sidebar-accent)}@supports (color:color-mix(in lab, red, red)){.hover\:bg-sidebar-accent\/90:hover{background-color:color-mix(in oklab, var(--sidebar-accent) 90%, transparent)}}.hover\:bg-white\/20:hover{background-color:#fff3}@supports (color:color-mix(in lab, red, red)){.hover\:bg-white\/20:hover{background-color:color-mix(in oklab, var(--color-white) 20%, transparent)}}.hover\:bg-yellow-600:hover{background-color:var(--color-yellow-600)}.hover\:text-accent-foreground:hover{color:var(--accent-foreground)}.hover\:text-destructive:hover{color:var(--destructive)}.hover\:text-foreground:hover,.hover\:text-foreground\/80:hover{color:var(--foreground)}@supports (color:color-mix(in lab, red, red)){.hover\:text-foreground\/80:hover{color:color-mix(in oklab, var(--foreground) 80%, transparent)}}.hover\:text-muted-foreground:hover{color:var(--muted-foreground)}.hover\:text-primary-foreground:hover{color:var(--primary-foreground)}.hover\:text-sidebar-accent-foreground:hover{color:var(--sidebar-accent-foreground)}.hover\:underline:hover{text-decoration-line:underline}.hover\:opacity-80:hover{opacity:.8}.hover\:opacity-100:hover{opacity:1}.group-data-\[collapsible\=offcanvas\]\:hover\:bg-sidebar:is(:where(.group)[data-collapsible=offcanvas] *):hover{background-color:var(--sidebar)}.hover\:after\:bg-sidebar-border:hover:after{content:var(--tw-content);background-color:var(--sidebar-border)}}.focus\:border-ring:focus{border-color:var(--ring)}.focus\:bg-accent:focus{background-color:var(--accent)}.focus\:bg-primary:focus{background-color:var(--primary)}.focus\:text-accent-foreground:focus{color:var(--accent-foreground)}.focus\:text-primary-foreground:focus{color:var(--primary-foreground)}.focus\:ring-1:focus{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.focus\:ring-2:focus{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.focus\:ring-ring:focus{--tw-ring-color:var(--ring)}.focus\:ring-offset-2:focus{--tw-ring-offset-width:2px;--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color)}.focus\:outline-none:focus{--tw-outline-style:none;outline-style:none}.focus-visible\:ring-1:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.focus-visible\:ring-2:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.focus-visible\:ring-destructive:focus-visible{--tw-ring-color:var(--destructive)}.focus-visible\:ring-ring:focus-visible{--tw-ring-color:var(--ring)}.focus-visible\:ring-offset-2:focus-visible{--tw-ring-offset-width:2px;--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color)}.focus-visible\:ring-offset-background:focus-visible{--tw-ring-offset-color:var(--background)}.focus-visible\:outline-none:focus-visible{--tw-outline-style:none;outline-style:none}.active\:scale-\[0\.98\]:active{scale:.98}.active\:bg-sidebar-accent:active{background-color:var(--sidebar-accent)}.active\:text-sidebar-accent-foreground:active{color:var(--sidebar-accent-foreground)}.disabled\:pointer-events-none:disabled{pointer-events:none}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:opacity-40:disabled{opacity:.4}.disabled\:opacity-50:disabled{opacity:.5}.has-\[\[data-variant\=inset\]\]\:bg-sidebar:has([data-variant=inset]){background-color:var(--sidebar)}.aria-disabled\:pointer-events-none[aria-disabled=true]{pointer-events:none}.aria-disabled\:opacity-50[aria-disabled=true]{opacity:.5}.data-\[active\=true\]\:bg-sidebar-accent[data-active=true]{background-color:var(--sidebar-accent)}.data-\[active\=true\]\:font-medium[data-active=true]{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.data-\[active\=true\]\:text-sidebar-accent-foreground[data-active=true]{color:var(--sidebar-accent-foreground)}.data-\[disabled\]\:pointer-events-none[data-disabled]{pointer-events:none}.data-\[disabled\]\:opacity-50[data-disabled]{opacity:.5}.data-\[state\=closed\]\:duration-300[data-state=closed]{--tw-duration:.3s;transition-duration:.3s}.data-\[state\=open\]\:grid-rows-\[1fr\][data-state=open]{grid-template-rows:1fr}.data-\[state\=open\]\:bg-accent[data-state=open]{background-color:var(--accent)}.data-\[state\=open\]\:text-muted-foreground[data-state=open]{color:var(--muted-foreground)}.data-\[state\=open\]\:opacity-100[data-state=open]{opacity:1}.data-\[state\=open\]\:duration-500[data-state=open]{--tw-duration:.5s;transition-duration:.5s}@media (hover:hover){.data-\[state\=open\]\:hover\:bg-sidebar-accent[data-state=open]:hover{background-color:var(--sidebar-accent)}.data-\[state\=open\]\:hover\:text-sidebar-accent-foreground[data-state=open]:hover{color:var(--sidebar-accent-foreground)}}.data-\[state\=selected\]\:bg-muted[data-state=selected]{background-color:var(--muted)}@supports ((-webkit-backdrop-filter:var(--tw)) or (backdrop-filter:var(--tw))){.supports-\[backdrop-filter\]\:bg-background\/60{background-color:var(--background)}@supports (color:color-mix(in lab, red, red)){.supports-\[backdrop-filter\]\:bg-background\/60{background-color:color-mix(in oklab, var(--background) 60%, transparent)}}}@media (prefers-reduced-motion:reduce){.motion-reduce\:animate-none{animation:none}.motion-reduce\:transition-none{transition-property:none}}@media (min-width:40rem){.sm\:block{display:block}.sm\:flex{display:flex}.sm\:inline-flex{display:inline-flex}.sm\:w-auto{width:auto}.sm\:max-w-sm{max-width:var(--container-sm)}.sm\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.sm\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.sm\:grid-cols-5{grid-template-columns:repeat(5,minmax(0,1fr))}.sm\:flex-col{flex-direction:column}.sm\:flex-row{flex-direction:row}.sm\:items-center{align-items:center}.sm\:justify-between{justify-content:space-between}.sm\:justify-end{justify-content:flex-end}.sm\:gap-2\.5{gap:calc(var(--spacing) * 2.5)}:where(.sm\:space-x-2>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing) * 2) * var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing) * 2) * calc(1 - var(--tw-space-x-reverse)))}:where(.sm\:space-x-6>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing) * 6) * var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing) * 6) * calc(1 - var(--tw-space-x-reverse)))}.sm\:rounded-lg{border-radius:var(--radius)}.sm\:p-6{padding:calc(var(--spacing) * 6)}.sm\:text-left{text-align:left}.sm\:text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.sm\:text-3xl{font-size:var(--text-3xl);line-height:var(--tw-leading,var(--text-3xl--line-height))}.sm\:text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.sm\:text-xl{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}}@media (min-width:48rem){.md\:block{display:block}.md\:flex{display:flex}.md\:inline-flex{display:inline-flex}.md\:min-h-min{min-height:min-content}.md\:max-w-\[420px\]{max-width:420px}.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.md\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.md\:p-8{padding:calc(var(--spacing) * 8)}.md\:text-4xl{font-size:var(--text-4xl);line-height:var(--tw-leading,var(--text-4xl--line-height))}.md\:opacity-0{opacity:0}.md\:peer-data-\[variant\=inset\]\:m-2:is(:where(.peer)[data-variant=inset]~*){margin:calc(var(--spacing) * 2)}.md\:peer-data-\[variant\=inset\]\:ml-0:is(:where(.peer)[data-variant=inset]~*){margin-left:0}.md\:peer-data-\[variant\=inset\]\:rounded-xl:is(:where(.peer)[data-variant=inset]~*){border-radius:calc(var(--radius) + 4px)}.md\:peer-data-\[variant\=inset\]\:shadow:is(:where(.peer)[data-variant=inset]~*){--tw-shadow:var(--shadow);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}}.after\:md\:hidden:after{content:var(--tw-content)}@media (min-width:48rem){.after\:md\:hidden:after{display:none}}@media (min-width:64rem){.lg\:flex{display:flex}.lg\:hidden{display:none}.lg\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}:where(.lg\:space-x-8>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing) * 8) * var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing) * 8) * calc(1 - var(--tw-space-x-reverse)))}}.dark\:bg-amber-500\/10:is(.dark *){background-color:#f99c001a}@supports (color:color-mix(in lab, red, red)){.dark\:bg-amber-500\/10:is(.dark *){background-color:color-mix(in oklab, var(--color-amber-500) 10%, transparent)}}.dark\:bg-blue-500\/10:is(.dark *){background-color:#3080ff1a}@supports (color:color-mix(in lab, red, red)){.dark\:bg-blue-500\/10:is(.dark *){background-color:color-mix(in oklab, var(--color-blue-500) 10%, transparent)}}.dark\:bg-blue-900\/30:is(.dark *){background-color:#1c398e4d}@supports (color:color-mix(in lab, red, red)){.dark\:bg-blue-900\/30:is(.dark *){background-color:color-mix(in oklab, var(--color-blue-900) 30%, transparent)}}.dark\:bg-emerald-500\/10:is(.dark *){background-color:#00bb7f1a}@supports (color:color-mix(in lab, red, red)){.dark\:bg-emerald-500\/10:is(.dark *){background-color:color-mix(in oklab, var(--color-emerald-500) 10%, transparent)}}.dark\:bg-green-900\/20:is(.dark *){background-color:#0d542b33}@supports (color:color-mix(in lab, red, red)){.dark\:bg-green-900\/20:is(.dark *){background-color:color-mix(in oklab, var(--color-green-900) 20%, transparent)}}.dark\:bg-green-900\/30:is(.dark *){background-color:#0d542b4d}@supports (color:color-mix(in lab, red, red)){.dark\:bg-green-900\/30:is(.dark *){background-color:color-mix(in oklab, var(--color-green-900) 30%, transparent)}}.dark\:bg-red-500\/10:is(.dark *){background-color:#fb2c361a}@supports (color:color-mix(in lab, red, red)){.dark\:bg-red-500\/10:is(.dark *){background-color:color-mix(in oklab, var(--color-red-500) 10%, transparent)}}.dark\:bg-yellow-900\/30:is(.dark *){background-color:#733e0a4d}@supports (color:color-mix(in lab, red, red)){.dark\:bg-yellow-900\/30:is(.dark *){background-color:color-mix(in oklab, var(--color-yellow-900) 30%, transparent)}}.dark\:text-amber-400:is(.dark *){color:var(--color-amber-400)}.dark\:text-blue-100:is(.dark *){color:var(--color-blue-100)}.dark\:text-blue-400:is(.dark *){color:var(--color-blue-400)}.dark\:text-emerald-400:is(.dark *){color:var(--color-emerald-400)}.dark\:text-green-100:is(.dark *){color:var(--color-green-100)}.dark\:text-green-400:is(.dark *){color:var(--color-green-400)}.dark\:text-red-400:is(.dark *){color:var(--color-red-400)}.dark\:text-yellow-100:is(.dark *){color:var(--color-yellow-100)}.dark\:text-yellow-400:is(.dark *){color:var(--color-yellow-400)}.dark\:group-data-\[collapsible\=icon\]\:\!bg-black:is(.dark *):is(:where(.group)[data-collapsible=icon] *){background-color:var(--color-black)!important}.dark\:group-data-\[collapsible\=icon\]\:\!text-white:is(.dark *):is(:where(.group)[data-collapsible=icon] *){color:var(--color-white)!important}@starting-style{.starting\:scale-95{--tw-scale-x:95%;--tw-scale-y:95%;--tw-scale-z:95%;scale:var(--tw-scale-x) var(--tw-scale-y)}}@starting-style{.starting\:opacity-0{opacity:0}}.\[\&_tr\]\:border-b tr{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.\[\&_tr\:last-child\]\:border-0 tr:last-child{border-style:var(--tw-border-style);border-width:0}.\[\&\:\:-moz-range-thumb\]\:h-5::-moz-range-thumb{height:calc(var(--spacing) * 5)}.\[\&\:\:-moz-range-thumb\]\:w-5::-moz-range-thumb{width:calc(var(--spacing) * 5)}.\[\&\:\:-moz-range-thumb\]\:rounded-full::-moz-range-thumb{border-radius:3.40282e38px}.\[\&\:\:-moz-range-thumb\]\:bg-primary::-moz-range-thumb{background-color:var(--primary)}.\[\&\:\:-moz-range-thumb\]\:ring-offset-background::-moz-range-thumb{--tw-ring-offset-color:var(--background)}.\[\&\:\:-moz-range-thumb\]\:transition-colors::-moz-range-thumb{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.focus-visible\:\[\&\:\:-moz-range-thumb\]\:ring-2:focus-visible::-moz-range-thumb{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.focus-visible\:\[\&\:\:-moz-range-thumb\]\:ring-ring:focus-visible::-moz-range-thumb{--tw-ring-color:var(--ring)}.focus-visible\:\[\&\:\:-moz-range-thumb\]\:ring-offset-2:focus-visible::-moz-range-thumb{--tw-ring-offset-width:2px;--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color)}.\[\&\:\:-webkit-inner-spin-button\]\:appearance-none::-webkit-inner-spin-button{appearance:none}.\[\&\:\:-webkit-outer-spin-button\]\:appearance-none::-webkit-outer-spin-button{appearance:none}.\[\&\:\:-webkit-slider-thumb\]\:h-5::-webkit-slider-thumb{height:calc(var(--spacing) * 5)}.\[\&\:\:-webkit-slider-thumb\]\:w-5::-webkit-slider-thumb{width:calc(var(--spacing) * 5)}.\[\&\:\:-webkit-slider-thumb\]\:appearance-none::-webkit-slider-thumb{appearance:none}.\[\&\:\:-webkit-slider-thumb\]\:rounded-full::-webkit-slider-thumb{border-radius:3.40282e38px}.\[\&\:\:-webkit-slider-thumb\]\:bg-primary::-webkit-slider-thumb{background-color:var(--primary)}.\[\&\:\:-webkit-slider-thumb\]\:ring-offset-background::-webkit-slider-thumb{--tw-ring-offset-color:var(--background)}.\[\&\:\:-webkit-slider-thumb\]\:transition-colors::-webkit-slider-thumb{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.focus-visible\:\[\&\:\:-webkit-slider-thumb\]\:ring-2:focus-visible::-webkit-slider-thumb{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.focus-visible\:\[\&\:\:-webkit-slider-thumb\]\:ring-ring:focus-visible::-webkit-slider-thumb{--tw-ring-color:var(--ring)}.focus-visible\:\[\&\:\:-webkit-slider-thumb\]\:ring-offset-2:focus-visible::-webkit-slider-thumb{--tw-ring-offset-width:2px;--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color)}.\[\&\:has\(\[role\=checkbox\]\)\]\:pr-0:has([role=checkbox]){padding-right:0}.\[\&\>\*\]\:absolute>*{position:absolute}.\[\&\>\*\]\:inset-0>*{inset:0}.\[\&\>\*\]\:h-full>*{height:100%}.\[\&\>\*\]\:w-full>*{width:100%}.\[\&\>\*\]\:rounded-none>*{border-radius:0}.\[\&\>\*\]\:focus-visible\:z-10>:focus-visible{z-index:10}.\[\&\>\*\:first-child\]\:rounded-t-md>:first-child{border-top-left-radius:calc(var(--radius) - 2px);border-top-right-radius:calc(var(--radius) - 2px)}.\[\&\>\*\:first-child\]\:rounded-l-md>:first-child{border-top-left-radius:calc(var(--radius) - 2px);border-bottom-left-radius:calc(var(--radius) - 2px)}.\[\&\>\*\:last-child\]\:rounded-r-md>:last-child{border-top-right-radius:calc(var(--radius) - 2px);border-bottom-right-radius:calc(var(--radius) - 2px)}.\[\&\>\*\:last-child\]\:rounded-b-md>:last-child{border-bottom-right-radius:calc(var(--radius) - 2px);border-bottom-left-radius:calc(var(--radius) - 2px)}.\[\&\>\*\:not\(\:first-child\)\]\:-mt-px>:not(:first-child){margin-top:-1px}.\[\&\>\*\:not\(\:first-child\)\]\:-ml-px>:not(:first-child){margin-left:-1px}.\[\&\>i\]\:w-4>i{width:calc(var(--spacing) * 4)}.\[\&\>i\]\:shrink-0>i{flex-shrink:0}.\[\&\>i\]\:text-center>i{text-align:center}.\[\&\>p\]\:leading-7>p{--tw-leading:calc(var(--spacing) * 7);line-height:calc(var(--spacing) * 7)}.\[\&\>p\:first-child\]\:mt-0>p:first-child{margin-top:0}.\[\&\>p\:last-child\]\:mb-0>p:last-child{margin-bottom:0}.\[\&\>span\]\:\!bg-sidebar-accent>span{background-color:var(--sidebar-accent)!important}.\[\&\>span\]\:\!text-sm>span{font-size:var(--text-sm)!important;line-height:var(--tw-leading,var(--text-sm--line-height))!important}.\[\&\>span\]\:\!font-semibold>span{--tw-font-weight:var(--font-weight-semibold)!important;font-weight:var(--font-weight-semibold)!important}.\[\&\>span\]\:\!text-sidebar-accent-foreground>span{color:var(--sidebar-accent-foreground)!important}.group-data-\[collapsible\=icon\]\:\[\&\>span\]\:\!hidden:is(:where(.group)[data-collapsible=icon] *)>span{display:none!important}.\[\&\>span\:last-child\]\:truncate>span:last-child{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.\[\&\>svg\]\:absolute>svg{position:absolute}.\[\&\>svg\]\:top-4>svg{top:calc(var(--spacing) * 4)}.\[\&\>svg\]\:left-4>svg{left:calc(var(--spacing) * 4)}.\[\&\>svg\]\:inline-block>svg{display:inline-block}.\[\&\>svg\]\:size-3\.5>svg{width:calc(var(--spacing) * 3.5);height:calc(var(--spacing) * 3.5)}.\[\&\>svg\]\:size-4>svg{width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}.\[\&\>svg\]\:shrink-0>svg{flex-shrink:0}.\[\&\>svg\]\:text-amber-600>svg{color:var(--color-amber-600)}.\[\&\>svg\]\:text-blue-600>svg{color:var(--color-blue-600)}.\[\&\>svg\]\:text-destructive>svg{color:var(--destructive)}.\[\&\>svg\]\:text-emerald-600>svg{color:var(--color-emerald-600)}.\[\&\>svg\]\:text-foreground>svg{color:var(--foreground)}.\[\&\>svg\]\:text-green-600>svg{color:var(--color-green-600)}.\[\&\>svg\]\:text-muted-foreground>svg{color:var(--muted-foreground)}.\[\&\>svg\]\:text-red-600>svg{color:var(--color-red-600)}.\[\&\>svg\]\:text-sidebar-accent-foreground>svg{color:var(--sidebar-accent-foreground)}.\[\&\>svg\]\:text-yellow-600>svg{color:var(--color-yellow-600)}.dark\:\[\&\>svg\]\:text-amber-400:is(.dark *)>svg{color:var(--color-amber-400)}.dark\:\[\&\>svg\]\:text-blue-400:is(.dark *)>svg{color:var(--color-blue-400)}.dark\:\[\&\>svg\]\:text-emerald-400:is(.dark *)>svg{color:var(--color-emerald-400)}.dark\:\[\&\>svg\]\:text-red-400:is(.dark *)>svg{color:var(--color-red-400)}.\[\&\>svg\+div\]\:translate-y-\[-3px\]>svg+div{--tw-translate-y:-3px;translate:var(--tw-translate-x) var(--tw-translate-y)}.\[\&\>svg\~\*\]\:pl-7>svg~*{padding-left:calc(var(--spacing) * 7)}.\[\&\[data-state\=open\]\>svg\]\:rotate-180[data-state=open]>svg{rotate:180deg}[data-side=left] .\[\[data-side\=left\]_\&\]\:cursor-w-resize{cursor:w-resize}[data-side=left][data-state=collapsed] .\[\[data-side\=left\]\[data-state\=collapsed\]_\&\]\:cursor-e-resize,[data-side=right] .\[\[data-side\=right\]_\&\]\:cursor-e-resize{cursor:e-resize}[data-side=right][data-state=collapsed] .\[\[data-side\=right\]\[data-state\=collapsed\]_\&\]\:cursor-w-resize{cursor:w-resize}}:root{--background:oklch(99% 0 0);--foreground:oklch(0% 0 0);--card:oklch(100% 0 0);--card-foreground:oklch(0% 0 0);--popover:oklch(99% 0 0);--popover-foreground:oklch(0% 0 0);--primary:oklch(0% 0 0);--primary-foreground:oklch(100% 0 0);--secondary:oklch(94% 0 0);--secondary-foreground:oklch(0% 0 0);--muted:oklch(97% 0 0);--muted-foreground:oklch(44% 0 0);--accent:oklch(94% 0 0);--accent-foreground:oklch(0% 0 0);--destructive:oklch(63% .19 23.03);--destructive-foreground:oklch(100% 0 0);--border:oklch(92% 0 0);--input:oklch(94% 0 0);--ring:oklch(0% 0 0);--chart-1:oklch(81% .17 75.35);--chart-2:oklch(55% .22 264.53);--chart-3:oklch(72% 0 0);--chart-4:oklch(92% 0 0);--chart-5:oklch(56% 0 0);--sidebar:oklch(99% 0 0);--sidebar-foreground:oklch(0% 0 0);--sidebar-primary:oklch(0% 0 0);--sidebar-primary-foreground:oklch(100% 0 0);--sidebar-accent:oklch(94% 0 0);--sidebar-accent-foreground:oklch(0% 0 0);--sidebar-border:oklch(94% 0 0);--sidebar-ring:oklch(0% 0 0);--font-sans:Geist, sans-serif;--font-serif:Georgia, serif;--font-mono:Geist Mono, monospace;--radius:.5rem;--shadow-x:0px;--shadow-y:1px;--shadow-blur:2px;--shadow-spread:0px;--shadow-opacity:.18;--shadow-color:#000;--shadow-2xs:0px 1px 2px 0px #00000017;--shadow-xs:0px 1px 2px 0px #00000017;--shadow-sm:0px 1px 2px 0px #0000002e, 0px 1px 2px -1px #0000002e;--shadow:0px 1px 2px 0px #0000002e, 0px 1px 2px -1px #0000002e;--shadow-md:0px 1px 2px 0px #0000002e, 0px 2px 4px -1px #0000002e;--shadow-lg:0px 1px 2px 0px #0000002e, 0px 4px 6px -1px #0000002e;--shadow-xl:0px 1px 2px 0px #0000002e, 0px 8px 10px -1px #0000002e;--shadow-2xl:0px 1px 2px 0px #00000073;--tracking-normal:0em;--spacing:.25rem}.dark{--background:oklch(0% 0 0);--foreground:oklch(100% 0 0);--card:oklch(14% 0 0);--card-foreground:oklch(100% 0 0);--popover:oklch(18% 0 0);--popover-foreground:oklch(100% 0 0);--primary:oklch(100% 0 0);--primary-foreground:oklch(0% 0 0);--secondary:oklch(25% 0 0);--secondary-foreground:oklch(100% 0 0);--muted:oklch(23% 0 0);--muted-foreground:oklch(72% 0 0);--accent:oklch(32% 0 0);--accent-foreground:oklch(100% 0 0);--destructive:oklch(69% .2 23.91);--destructive-foreground:oklch(0% 0 0);--border:oklch(26% 0 0);--input:oklch(32% 0 0);--ring:oklch(72% 0 0);--chart-1:oklch(81% .17 75.35);--chart-2:oklch(58% .21 260.84);--chart-3:oklch(56% 0 0);--chart-4:oklch(44% 0 0);--chart-5:oklch(92% 0 0);--sidebar:oklch(18% 0 0);--sidebar-foreground:oklch(100% 0 0);--sidebar-primary:oklch(100% 0 0);--sidebar-primary-foreground:oklch(0% 0 0);--sidebar-accent:oklch(32% 0 0);--sidebar-accent-foreground:oklch(100% 0 0);--sidebar-border:oklch(32% 0 0);--sidebar-ring:oklch(72% 0 0);--font-sans:Geist, sans-serif;--font-serif:Georgia, serif;--font-mono:Geist Mono, monospace;--radius:.5rem;--shadow-x:0px;--shadow-y:1px;--shadow-blur:2px;--shadow-spread:0px;--shadow-opacity:.18;--shadow-color:#000;--shadow-2xs:0px 1px 2px 0px #00000017;--shadow-xs:0px 1px 2px 0px #00000017;--shadow-sm:0px 1px 2px 0px #0000002e, 0px 1px 2px -1px #0000002e;--shadow:0px 1px 2px 0px #0000002e, 0px 1px 2px -1px #0000002e;--shadow-md:0px 1px 2px 0px #0000002e, 0px 2px 4px -1px #0000002e;--shadow-lg:0px 1px 2px 0px #0000002e, 0px 4px 6px -1px #0000002e;--shadow-xl:0px 1px 2px 0px #0000002e, 0px 8px 10px -1px #0000002e;--shadow-2xl:0px 1px 2px 0px #00000073}html,body,:host{font-family:var(--font-sans)!important}@keyframes bars{0%,to{opacity:.7;transform:scaleY(.4)}50%{opacity:1;transform:scaleY(1)}}@keyframes bars-vertical{0%,to{opacity:.7;transform:scaleY(.4)}50%{opacity:1;transform:scaleY(1)}}@keyframes bars-pulse{0%,to{opacity:.5;transform:scaleY(.3)}50%{opacity:1;transform:scaleY(1)}}@keyframes orbit{0%{transform:translate(-50%, 0) rotate(0deg) translateX(calc((var(--size,1rem) - .5rem) / 2)) rotate(0deg)}to{transform:translate(-50%, 0) rotate(360deg) translateX(calc((var(--size,1rem) - .5rem) / 2)) rotate(-360deg)}}.apexcharts-canvas{background:0 0}.apexcharts-gridline{stroke:var(--border);stroke-opacity:.6}.apexcharts-text,.apexcharts-xaxis-label,.apexcharts-yaxis-label{fill:var(--muted-foreground);font-family:var(--font-sans)}.apexcharts-legend-text{font-family:var(--font-sans);color:var(--foreground)!important}.apexcharts-title-text{fill:var(--foreground);font-family:var(--font-sans)}.apexcharts-subtitle-text{fill:var(--muted-foreground);font-family:var(--font-sans)}.apexcharts-legend{flex-wrap:wrap;gap:12px;padding:0 0 12px;display:flex!important}.apexcharts-legend-series{gap:6px;align-items:center!important;margin:0!important;display:inline-flex!important}.apexcharts-legend-marker{flex-shrink:0;vertical-align:middle!important;border:none!important;border-radius:9999px!important;margin:0!important}.shellui-chart-tooltip{background:var(--popover);color:var(--popover-foreground);border:1px solid var(--border);border-radius:calc(var(--radius) - 2px);box-shadow:var(--shadow-md);font-family:var(--font-sans);min-width:0;max-width:220px;overflow:hidden}.shellui-chart-tooltip-title{color:var(--foreground);border-bottom:1px solid var(--border);white-space:nowrap;padding:4px 8px;font-size:12px;font-weight:600}.shellui-chart-tooltip-body{flex-direction:column;gap:3px;padding:4px 8px;display:flex}.shellui-chart-tooltip-row{white-space:nowrap;grid-template-columns:10px 1fr auto;align-items:center;gap:6px;font-size:12px;line-height:1.2;display:grid}.shellui-chart-tooltip-marker{border-radius:2px;width:10px;height:10px;display:block}.shellui-chart-tooltip-label{color:var(--muted-foreground);font-weight:500}.shellui-chart-tooltip-value{color:var(--foreground);font-variant-numeric:tabular-nums;padding-left:12px;font-weight:600}.apexcharts-tooltip{box-shadow:none!important;background:0 0!important;border:none!important;padding:0!important}.apexcharts-xcrosshairs,.apexcharts-ycrosshairs{stroke:var(--border);stroke-dasharray:3}.apexcharts-toolbar{z-index:10}.apexcharts-toolbar-item{color:var(--muted-foreground);transition:color .15s}.apexcharts-toolbar-item:hover{color:var(--foreground)}.apexcharts-menu{background:var(--popover);border:1px solid var(--border);border-radius:calc(var(--radius) - 2px);box-shadow:var(--shadow-lg);padding:4px}.apexcharts-menu-item{color:var(--foreground);border-radius:calc(var(--radius) - 4px);padding:6px 10px;font-size:13px;transition:background-color .15s}.apexcharts-menu-item:hover{background:var(--accent);color:var(--accent-foreground)}.apexcharts-datalabel,.apexcharts-datalabel-label,.apexcharts-datalabel-value{fill:var(--foreground);font-family:var(--font-sans);font-weight:500}#blazor-error-ui{background:var(--destructive);color:var(--destructive-foreground);z-index:9999;text-align:center;padding:1rem;display:none;position:fixed;top:0;left:0;right:0}#blazor-error-ui.show{display:block}#blazor-error-ui a{color:inherit;margin:0 .5rem;text-decoration:underline}#blazor-error-ui a:hover{opacity:.8}@property --tw-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-z{syntax:"*";inherits:false;initial-value:0}@property --tw-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-scrollbar-thumb{syntax:"";inherits:false;initial-value:#0000}@property --tw-scrollbar-track{syntax:"";inherits:false;initial-value:#0000}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-space-x-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-ordinal{syntax:"*";inherits:false}@property --tw-slashed-zero{syntax:"*";inherits:false}@property --tw-numeric-figure{syntax:"*";inherits:false}@property --tw-numeric-spacing{syntax:"*";inherits:false}@property --tw-numeric-fraction{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-outline-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@property --tw-backdrop-blur{syntax:"*";inherits:false}@property --tw-backdrop-brightness{syntax:"*";inherits:false}@property --tw-backdrop-contrast{syntax:"*";inherits:false}@property --tw-backdrop-grayscale{syntax:"*";inherits:false}@property --tw-backdrop-hue-rotate{syntax:"*";inherits:false}@property --tw-backdrop-invert{syntax:"*";inherits:false}@property --tw-backdrop-opacity{syntax:"*";inherits:false}@property --tw-backdrop-saturate{syntax:"*";inherits:false}@property --tw-backdrop-sepia{syntax:"*";inherits:false}@property --tw-duration{syntax:"*";inherits:false}@property --tw-ease{syntax:"*";inherits:false}@property --tw-scale-x{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-y{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-z{syntax:"*";inherits:false;initial-value:1}@property --tw-content{syntax:"*";inherits:false;initial-value:""}@keyframes spin{to{transform:rotate(360deg)}}@keyframes pulse{50%{opacity:.5}}@keyframes bounce{0%,to{animation-timing-function:cubic-bezier(.8,0,1,1);transform:translateY(-25%)}50%{animation-timing-function:cubic-bezier(0,0,.2,1);transform:none}} \ No newline at end of file +@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-scrollbar-thumb:#0000;--tw-scrollbar-track:#0000;--tw-space-y-reverse:0;--tw-space-x-reverse:0;--tw-border-style:solid;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-ordinal:initial;--tw-slashed-zero:initial;--tw-numeric-figure:initial;--tw-numeric-spacing:initial;--tw-numeric-fraction:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-outline-style:solid;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial;--tw-duration:initial;--tw-ease:initial;--tw-scale-x:1;--tw-scale-y:1;--tw-scale-z:1;--tw-content:""}}}@layer theme{:root,:host{--font-sans:var(--font-sans);--font-serif:var(--font-serif);--font-mono:var(--font-mono);--color-red-400:oklch(70.4% .191 22.216);--color-red-500:oklch(63.7% .237 25.331);--color-red-600:oklch(57.7% .245 27.325);--color-red-700:oklch(50.5% .213 27.518);--color-amber-400:oklch(82.8% .189 84.429);--color-amber-500:oklch(76.9% .188 70.08);--color-amber-600:oklch(66.6% .179 58.318);--color-amber-700:oklch(55.5% .163 48.998);--color-yellow-100:oklch(97.3% .071 103.193);--color-yellow-400:oklch(85.2% .199 91.936);--color-yellow-500:oklch(79.5% .184 86.047);--color-yellow-600:oklch(68.1% .162 75.834);--color-yellow-700:oklch(55.4% .135 66.442);--color-yellow-800:oklch(47.6% .114 61.907);--color-yellow-900:oklch(42.1% .095 57.708);--color-green-50:oklch(98.2% .018 155.826);--color-green-100:oklch(96.2% .044 156.743);--color-green-400:oklch(79.2% .209 151.711);--color-green-500:oklch(72.3% .219 149.579);--color-green-600:oklch(62.7% .194 149.214);--color-green-700:oklch(52.7% .154 150.069);--color-green-900:oklch(39.3% .095 152.535);--color-emerald-400:oklch(76.5% .177 163.223);--color-emerald-500:oklch(69.6% .17 162.48);--color-emerald-600:oklch(59.6% .145 163.225);--color-emerald-700:oklch(50.8% .118 165.612);--color-sky-400:oklch(74.6% .16 232.661);--color-sky-700:oklch(50% .134 242.749);--color-blue-100:oklch(93.2% .032 255.585);--color-blue-400:oklch(70.7% .165 254.624);--color-blue-500:oklch(62.3% .214 259.815);--color-blue-600:oklch(54.6% .245 262.881);--color-blue-700:oklch(48.8% .243 264.376);--color-blue-900:oklch(37.9% .146 265.522);--color-violet-400:oklch(70.2% .183 293.541);--color-violet-700:oklch(49.1% .27 292.581);--color-black:#000;--color-white:#fff;--spacing:.25rem;--container-xs:20rem;--container-sm:24rem;--container-md:28rem;--container-lg:32rem;--container-xl:36rem;--container-2xl:42rem;--container-4xl:56rem;--text-xs:.75rem;--text-xs--line-height:calc(1 / .75);--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--text-base:1rem;--text-base--line-height:calc(1.5 / 1);--text-lg:1.125rem;--text-lg--line-height:calc(1.75 / 1.125);--text-xl:1.25rem;--text-xl--line-height:calc(1.75 / 1.25);--text-2xl:1.5rem;--text-2xl--line-height:calc(2 / 1.5);--text-3xl:1.875rem;--text-3xl--line-height:calc(2.25 / 1.875);--text-4xl:2.25rem;--text-4xl--line-height:calc(2.5 / 2.25);--text-5xl:3rem;--text-5xl--line-height:1;--font-weight-normal:400;--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--tracking-tight:-.025em;--tracking-wide:.025em;--leading-tight:1.25;--leading-relaxed:1.625;--shadow-2xs:var(--shadow-2xs);--shadow-xs:var(--shadow-xs);--shadow-sm:var(--shadow-sm);--shadow-md:var(--shadow-md);--shadow-lg:var(--shadow-lg);--shadow-xl:var(--shadow-xl);--shadow-2xl:var(--shadow-2xl);--ease-out:cubic-bezier(0, 0, .2, 1);--ease-in-out:cubic-bezier(.4, 0, .2, 1);--animate-spin:spin 1s linear infinite;--animate-pulse:pulse 2s cubic-bezier(.4, 0, .6, 1) infinite;--animate-bounce:bounce 1s infinite;--blur-sm:8px;--blur-md:12px;--aspect-video:16 / 9;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono);--shadow:var(--shadow)}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab, red, red)){::placeholder{color:color-mix(in oklab, currentcolor 50%, transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}@supports (color:color-mix(in lab, red, red)){*{outline-color:color-mix(in oklab, var(--ring) 50%, transparent)}}h1:focus{outline:none}*{border-color:var(--border);outline-color:var(--ring)}@supports (color:color-mix(in lab, red, red)){*{outline-color:color-mix(in oklab, var(--ring) 50%, transparent)}}body{background-color:var(--background);color:var(--foreground)}}@layer components;@layer utilities{.pointer-events-auto{pointer-events:auto}.pointer-events-none{pointer-events:none}.collapse{visibility:collapse}.visible{visibility:visible}.sr-only{clip-path:inset(50%);white-space:nowrap;border-width:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.static{position:static}.sticky{position:sticky}.inset-0{inset:0}.inset-x-0{inset-inline:0}.inset-y-0{inset-block:0}.top-0{top:0}.top-1\.5{top:calc(var(--spacing) * 1.5)}.top-1\/2{top:50%}.top-2{top:calc(var(--spacing) * 2)}.top-4{top:calc(var(--spacing) * 4)}.top-5{top:calc(var(--spacing) * 5)}.top-8{top:calc(var(--spacing) * 8)}.top-\[1px\]{top:1px}.top-\[15vh\]{top:15vh}.top-\[50\%\]{top:50%}.top-full{top:100%}.right-0{right:0}.right-1{right:var(--spacing)}.right-2{right:calc(var(--spacing) * 2)}.right-4{right:calc(var(--spacing) * 4)}.right-full{right:100%}.bottom-0{bottom:0}.bottom-4{bottom:calc(var(--spacing) * 4)}.bottom-full{bottom:100%}.left-0{left:0}.left-1\/2{left:50%}.left-2{left:calc(var(--spacing) * 2)}.left-3\.5{left:calc(var(--spacing) * 3.5)}.left-4{left:calc(var(--spacing) * 4)}.left-\[50\%\]{left:50%}.left-full{left:100%}.isolate{isolation:isolate}.z-10{z-index:10}.z-20{z-index:20}.z-40{z-index:40}.z-50{z-index:50}.container{width:100%}@media (min-width:40rem){.container{max-width:40rem}}@media (min-width:48rem){.container{max-width:48rem}}@media (min-width:64rem){.container{max-width:64rem}}@media (min-width:80rem){.container{max-width:80rem}}@media (min-width:96rem){.container{max-width:96rem}}.-mx-2{margin-inline:calc(var(--spacing) * -2)}.mx-2{margin-inline:calc(var(--spacing) * 2)}.mx-3\.5{margin-inline:calc(var(--spacing) * 3.5)}.mx-4{margin-inline:calc(var(--spacing) * 4)}.mx-auto{margin-inline:auto}.my-1{margin-block:var(--spacing)}.my-4{margin-block:calc(var(--spacing) * 4)}.my-6{margin-block:calc(var(--spacing) * 6)}.-mt-20{margin-top:calc(var(--spacing) * -20)}.mt-0\.5{margin-top:calc(var(--spacing) * .5)}.mt-1{margin-top:var(--spacing)}.mt-2{margin-top:calc(var(--spacing) * 2)}.mt-3{margin-top:calc(var(--spacing) * 3)}.mt-4{margin-top:calc(var(--spacing) * 4)}.mt-6{margin-top:calc(var(--spacing) * 6)}.mt-8{margin-top:calc(var(--spacing) * 8)}.mt-10{margin-top:calc(var(--spacing) * 10)}.mt-12{margin-top:calc(var(--spacing) * 12)}.mt-24{margin-top:calc(var(--spacing) * 24)}.mt-auto{margin-top:auto}.mr-2{margin-right:calc(var(--spacing) * 2)}.mr-3{margin-right:calc(var(--spacing) * 3)}.-mb-20{margin-bottom:calc(var(--spacing) * -20)}.mb-1{margin-bottom:var(--spacing)}.mb-2{margin-bottom:calc(var(--spacing) * 2)}.mb-3{margin-bottom:calc(var(--spacing) * 3)}.mb-4{margin-bottom:calc(var(--spacing) * 4)}.mb-6{margin-bottom:calc(var(--spacing) * 6)}.mb-8{margin-bottom:calc(var(--spacing) * 8)}.mb-24{margin-bottom:calc(var(--spacing) * 24)}.-ml-1{margin-left:calc(var(--spacing) * -1)}.ml-0\.5{margin-left:calc(var(--spacing) * .5)}.ml-1{margin-left:var(--spacing)}.ml-2{margin-left:calc(var(--spacing) * 2)}.ml-4{margin-left:calc(var(--spacing) * 4)}.ml-64{margin-left:calc(var(--spacing) * 64)}.ml-\[5px\]{margin-left:5px}.ml-auto{margin-left:auto}.block{display:block}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline{display:inline}.inline-block{display:inline-block}.inline-flex{display:inline-flex}.table{display:table}.table-cell{display:table-cell}.table-row{display:table-row}.aspect-square{aspect-ratio:1}.aspect-video{aspect-ratio:var(--aspect-video)}.size-4{width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}.size-8{width:calc(var(--spacing) * 8);height:calc(var(--spacing) * 8)}.h-1\.5{height:calc(var(--spacing) * 1.5)}.h-1\/2{height:50%}.h-2{height:calc(var(--spacing) * 2)}.h-2\.5{height:calc(var(--spacing) * 2.5)}.h-3{height:calc(var(--spacing) * 3)}.h-3\.5{height:calc(var(--spacing) * 3.5)}.h-4{height:calc(var(--spacing) * 4)}.h-5{height:calc(var(--spacing) * 5)}.h-6{height:calc(var(--spacing) * 6)}.h-7{height:calc(var(--spacing) * 7)}.h-8{height:calc(var(--spacing) * 8)}.h-9{height:calc(var(--spacing) * 9)}.h-10{height:calc(var(--spacing) * 10)}.h-11{height:calc(var(--spacing) * 11)}.h-12{height:calc(var(--spacing) * 12)}.h-14{height:calc(var(--spacing) * 14)}.h-16{height:calc(var(--spacing) * 16)}.h-20{height:calc(var(--spacing) * 20)}.h-24{height:calc(var(--spacing) * 24)}.h-32{height:calc(var(--spacing) * 32)}.h-64{height:calc(var(--spacing) * 64)}.h-96{height:calc(var(--spacing) * 96)}.h-\[1px\]{height:1px}.h-auto{height:auto}.h-full{height:100%}.h-px{height:1px}.h-svh{height:100svh}.max-h-48{max-height:calc(var(--spacing) * 48)}.max-h-60{max-height:calc(var(--spacing) * 60)}.max-h-80{max-height:calc(var(--spacing) * 80)}.max-h-\[90vh\]{max-height:90vh}.max-h-\[min\(360px\,55vh\)\]{max-height:min(360px,55vh)}.max-h-screen{max-height:100vh}.\!min-h-0{min-height:0!important}.min-h-0{min-height:0}.min-h-7{min-height:calc(var(--spacing) * 7)}.min-h-8{min-height:calc(var(--spacing) * 8)}.min-h-10{min-height:calc(var(--spacing) * 10)}.min-h-\[50vh\]{min-height:50vh}.min-h-\[60px\]{min-height:60px}.min-h-\[80px\]{min-height:80px}.min-h-\[160px\]{min-height:160px}.min-h-\[420px\]{min-height:420px}.min-h-screen{min-height:100vh}.min-h-svh{min-height:100svh}.w-1\.5{width:calc(var(--spacing) * 1.5)}.w-1\/2{width:50%}.w-2{width:calc(var(--spacing) * 2)}.w-2\.5{width:calc(var(--spacing) * 2.5)}.w-2\/3{width:66.6667%}.w-2\/5{width:40%}.w-3{width:calc(var(--spacing) * 3)}.w-3\.5{width:calc(var(--spacing) * 3.5)}.w-3\/4{width:75%}.w-4{width:calc(var(--spacing) * 4)}.w-5{width:calc(var(--spacing) * 5)}.w-6{width:calc(var(--spacing) * 6)}.w-7{width:calc(var(--spacing) * 7)}.w-8{width:calc(var(--spacing) * 8)}.w-9{width:calc(var(--spacing) * 9)}.w-10{width:calc(var(--spacing) * 10)}.w-11{width:calc(var(--spacing) * 11)}.w-12{width:calc(var(--spacing) * 12)}.w-16{width:calc(var(--spacing) * 16)}.w-24{width:calc(var(--spacing) * 24)}.w-56{width:calc(var(--spacing) * 56)}.w-64{width:calc(var(--spacing) * 64)}.w-72{width:calc(var(--spacing) * 72)}.w-80{width:calc(var(--spacing) * 80)}.w-\[1px\]{width:1px}.w-\[70px\]{width:70px}.w-\[100px\]{width:100px}.w-\[380px\]{width:380px}.w-\[calc\(100\%-2rem\)\]{width:calc(100% - 2rem)}.w-auto{width:auto}.w-fit{width:fit-content}.w-full{width:100%}.w-max{width:max-content}.w-px{width:1px}.max-w-2xl{max-width:var(--container-2xl)}.max-w-4xl{max-width:var(--container-4xl)}.max-w-\[80\%\]{max-width:80%}.max-w-\[90vw\]{max-width:90vw}.max-w-\[400px\]{max-width:400px}.max-w-lg{max-width:var(--container-lg)}.max-w-max{max-width:max-content}.max-w-md{max-width:var(--container-md)}.max-w-sm{max-width:var(--container-sm)}.max-w-xl{max-width:var(--container-xl)}.max-w-xs{max-width:var(--container-xs)}.min-w-0{min-width:0}.min-w-5{min-width:calc(var(--spacing) * 5)}.min-w-8{min-width:calc(var(--spacing) * 8)}.min-w-9{min-width:calc(var(--spacing) * 9)}.min-w-24{min-width:calc(var(--spacing) * 24)}.min-w-\[8rem\]{min-width:8rem}.min-w-\[640px\]{min-width:640px}.flex-1{flex:1}.flex-shrink-0,.shrink-0{flex-shrink:0}.caption-bottom{caption-side:bottom}.origin-top-right{transform-origin:100% 0}.-translate-x-1\/2{--tw-translate-x:calc(calc(1 / 2 * 100%) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.-translate-x-px{--tw-translate-x:-1px;translate:var(--tw-translate-x) var(--tw-translate-y)}.translate-x-0{--tw-translate-x:0;translate:var(--tw-translate-x) var(--tw-translate-y)}.translate-x-5{--tw-translate-x:calc(var(--spacing) * 5);translate:var(--tw-translate-x) var(--tw-translate-y)}.translate-x-\[-50\%\]{--tw-translate-x:-50%;translate:var(--tw-translate-x) var(--tw-translate-y)}.translate-x-px{--tw-translate-x:1px;translate:var(--tw-translate-x) var(--tw-translate-y)}.-translate-y-1\/2{--tw-translate-y:calc(calc(1 / 2 * 100%) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.translate-y-\[-50\%\]{--tw-translate-y:-50%;translate:var(--tw-translate-x) var(--tw-translate-y)}.scale-\[1\.02\]{scale:1.02}.rotate-90{rotate:90deg}.rotate-180{rotate:180deg}.transform{transform:var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)}.animate-bounce{animation:var(--animate-bounce)}.animate-pulse{animation:var(--animate-pulse)}.animate-spin{animation:var(--animate-spin)}.cursor-default{cursor:default}.cursor-not-allowed{cursor:not-allowed}.cursor-pointer{cursor:pointer}.touch-none{touch-action:none}.resize{resize:both}.resize-none{resize:none}.scrollbar-thin{scrollbar-width:thin}.scrollbar-thumb-border{--tw-scrollbar-thumb:var(--border);scrollbar-color:var(--tw-scrollbar-thumb) var(--tw-scrollbar-track)}.scrollbar-track-transparent{--tw-scrollbar-track:transparent;scrollbar-color:var(--tw-scrollbar-thumb) var(--tw-scrollbar-track)}.list-inside{list-style-position:inside}.list-disc{list-style-type:disc}.list-none{list-style-type:none}.\[appearance\:textfield\]{appearance:textfield}.appearance-none{appearance:none}.auto-rows-min{grid-auto-rows:min-content}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.grid-cols-5{grid-template-columns:repeat(5,minmax(0,1fr))}.grid-cols-7{grid-template-columns:repeat(7,minmax(0,1fr))}.grid-rows-\[0fr\]{grid-template-rows:0fr}.flex-col{flex-direction:column}.flex-col-reverse{flex-direction:column-reverse}.flex-row{flex-direction:row}.flex-row-reverse{flex-direction:row-reverse}.flex-wrap{flex-wrap:wrap}.items-baseline{align-items:baseline}.items-center{align-items:center}.items-end{align-items:flex-end}.items-start{align-items:flex-start}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.justify-end{justify-content:flex-end}.gap-0{gap:0}.gap-0\.5{gap:calc(var(--spacing) * .5)}.gap-1{gap:var(--spacing)}.gap-1\.5{gap:calc(var(--spacing) * 1.5)}.gap-2{gap:calc(var(--spacing) * 2)}.gap-3{gap:calc(var(--spacing) * 3)}.gap-4{gap:calc(var(--spacing) * 4)}.gap-6{gap:calc(var(--spacing) * 6)}.gap-8{gap:calc(var(--spacing) * 8)}:where(.space-y-0>:not(:last-child)){--tw-space-y-reverse:0;margin-block:0}:where(.space-y-0\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * .5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * .5) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-1>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(var(--spacing) * var(--tw-space-y-reverse));margin-block-end:calc(var(--spacing) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-1\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 1.5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 1.5) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-2>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 2) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 2) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-3>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 3) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 3) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-4>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 4) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 4) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-6>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 6) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 6) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-8>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 8) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 8) * calc(1 - var(--tw-space-y-reverse)))}.gap-x-2{column-gap:calc(var(--spacing) * 2)}:where(.space-x-1>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(var(--spacing) * var(--tw-space-x-reverse));margin-inline-end:calc(var(--spacing) * calc(1 - var(--tw-space-x-reverse)))}:where(.space-x-2>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing) * 2) * var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing) * 2) * calc(1 - var(--tw-space-x-reverse)))}:where(.space-x-4>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing) * 4) * var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing) * 4) * calc(1 - var(--tw-space-x-reverse)))}:where(.space-x-6>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing) * 6) * var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing) * 6) * calc(1 - var(--tw-space-x-reverse)))}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-x-hidden{overflow-x:hidden}.overflow-y-auto{overflow-y:auto}.overscroll-contain{overscroll-behavior:contain}.\[border-radius\:var\(--radius\)\]{border-radius:var(--radius)}.rounded{border-radius:.25rem}.rounded-\[2px\]{border-radius:2px}.rounded-full{border-radius:3.40282e38px}.rounded-lg{border-radius:var(--radius)}.rounded-md{border-radius:calc(var(--radius) - 2px)}.rounded-sm{border-radius:calc(var(--radius) - 4px)}.rounded-xl{border-radius:calc(var(--radius) + 4px)}.rounded-t-\[10px\]{border-top-left-radius:10px;border-top-right-radius:10px}.rounded-b-\[10px\]{border-bottom-right-radius:10px;border-bottom-left-radius:10px}.rounded-b-xl{border-bottom-right-radius:calc(var(--radius) + 4px);border-bottom-left-radius:calc(var(--radius) + 4px)}.border{border-style:var(--tw-border-style);border-width:1px}.border-0{border-style:var(--tw-border-style);border-width:0}.border-2{border-style:var(--tw-border-style);border-width:2px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-r{border-right-style:var(--tw-border-style);border-right-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-l{border-left-style:var(--tw-border-style);border-left-width:1px}.border-dashed{--tw-border-style:dashed;border-style:dashed}.border-border,.border-border\/40{border-color:var(--border)}@supports (color:color-mix(in lab, red, red)){.border-border\/40{border-color:color-mix(in oklab, var(--border) 40%, transparent)}}.border-destructive{border-color:var(--destructive)}.border-green-500{border-color:var(--color-green-500)}.border-input{border-color:var(--input)}.border-muted{border-color:var(--muted)}.border-primary,.border-primary\/40{border-color:var(--primary)}@supports (color:color-mix(in lab, red, red)){.border-primary\/40{border-color:color-mix(in oklab, var(--primary) 40%, transparent)}}.border-ring{border-color:var(--ring)}.border-sidebar-border{border-color:var(--sidebar-border)}.border-transparent{border-color:#0000}.bg-accent,.bg-accent\/30{background-color:var(--accent)}@supports (color:color-mix(in lab, red, red)){.bg-accent\/30{background-color:color-mix(in oklab, var(--accent) 30%, transparent)}}.bg-accent\/50{background-color:var(--accent)}@supports (color:color-mix(in lab, red, red)){.bg-accent\/50{background-color:color-mix(in oklab, var(--accent) 50%, transparent)}}.bg-amber-500\/5{background-color:#f99c000d}@supports (color:color-mix(in lab, red, red)){.bg-amber-500\/5{background-color:color-mix(in oklab, var(--color-amber-500) 5%, transparent)}}.bg-background,.bg-background\/80{background-color:var(--background)}@supports (color:color-mix(in lab, red, red)){.bg-background\/80{background-color:color-mix(in oklab, var(--background) 80%, transparent)}}.bg-background\/95{background-color:var(--background)}@supports (color:color-mix(in lab, red, red)){.bg-background\/95{background-color:color-mix(in oklab, var(--background) 95%, transparent)}}.bg-black\/50{background-color:#00000080}@supports (color:color-mix(in lab, red, red)){.bg-black\/50{background-color:color-mix(in oklab, var(--color-black) 50%, transparent)}}.bg-black\/80{background-color:#000c}@supports (color:color-mix(in lab, red, red)){.bg-black\/80{background-color:color-mix(in oklab, var(--color-black) 80%, transparent)}}.bg-blue-500{background-color:var(--color-blue-500)}.bg-blue-500\/5{background-color:#3080ff0d}@supports (color:color-mix(in lab, red, red)){.bg-blue-500\/5{background-color:color-mix(in oklab, var(--color-blue-500) 5%, transparent)}}.bg-blue-500\/20{background-color:#3080ff33}@supports (color:color-mix(in lab, red, red)){.bg-blue-500\/20{background-color:color-mix(in oklab, var(--color-blue-500) 20%, transparent)}}.bg-border{background-color:var(--border)}.bg-card,.bg-card\/50{background-color:var(--card)}@supports (color:color-mix(in lab, red, red)){.bg-card\/50{background-color:color-mix(in oklab, var(--card) 50%, transparent)}}.bg-current{background-color:currentColor}.bg-destructive,.bg-destructive\/10{background-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.bg-destructive\/10{background-color:color-mix(in oklab, var(--destructive) 10%, transparent)}}.bg-emerald-500\/5{background-color:#00bb7f0d}@supports (color:color-mix(in lab, red, red)){.bg-emerald-500\/5{background-color:color-mix(in oklab, var(--color-emerald-500) 5%, transparent)}}.bg-emerald-500\/10{background-color:#00bb7f1a}@supports (color:color-mix(in lab, red, red)){.bg-emerald-500\/10{background-color:color-mix(in oklab, var(--color-emerald-500) 10%, transparent)}}.bg-green-50{background-color:var(--color-green-50)}.bg-green-500{background-color:var(--color-green-500)}.bg-green-500\/20{background-color:#00c75833}@supports (color:color-mix(in lab, red, red)){.bg-green-500\/20{background-color:color-mix(in oklab, var(--color-green-500) 20%, transparent)}}.bg-input{background-color:var(--input)}.bg-muted{background-color:var(--muted)}.bg-muted-foreground{background-color:var(--muted-foreground)}.bg-muted\/30{background-color:var(--muted)}@supports (color:color-mix(in lab, red, red)){.bg-muted\/30{background-color:color-mix(in oklab, var(--muted) 30%, transparent)}}.bg-muted\/40{background-color:var(--muted)}@supports (color:color-mix(in lab, red, red)){.bg-muted\/40{background-color:color-mix(in oklab, var(--muted) 40%, transparent)}}.bg-muted\/50{background-color:var(--muted)}@supports (color:color-mix(in lab, red, red)){.bg-muted\/50{background-color:color-mix(in oklab, var(--muted) 50%, transparent)}}.bg-popover{background-color:var(--popover)}.bg-primary,.bg-primary\/5{background-color:var(--primary)}@supports (color:color-mix(in lab, red, red)){.bg-primary\/5{background-color:color-mix(in oklab, var(--primary) 5%, transparent)}}.bg-primary\/10{background-color:var(--primary)}@supports (color:color-mix(in lab, red, red)){.bg-primary\/10{background-color:color-mix(in oklab, var(--primary) 10%, transparent)}}.bg-primary\/20{background-color:var(--primary)}@supports (color:color-mix(in lab, red, red)){.bg-primary\/20{background-color:color-mix(in oklab, var(--primary) 20%, transparent)}}.bg-red-500\/5{background-color:#fb2c360d}@supports (color:color-mix(in lab, red, red)){.bg-red-500\/5{background-color:color-mix(in oklab, var(--color-red-500) 5%, transparent)}}.bg-red-500\/10{background-color:#fb2c361a}@supports (color:color-mix(in lab, red, red)){.bg-red-500\/10{background-color:color-mix(in oklab, var(--color-red-500) 10%, transparent)}}.bg-secondary{background-color:var(--secondary)}.bg-sidebar{background-color:var(--sidebar)}.bg-sidebar-accent{background-color:var(--sidebar-accent)}.bg-sidebar-border{background-color:var(--sidebar-border)}.bg-sidebar-primary{background-color:var(--sidebar-primary)}.bg-transparent{background-color:#0000}.bg-white\/10{background-color:#ffffff1a}@supports (color:color-mix(in lab, red, red)){.bg-white\/10{background-color:color-mix(in oklab, var(--color-white) 10%, transparent)}}.bg-yellow-500{background-color:var(--color-yellow-500)}.bg-yellow-500\/20{background-color:#edb20033}@supports (color:color-mix(in lab, red, red)){.bg-yellow-500\/20{background-color:color-mix(in oklab, var(--color-yellow-500) 20%, transparent)}}.fill-primary-foreground{fill:var(--primary-foreground)}.object-contain{object-fit:contain}.object-cover{object-fit:cover}.p-0{padding:0}.p-0\.5{padding:calc(var(--spacing) * .5)}.p-1{padding:var(--spacing)}.p-1\.5{padding:calc(var(--spacing) * 1.5)}.p-2{padding:calc(var(--spacing) * 2)}.p-3{padding:calc(var(--spacing) * 3)}.p-4{padding:calc(var(--spacing) * 4)}.p-6{padding:calc(var(--spacing) * 6)}.p-8{padding:calc(var(--spacing) * 8)}.p-\[3px\]{padding:3px}.px-1{padding-inline:var(--spacing)}.px-1\.5{padding-inline:calc(var(--spacing) * 1.5)}.px-2{padding-inline:calc(var(--spacing) * 2)}.px-2\.5{padding-inline:calc(var(--spacing) * 2.5)}.px-3{padding-inline:calc(var(--spacing) * 3)}.px-4{padding-inline:calc(var(--spacing) * 4)}.px-5{padding-inline:calc(var(--spacing) * 5)}.px-8{padding-inline:calc(var(--spacing) * 8)}.py-0\.5{padding-block:calc(var(--spacing) * .5)}.py-1{padding-block:var(--spacing)}.py-1\.5{padding-block:calc(var(--spacing) * 1.5)}.py-2{padding-block:calc(var(--spacing) * 2)}.py-3{padding-block:calc(var(--spacing) * 3)}.py-4{padding-block:calc(var(--spacing) * 4)}.py-6{padding-block:calc(var(--spacing) * 6)}.py-10{padding-block:calc(var(--spacing) * 10)}.py-12{padding-block:calc(var(--spacing) * 12)}.pt-0{padding-top:0}.pt-2{padding-top:calc(var(--spacing) * 2)}.pt-3{padding-top:calc(var(--spacing) * 3)}.pt-6{padding-top:calc(var(--spacing) * 6)}.pr-2{padding-right:calc(var(--spacing) * 2)}.pr-2\.5{padding-right:calc(var(--spacing) * 2.5)}.pr-3{padding-right:calc(var(--spacing) * 3)}.pr-6{padding-right:calc(var(--spacing) * 6)}.pr-8{padding-right:calc(var(--spacing) * 8)}.pr-9{padding-right:calc(var(--spacing) * 9)}.pb-0\.5{padding-bottom:calc(var(--spacing) * .5)}.pb-1{padding-bottom:var(--spacing)}.pb-4{padding-bottom:calc(var(--spacing) * 4)}.pb-8{padding-bottom:calc(var(--spacing) * 8)}.pl-2{padding-left:calc(var(--spacing) * 2)}.pl-2\.5{padding-left:calc(var(--spacing) * 2.5)}.pl-3{padding-left:calc(var(--spacing) * 3)}.pl-4{padding-left:calc(var(--spacing) * 4)}.pl-8{padding-left:calc(var(--spacing) * 8)}.text-center{text-align:center}.text-left{text-align:left}.text-right{text-align:right}.align-middle{vertical-align:middle}.font-mono{font-family:var(--font-mono)}.text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.text-3xl{font-size:var(--text-3xl);line-height:var(--tw-leading,var(--text-3xl--line-height))}.text-5xl{font-size:var(--text-5xl);line-height:var(--tw-leading,var(--text-5xl--line-height))}.text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xl{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.text-\[8px\]{font-size:8px}.text-\[10px\]{font-size:10px}.text-\[11px\]{font-size:11px}.leading-none{--tw-leading:1;line-height:1}.leading-relaxed{--tw-leading:var(--leading-relaxed);line-height:var(--leading-relaxed)}.leading-tight{--tw-leading:var(--leading-tight);line-height:var(--leading-tight)}.font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-normal{--tw-font-weight:var(--font-weight-normal);font-weight:var(--font-weight-normal)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-tight{--tw-tracking:var(--tracking-tight);letter-spacing:var(--tracking-tight)}.tracking-wide{--tw-tracking:var(--tracking-wide);letter-spacing:var(--tracking-wide)}.break-words{overflow-wrap:break-word}.whitespace-nowrap{white-space:nowrap}.whitespace-pre-line{white-space:pre-line}.whitespace-pre-wrap{white-space:pre-wrap}.text-accent-foreground{color:var(--accent-foreground)}.text-amber-700{color:var(--color-amber-700)}.text-blue-700{color:var(--color-blue-700)}.text-card-foreground{color:var(--card-foreground)}.text-destructive{color:var(--destructive)}.text-destructive-foreground{color:var(--destructive-foreground)}.text-emerald-500{color:var(--color-emerald-500)}.text-emerald-600{color:var(--color-emerald-600)}.text-emerald-700{color:var(--color-emerald-700)}.text-foreground,.text-foreground\/70{color:var(--foreground)}@supports (color:color-mix(in lab, red, red)){.text-foreground\/70{color:color-mix(in oklab, var(--foreground) 70%, transparent)}}.text-green-700{color:var(--color-green-700)}.text-green-900{color:var(--color-green-900)}.text-muted-foreground{color:var(--muted-foreground)}.text-popover-foreground{color:var(--popover-foreground)}.text-primary{color:var(--primary)}.text-primary-foreground{color:var(--primary-foreground)}.text-red-600{color:var(--color-red-600)}.text-red-700{color:var(--color-red-700)}.text-secondary-foreground{color:var(--secondary-foreground)}.text-sidebar-accent-foreground{color:var(--sidebar-accent-foreground)}.text-sidebar-foreground,.text-sidebar-foreground\/70{color:var(--sidebar-foreground)}@supports (color:color-mix(in lab, red, red)){.text-sidebar-foreground\/70{color:color-mix(in oklab, var(--sidebar-foreground) 70%, transparent)}}.text-sidebar-primary-foreground{color:var(--sidebar-primary-foreground)}.text-sky-700{color:var(--color-sky-700)}.text-violet-700{color:var(--color-violet-700)}.text-white{color:var(--color-white)}.text-yellow-700{color:var(--color-yellow-700)}.text-yellow-800{color:var(--color-yellow-800)}.uppercase{text-transform:uppercase}.italic{font-style:italic}.tabular-nums{--tw-numeric-spacing:tabular-nums;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,)}.underline{text-decoration-line:underline}.underline-offset-4{text-underline-offset:4px}.opacity-0{opacity:0}.opacity-25{opacity:.25}.opacity-50{opacity:.5}.opacity-70{opacity:.7}.opacity-75{opacity:.75}.opacity-90{opacity:.9}.shadow-2xl{--tw-shadow:var(--shadow-2xl);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-lg{--tw-shadow:var(--shadow-lg);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-md{--tw-shadow:var(--shadow-md);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-sm{--tw-shadow:var(--shadow-sm);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-xl{--tw-shadow:var(--shadow-xl);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.ring{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.ring-0{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(0px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.ring-2{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.ring-4{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(4px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.\[box-shadow\:var\(--shadow\)\]{box-shadow:var(--shadow)}.ring-primary\/20{--tw-ring-color:var(--primary)}@supports (color:color-mix(in lab, red, red)){.ring-primary\/20{--tw-ring-color:color-mix(in oklab, var(--primary) 20%, transparent)}}.ring-ring{--tw-ring-color:var(--ring)}.ring-sidebar-ring{--tw-ring-color:var(--sidebar-ring)}.ring-offset-2{--tw-ring-offset-width:2px;--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color)}.ring-offset-background{--tw-ring-offset-color:var(--background)}.outline{outline-style:var(--tw-outline-style);outline-width:1px}.blur{--tw-blur:blur(8px);filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.filter{filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.backdrop-blur{--tw-backdrop-blur:blur(8px);-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.backdrop-blur-md{--tw-backdrop-blur:blur(var(--blur-md));-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.backdrop-blur-sm{--tw-backdrop-blur:blur(var(--blur-sm));-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\[grid-template-rows\]{transition-property:grid-template-rows;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\[left\,right\,width\]{transition-property:left,right,width;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\[margin\,opacity\]{transition-property:margin,opacity;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\[width\,height\,padding\]{transition-property:width,height,padding;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\[width\]{transition-property:width;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-all{transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-opacity{transition-property:opacity;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-transform{transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.duration-150{--tw-duration:.15s;transition-duration:.15s}.duration-200{--tw-duration:.2s;transition-duration:.2s}.duration-300{--tw-duration:.3s;transition-duration:.3s}.ease-\[cubic-bezier\(0\.4\,0\,0\.2\,1\)\]{--tw-ease:cubic-bezier(.4,0,.2,1);transition-timing-function:cubic-bezier(.4,0,.2,1)}.ease-in-out{--tw-ease:var(--ease-in-out);transition-timing-function:var(--ease-in-out)}.ease-linear{--tw-ease:linear;transition-timing-function:linear}.ease-out{--tw-ease:var(--ease-out);transition-timing-function:var(--ease-out)}.\[contain\:layout\]{contain:layout}.outline-none{--tw-outline-style:none;outline-style:none}.select-all{-webkit-user-select:all;user-select:all}.select-none{-webkit-user-select:none;user-select:none}.\[animation-delay\:-0\.3s\]{animation-delay:-.3s}.\[animation-delay\:-0\.15s\]{animation-delay:-.15s}.group-first\:top-3\.5:is(:where(.group):first-child *){top:calc(var(--spacing) * 3.5)}.group-last\:bottom-auto:is(:where(.group):last-child *){bottom:auto}.group-last\:h-3\.5:is(:where(.group):last-child *){height:calc(var(--spacing) * 3.5)}.group-only\:hidden:is(:where(.group):only-child *){display:none}.group-focus-within\/menu-item\:opacity-100:is(:where(.group\/menu-item):focus-within *){opacity:1}@media (hover:hover){.group-hover\:mt-0:is(:where(.group):hover *){margin-top:0}.group-hover\:mb-0:is(:where(.group):hover *){margin-bottom:0}.group-hover\:scale-105:is(:where(.group):hover *){--tw-scale-x:105%;--tw-scale-y:105%;--tw-scale-z:105%;scale:var(--tw-scale-x) var(--tw-scale-y)}.group-hover\:opacity-100:is(:where(.group):hover *),.group-hover\/menu-item\:opacity-100:is(:where(.group\/menu-item):hover *){opacity:1}}.group-has-\[\[data-sidebar\=menu-action\]\]\/menu-item\:pr-8:is(:where(.group\/menu-item):has([data-sidebar=menu-action]) *){padding-right:calc(var(--spacing) * 8)}.group-data-\[collapsible\=icon\]\:-mt-8:is(:where(.group)[data-collapsible=icon] *){margin-top:calc(var(--spacing) * -8)}.group-data-\[collapsible\=icon\]\:\!flex:is(:where(.group)[data-collapsible=icon] *){display:flex!important}.group-data-\[collapsible\=icon\]\:hidden:is(:where(.group)[data-collapsible=icon] *){display:none}.group-data-\[collapsible\=icon\]\:\!size-8:is(:where(.group)[data-collapsible=icon] *){width:calc(var(--spacing) * 8)!important;height:calc(var(--spacing) * 8)!important}.group-data-\[collapsible\=icon\]\:\!items-center:is(:where(.group)[data-collapsible=icon] *){align-items:center!important}.group-data-\[collapsible\=icon\]\:\!justify-center:is(:where(.group)[data-collapsible=icon] *){justify-content:center!important}.group-data-\[collapsible\=icon\]\:overflow-hidden:is(:where(.group)[data-collapsible=icon] *){overflow:hidden}.group-data-\[collapsible\=icon\]\:\!rounded-full:is(:where(.group)[data-collapsible=icon] *){border-radius:3.40282e38px!important}.group-data-\[collapsible\=icon\]\:\!bg-sidebar-primary:is(:where(.group)[data-collapsible=icon] *){background-color:var(--sidebar-primary)!important}.group-data-\[collapsible\=icon\]\:\!bg-white:is(:where(.group)[data-collapsible=icon] *){background-color:var(--color-white)!important}.group-data-\[collapsible\=icon\]\:\!p-0:is(:where(.group)[data-collapsible=icon] *){padding:0!important}.group-data-\[collapsible\=icon\]\:\!p-2:is(:where(.group)[data-collapsible=icon] *){padding:calc(var(--spacing) * 2)!important}.group-data-\[collapsible\=icon\]\:\!text-black:is(:where(.group)[data-collapsible=icon] *){color:var(--color-black)!important}.group-data-\[collapsible\=icon\]\:text-sidebar-primary-foreground:is(:where(.group)[data-collapsible=icon] *){color:var(--sidebar-primary-foreground)}.group-data-\[collapsible\=icon\]\:opacity-0:is(:where(.group)[data-collapsible=icon] *){opacity:0}.group-data-\[collapsible\=offcanvas\]\:translate-x-0:is(:where(.group)[data-collapsible=offcanvas] *){--tw-translate-x:0;translate:var(--tw-translate-x) var(--tw-translate-y)}.group-data-\[side\=left\]\:-right-4:is(:where(.group)[data-side=left] *){right:calc(var(--spacing) * -4)}.group-data-\[side\=right\]\:left-0:is(:where(.group)[data-side=right] *){left:0}.group-data-\[side\=right\]\:group-data-\[collapsible\=offcanvas\]\:-translate-x-full:is(:where(.group)[data-side=right] *):is(:where(.group)[data-collapsible=offcanvas] *){--tw-translate-x:-100%;translate:var(--tw-translate-x) var(--tw-translate-y)}.group-data-\[variant\=floating\]\:rounded-lg:is(:where(.group)[data-variant=floating] *){border-radius:var(--radius)}.group-data-\[variant\=floating\]\:border:is(:where(.group)[data-variant=floating] *){border-style:var(--tw-border-style);border-width:1px}.group-data-\[variant\=floating\]\:border-sidebar-border:is(:where(.group)[data-variant=floating] *){border-color:var(--sidebar-border)}.group-data-\[variant\=floating\]\:shadow:is(:where(.group)[data-variant=floating] *){--tw-shadow:var(--shadow);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}@media (hover:hover){.peer-hover\/menu-button\:text-sidebar-accent-foreground:is(:where(.peer\/menu-button):hover~*){color:var(--sidebar-accent-foreground)}}.peer-disabled\:cursor-not-allowed:is(:where(.peer):disabled~*){cursor:not-allowed}.peer-disabled\:opacity-70:is(:where(.peer):disabled~*){opacity:.7}.peer-data-\[active\=true\]\/menu-button\:text-sidebar-accent-foreground:is(:where(.peer\/menu-button)[data-active=true]~*){color:var(--sidebar-accent-foreground)}.peer-data-\[variant\=inset\]\:min-h-\[calc\(100svh-1rem\)\]:is(:where(.peer)[data-variant=inset]~*){min-height:calc(100svh - 1rem)}.file\:border-0::file-selector-button{border-style:var(--tw-border-style);border-width:0}.file\:bg-transparent::file-selector-button{background-color:#0000}.file\:text-sm::file-selector-button{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.file\:font-medium::file-selector-button{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.placeholder\:text-muted-foreground::placeholder{color:var(--muted-foreground)}.after\:absolute:after{content:var(--tw-content);position:absolute}.after\:-inset-2:after{content:var(--tw-content);inset:calc(var(--spacing) * -2)}.after\:inset-y-0:after{content:var(--tw-content);inset-block:0}.after\:left-1\/2:after{content:var(--tw-content);left:50%}.after\:w-\[2px\]:after{content:var(--tw-content);width:2px}.group-data-\[collapsible\=offcanvas\]\:after\:left-full:is(:where(.group)[data-collapsible=offcanvas] *):after{content:var(--tw-content);left:100%}.first\:pt-1\.5:first-child{padding-top:calc(var(--spacing) * 1.5)}.last\:border-b-0:last-child{border-bottom-style:var(--tw-border-style);border-bottom-width:0}.last\:pb-0:last-child{padding-bottom:0}.focus-within\:ring-2:focus-within{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.focus-within\:ring-ring:focus-within{--tw-ring-color:var(--ring)}.focus-within\:ring-offset-2:focus-within{--tw-ring-offset-width:2px;--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color)}@media (hover:hover){.hover\:gap-4:hover{gap:calc(var(--spacing) * 4)}.hover\:border-border:hover{border-color:var(--border)}.hover\:border-primary\/50:hover{border-color:var(--primary)}@supports (color:color-mix(in lab, red, red)){.hover\:border-primary\/50:hover{border-color:color-mix(in oklab, var(--primary) 50%, transparent)}}.hover\:bg-accent:hover,.hover\:bg-accent\/50:hover{background-color:var(--accent)}@supports (color:color-mix(in lab, red, red)){.hover\:bg-accent\/50:hover{background-color:color-mix(in oklab, var(--accent) 50%, transparent)}}.hover\:bg-background\/90:hover{background-color:var(--background)}@supports (color:color-mix(in lab, red, red)){.hover\:bg-background\/90:hover{background-color:color-mix(in oklab, var(--background) 90%, transparent)}}.hover\:bg-black\/70:hover{background-color:#000000b3}@supports (color:color-mix(in lab, red, red)){.hover\:bg-black\/70:hover{background-color:color-mix(in oklab, var(--color-black) 70%, transparent)}}.hover\:bg-blue-600:hover{background-color:var(--color-blue-600)}.hover\:bg-destructive\/80:hover{background-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.hover\:bg-destructive\/80:hover{background-color:color-mix(in oklab, var(--destructive) 80%, transparent)}}.hover\:bg-destructive\/90:hover{background-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.hover\:bg-destructive\/90:hover{background-color:color-mix(in oklab, var(--destructive) 90%, transparent)}}.hover\:bg-green-600:hover{background-color:var(--color-green-600)}.hover\:bg-muted:hover,.hover\:bg-muted\/50:hover{background-color:var(--muted)}@supports (color:color-mix(in lab, red, red)){.hover\:bg-muted\/50:hover{background-color:color-mix(in oklab, var(--muted) 50%, transparent)}}.hover\:bg-primary:hover,.hover\:bg-primary\/10:hover{background-color:var(--primary)}@supports (color:color-mix(in lab, red, red)){.hover\:bg-primary\/10:hover{background-color:color-mix(in oklab, var(--primary) 10%, transparent)}}.hover\:bg-primary\/80:hover{background-color:var(--primary)}@supports (color:color-mix(in lab, red, red)){.hover\:bg-primary\/80:hover{background-color:color-mix(in oklab, var(--primary) 80%, transparent)}}.hover\:bg-primary\/90:hover{background-color:var(--primary)}@supports (color:color-mix(in lab, red, red)){.hover\:bg-primary\/90:hover{background-color:color-mix(in oklab, var(--primary) 90%, transparent)}}.hover\:bg-secondary\/80:hover{background-color:var(--secondary)}@supports (color:color-mix(in lab, red, red)){.hover\:bg-secondary\/80:hover{background-color:color-mix(in oklab, var(--secondary) 80%, transparent)}}.hover\:bg-sidebar-accent:hover,.hover\:bg-sidebar-accent\/90:hover{background-color:var(--sidebar-accent)}@supports (color:color-mix(in lab, red, red)){.hover\:bg-sidebar-accent\/90:hover{background-color:color-mix(in oklab, var(--sidebar-accent) 90%, transparent)}}.hover\:bg-white\/20:hover{background-color:#fff3}@supports (color:color-mix(in lab, red, red)){.hover\:bg-white\/20:hover{background-color:color-mix(in oklab, var(--color-white) 20%, transparent)}}.hover\:bg-yellow-600:hover{background-color:var(--color-yellow-600)}.hover\:text-accent-foreground:hover{color:var(--accent-foreground)}.hover\:text-destructive:hover{color:var(--destructive)}.hover\:text-foreground:hover,.hover\:text-foreground\/80:hover{color:var(--foreground)}@supports (color:color-mix(in lab, red, red)){.hover\:text-foreground\/80:hover{color:color-mix(in oklab, var(--foreground) 80%, transparent)}}.hover\:text-muted-foreground:hover{color:var(--muted-foreground)}.hover\:text-primary-foreground:hover{color:var(--primary-foreground)}.hover\:text-sidebar-accent-foreground:hover{color:var(--sidebar-accent-foreground)}.hover\:underline:hover{text-decoration-line:underline}.hover\:opacity-80:hover{opacity:.8}.hover\:opacity-100:hover{opacity:1}.group-data-\[collapsible\=offcanvas\]\:hover\:bg-sidebar:is(:where(.group)[data-collapsible=offcanvas] *):hover{background-color:var(--sidebar)}.hover\:after\:bg-sidebar-border:hover:after{content:var(--tw-content);background-color:var(--sidebar-border)}}.focus\:border-ring:focus{border-color:var(--ring)}.focus\:bg-accent:focus{background-color:var(--accent)}.focus\:bg-primary:focus{background-color:var(--primary)}.focus\:text-accent-foreground:focus{color:var(--accent-foreground)}.focus\:text-primary-foreground:focus{color:var(--primary-foreground)}.focus\:ring-1:focus{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.focus\:ring-2:focus{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.focus\:ring-ring:focus{--tw-ring-color:var(--ring)}.focus\:ring-offset-2:focus{--tw-ring-offset-width:2px;--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color)}.focus\:outline-none:focus{--tw-outline-style:none;outline-style:none}.focus-visible\:ring-1:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.focus-visible\:ring-2:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.focus-visible\:ring-destructive:focus-visible{--tw-ring-color:var(--destructive)}.focus-visible\:ring-ring:focus-visible{--tw-ring-color:var(--ring)}.focus-visible\:ring-offset-2:focus-visible{--tw-ring-offset-width:2px;--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color)}.focus-visible\:ring-offset-background:focus-visible{--tw-ring-offset-color:var(--background)}.focus-visible\:outline-none:focus-visible{--tw-outline-style:none;outline-style:none}.active\:scale-\[0\.98\]:active{scale:.98}.active\:bg-sidebar-accent:active{background-color:var(--sidebar-accent)}.active\:text-sidebar-accent-foreground:active{color:var(--sidebar-accent-foreground)}.disabled\:pointer-events-none:disabled{pointer-events:none}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:opacity-40:disabled{opacity:.4}.disabled\:opacity-50:disabled{opacity:.5}.has-\[\[data-variant\=inset\]\]\:bg-sidebar:has([data-variant=inset]){background-color:var(--sidebar)}.aria-disabled\:pointer-events-none[aria-disabled=true]{pointer-events:none}.aria-disabled\:opacity-50[aria-disabled=true]{opacity:.5}.data-\[active\=true\]\:bg-sidebar-accent[data-active=true]{background-color:var(--sidebar-accent)}.data-\[active\=true\]\:font-medium[data-active=true]{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.data-\[active\=true\]\:text-sidebar-accent-foreground[data-active=true]{color:var(--sidebar-accent-foreground)}.data-\[disabled\]\:pointer-events-none[data-disabled]{pointer-events:none}.data-\[disabled\]\:opacity-50[data-disabled]{opacity:.5}.data-\[state\=closed\]\:duration-300[data-state=closed]{--tw-duration:.3s;transition-duration:.3s}.data-\[state\=open\]\:grid-rows-\[1fr\][data-state=open]{grid-template-rows:1fr}.data-\[state\=open\]\:bg-accent[data-state=open]{background-color:var(--accent)}.data-\[state\=open\]\:text-muted-foreground[data-state=open]{color:var(--muted-foreground)}.data-\[state\=open\]\:opacity-100[data-state=open]{opacity:1}.data-\[state\=open\]\:duration-500[data-state=open]{--tw-duration:.5s;transition-duration:.5s}@media (hover:hover){.data-\[state\=open\]\:hover\:bg-sidebar-accent[data-state=open]:hover{background-color:var(--sidebar-accent)}.data-\[state\=open\]\:hover\:text-sidebar-accent-foreground[data-state=open]:hover{color:var(--sidebar-accent-foreground)}}.data-\[state\=selected\]\:bg-muted[data-state=selected]{background-color:var(--muted)}@supports ((-webkit-backdrop-filter:var(--tw)) or (backdrop-filter:var(--tw))){.supports-\[backdrop-filter\]\:bg-background\/60{background-color:var(--background)}@supports (color:color-mix(in lab, red, red)){.supports-\[backdrop-filter\]\:bg-background\/60{background-color:color-mix(in oklab, var(--background) 60%, transparent)}}}@media (prefers-reduced-motion:reduce){.motion-reduce\:animate-none{animation:none}.motion-reduce\:transition-none{transition-property:none}}@media (min-width:40rem){.sm\:block{display:block}.sm\:flex{display:flex}.sm\:inline-flex{display:inline-flex}.sm\:w-auto{width:auto}.sm\:max-w-sm{max-width:var(--container-sm)}.sm\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.sm\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.sm\:grid-cols-5{grid-template-columns:repeat(5,minmax(0,1fr))}.sm\:flex-col{flex-direction:column}.sm\:flex-row{flex-direction:row}.sm\:items-center{align-items:center}.sm\:justify-between{justify-content:space-between}.sm\:justify-end{justify-content:flex-end}.sm\:gap-2\.5{gap:calc(var(--spacing) * 2.5)}:where(.sm\:space-x-2>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing) * 2) * var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing) * 2) * calc(1 - var(--tw-space-x-reverse)))}:where(.sm\:space-x-6>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing) * 6) * var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing) * 6) * calc(1 - var(--tw-space-x-reverse)))}.sm\:rounded-lg{border-radius:var(--radius)}.sm\:p-6{padding:calc(var(--spacing) * 6)}.sm\:text-left{text-align:left}.sm\:text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.sm\:text-3xl{font-size:var(--text-3xl);line-height:var(--tw-leading,var(--text-3xl--line-height))}.sm\:text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.sm\:text-xl{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}}@media (min-width:48rem){.md\:block{display:block}.md\:flex{display:flex}.md\:inline-flex{display:inline-flex}.md\:min-h-min{min-height:min-content}.md\:max-w-\[420px\]{max-width:420px}.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.md\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.md\:p-8{padding:calc(var(--spacing) * 8)}.md\:text-4xl{font-size:var(--text-4xl);line-height:var(--tw-leading,var(--text-4xl--line-height))}.md\:opacity-0{opacity:0}.md\:peer-data-\[variant\=inset\]\:m-2:is(:where(.peer)[data-variant=inset]~*){margin:calc(var(--spacing) * 2)}.md\:peer-data-\[variant\=inset\]\:ml-0:is(:where(.peer)[data-variant=inset]~*){margin-left:0}.md\:peer-data-\[variant\=inset\]\:rounded-xl:is(:where(.peer)[data-variant=inset]~*){border-radius:calc(var(--radius) + 4px)}.md\:peer-data-\[variant\=inset\]\:shadow:is(:where(.peer)[data-variant=inset]~*){--tw-shadow:var(--shadow);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}}.after\:md\:hidden:after{content:var(--tw-content)}@media (min-width:48rem){.after\:md\:hidden:after{display:none}}@media (min-width:64rem){.lg\:flex{display:flex}.lg\:hidden{display:none}.lg\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}:where(.lg\:space-x-8>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing) * 8) * var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing) * 8) * calc(1 - var(--tw-space-x-reverse)))}}.dark\:bg-amber-500\/10:is(.dark *){background-color:#f99c001a}@supports (color:color-mix(in lab, red, red)){.dark\:bg-amber-500\/10:is(.dark *){background-color:color-mix(in oklab, var(--color-amber-500) 10%, transparent)}}.dark\:bg-blue-500\/10:is(.dark *){background-color:#3080ff1a}@supports (color:color-mix(in lab, red, red)){.dark\:bg-blue-500\/10:is(.dark *){background-color:color-mix(in oklab, var(--color-blue-500) 10%, transparent)}}.dark\:bg-blue-900\/30:is(.dark *){background-color:#1c398e4d}@supports (color:color-mix(in lab, red, red)){.dark\:bg-blue-900\/30:is(.dark *){background-color:color-mix(in oklab, var(--color-blue-900) 30%, transparent)}}.dark\:bg-emerald-500\/10:is(.dark *){background-color:#00bb7f1a}@supports (color:color-mix(in lab, red, red)){.dark\:bg-emerald-500\/10:is(.dark *){background-color:color-mix(in oklab, var(--color-emerald-500) 10%, transparent)}}.dark\:bg-green-900\/20:is(.dark *){background-color:#0d542b33}@supports (color:color-mix(in lab, red, red)){.dark\:bg-green-900\/20:is(.dark *){background-color:color-mix(in oklab, var(--color-green-900) 20%, transparent)}}.dark\:bg-green-900\/30:is(.dark *){background-color:#0d542b4d}@supports (color:color-mix(in lab, red, red)){.dark\:bg-green-900\/30:is(.dark *){background-color:color-mix(in oklab, var(--color-green-900) 30%, transparent)}}.dark\:bg-red-500\/10:is(.dark *){background-color:#fb2c361a}@supports (color:color-mix(in lab, red, red)){.dark\:bg-red-500\/10:is(.dark *){background-color:color-mix(in oklab, var(--color-red-500) 10%, transparent)}}.dark\:bg-yellow-900\/30:is(.dark *){background-color:#733e0a4d}@supports (color:color-mix(in lab, red, red)){.dark\:bg-yellow-900\/30:is(.dark *){background-color:color-mix(in oklab, var(--color-yellow-900) 30%, transparent)}}.dark\:text-amber-400:is(.dark *){color:var(--color-amber-400)}.dark\:text-blue-100:is(.dark *){color:var(--color-blue-100)}.dark\:text-blue-400:is(.dark *){color:var(--color-blue-400)}.dark\:text-emerald-400:is(.dark *){color:var(--color-emerald-400)}.dark\:text-green-100:is(.dark *){color:var(--color-green-100)}.dark\:text-green-400:is(.dark *){color:var(--color-green-400)}.dark\:text-red-400:is(.dark *){color:var(--color-red-400)}.dark\:text-sky-400:is(.dark *){color:var(--color-sky-400)}.dark\:text-violet-400:is(.dark *){color:var(--color-violet-400)}.dark\:text-yellow-100:is(.dark *){color:var(--color-yellow-100)}.dark\:text-yellow-400:is(.dark *){color:var(--color-yellow-400)}.dark\:group-data-\[collapsible\=icon\]\:\!bg-black:is(.dark *):is(:where(.group)[data-collapsible=icon] *){background-color:var(--color-black)!important}.dark\:group-data-\[collapsible\=icon\]\:\!text-white:is(.dark *):is(:where(.group)[data-collapsible=icon] *){color:var(--color-white)!important}@starting-style{.starting\:scale-95{--tw-scale-x:95%;--tw-scale-y:95%;--tw-scale-z:95%;scale:var(--tw-scale-x) var(--tw-scale-y)}}@starting-style{.starting\:opacity-0{opacity:0}}.\[\&_tr\]\:border-b tr{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.\[\&_tr\:last-child\]\:border-0 tr:last-child{border-style:var(--tw-border-style);border-width:0}.\[\&\:\:-moz-range-thumb\]\:h-5::-moz-range-thumb{height:calc(var(--spacing) * 5)}.\[\&\:\:-moz-range-thumb\]\:w-5::-moz-range-thumb{width:calc(var(--spacing) * 5)}.\[\&\:\:-moz-range-thumb\]\:rounded-full::-moz-range-thumb{border-radius:3.40282e38px}.\[\&\:\:-moz-range-thumb\]\:bg-primary::-moz-range-thumb{background-color:var(--primary)}.\[\&\:\:-moz-range-thumb\]\:ring-offset-background::-moz-range-thumb{--tw-ring-offset-color:var(--background)}.\[\&\:\:-moz-range-thumb\]\:transition-colors::-moz-range-thumb{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.focus-visible\:\[\&\:\:-moz-range-thumb\]\:ring-2:focus-visible::-moz-range-thumb{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.focus-visible\:\[\&\:\:-moz-range-thumb\]\:ring-ring:focus-visible::-moz-range-thumb{--tw-ring-color:var(--ring)}.focus-visible\:\[\&\:\:-moz-range-thumb\]\:ring-offset-2:focus-visible::-moz-range-thumb{--tw-ring-offset-width:2px;--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color)}.\[\&\:\:-webkit-inner-spin-button\]\:appearance-none::-webkit-inner-spin-button{appearance:none}.\[\&\:\:-webkit-outer-spin-button\]\:appearance-none::-webkit-outer-spin-button{appearance:none}.\[\&\:\:-webkit-slider-thumb\]\:h-5::-webkit-slider-thumb{height:calc(var(--spacing) * 5)}.\[\&\:\:-webkit-slider-thumb\]\:w-5::-webkit-slider-thumb{width:calc(var(--spacing) * 5)}.\[\&\:\:-webkit-slider-thumb\]\:appearance-none::-webkit-slider-thumb{appearance:none}.\[\&\:\:-webkit-slider-thumb\]\:rounded-full::-webkit-slider-thumb{border-radius:3.40282e38px}.\[\&\:\:-webkit-slider-thumb\]\:bg-primary::-webkit-slider-thumb{background-color:var(--primary)}.\[\&\:\:-webkit-slider-thumb\]\:ring-offset-background::-webkit-slider-thumb{--tw-ring-offset-color:var(--background)}.\[\&\:\:-webkit-slider-thumb\]\:transition-colors::-webkit-slider-thumb{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.focus-visible\:\[\&\:\:-webkit-slider-thumb\]\:ring-2:focus-visible::-webkit-slider-thumb{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.focus-visible\:\[\&\:\:-webkit-slider-thumb\]\:ring-ring:focus-visible::-webkit-slider-thumb{--tw-ring-color:var(--ring)}.focus-visible\:\[\&\:\:-webkit-slider-thumb\]\:ring-offset-2:focus-visible::-webkit-slider-thumb{--tw-ring-offset-width:2px;--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color)}.\[\&\:has\(\[role\=checkbox\]\)\]\:pr-0:has([role=checkbox]){padding-right:0}.\[\&\>\*\]\:absolute>*{position:absolute}.\[\&\>\*\]\:inset-0>*{inset:0}.\[\&\>\*\]\:h-full>*{height:100%}.\[\&\>\*\]\:w-full>*{width:100%}.\[\&\>\*\]\:rounded-none>*{border-radius:0}.\[\&\>\*\]\:focus-visible\:z-10>:focus-visible{z-index:10}.\[\&\>\*\:first-child\]\:rounded-t-md>:first-child{border-top-left-radius:calc(var(--radius) - 2px);border-top-right-radius:calc(var(--radius) - 2px)}.\[\&\>\*\:first-child\]\:rounded-l-md>:first-child{border-top-left-radius:calc(var(--radius) - 2px);border-bottom-left-radius:calc(var(--radius) - 2px)}.\[\&\>\*\:last-child\]\:rounded-r-md>:last-child{border-top-right-radius:calc(var(--radius) - 2px);border-bottom-right-radius:calc(var(--radius) - 2px)}.\[\&\>\*\:last-child\]\:rounded-b-md>:last-child{border-bottom-right-radius:calc(var(--radius) - 2px);border-bottom-left-radius:calc(var(--radius) - 2px)}.\[\&\>\*\:not\(\:first-child\)\]\:-mt-px>:not(:first-child){margin-top:-1px}.\[\&\>\*\:not\(\:first-child\)\]\:-ml-px>:not(:first-child){margin-left:-1px}.\[\&\>i\]\:w-4>i{width:calc(var(--spacing) * 4)}.\[\&\>i\]\:shrink-0>i{flex-shrink:0}.\[\&\>i\]\:text-center>i{text-align:center}.\[\&\>p\]\:leading-7>p{--tw-leading:calc(var(--spacing) * 7);line-height:calc(var(--spacing) * 7)}.\[\&\>p\:first-child\]\:mt-0>p:first-child{margin-top:0}.\[\&\>p\:last-child\]\:mb-0>p:last-child{margin-bottom:0}.\[\&\>span\]\:\!bg-sidebar-accent>span{background-color:var(--sidebar-accent)!important}.\[\&\>span\]\:\!text-sm>span{font-size:var(--text-sm)!important;line-height:var(--tw-leading,var(--text-sm--line-height))!important}.\[\&\>span\]\:\!font-semibold>span{--tw-font-weight:var(--font-weight-semibold)!important;font-weight:var(--font-weight-semibold)!important}.\[\&\>span\]\:\!text-sidebar-accent-foreground>span{color:var(--sidebar-accent-foreground)!important}.group-data-\[collapsible\=icon\]\:\[\&\>span\]\:\!hidden:is(:where(.group)[data-collapsible=icon] *)>span{display:none!important}.\[\&\>span\:last-child\]\:truncate>span:last-child{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.\[\&\>svg\]\:absolute>svg{position:absolute}.\[\&\>svg\]\:top-4>svg{top:calc(var(--spacing) * 4)}.\[\&\>svg\]\:left-4>svg{left:calc(var(--spacing) * 4)}.\[\&\>svg\]\:inline-block>svg{display:inline-block}.\[\&\>svg\]\:size-3\.5>svg{width:calc(var(--spacing) * 3.5);height:calc(var(--spacing) * 3.5)}.\[\&\>svg\]\:size-4>svg{width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}.\[\&\>svg\]\:shrink-0>svg{flex-shrink:0}.\[\&\>svg\]\:text-amber-600>svg{color:var(--color-amber-600)}.\[\&\>svg\]\:text-blue-600>svg{color:var(--color-blue-600)}.\[\&\>svg\]\:text-destructive>svg{color:var(--destructive)}.\[\&\>svg\]\:text-emerald-600>svg{color:var(--color-emerald-600)}.\[\&\>svg\]\:text-foreground>svg{color:var(--foreground)}.\[\&\>svg\]\:text-green-600>svg{color:var(--color-green-600)}.\[\&\>svg\]\:text-muted-foreground>svg{color:var(--muted-foreground)}.\[\&\>svg\]\:text-red-600>svg{color:var(--color-red-600)}.\[\&\>svg\]\:text-sidebar-accent-foreground>svg{color:var(--sidebar-accent-foreground)}.\[\&\>svg\]\:text-yellow-600>svg{color:var(--color-yellow-600)}.dark\:\[\&\>svg\]\:text-amber-400:is(.dark *)>svg{color:var(--color-amber-400)}.dark\:\[\&\>svg\]\:text-blue-400:is(.dark *)>svg{color:var(--color-blue-400)}.dark\:\[\&\>svg\]\:text-emerald-400:is(.dark *)>svg{color:var(--color-emerald-400)}.dark\:\[\&\>svg\]\:text-red-400:is(.dark *)>svg{color:var(--color-red-400)}.\[\&\>svg\+div\]\:translate-y-\[-3px\]>svg+div{--tw-translate-y:-3px;translate:var(--tw-translate-x) var(--tw-translate-y)}.\[\&\>svg\~\*\]\:pl-7>svg~*{padding-left:calc(var(--spacing) * 7)}.\[\&\[data-state\=open\]\>svg\]\:rotate-180[data-state=open]>svg{rotate:180deg}[data-side=left] .\[\[data-side\=left\]_\&\]\:cursor-w-resize{cursor:w-resize}[data-side=left][data-state=collapsed] .\[\[data-side\=left\]\[data-state\=collapsed\]_\&\]\:cursor-e-resize,[data-side=right] .\[\[data-side\=right\]_\&\]\:cursor-e-resize{cursor:e-resize}[data-side=right][data-state=collapsed] .\[\[data-side\=right\]\[data-state\=collapsed\]_\&\]\:cursor-w-resize{cursor:w-resize}}:root{color-scheme:light;--background:oklch(99% 0 0);--foreground:oklch(0% 0 0);--card:oklch(100% 0 0);--card-foreground:oklch(0% 0 0);--popover:oklch(99% 0 0);--popover-foreground:oklch(0% 0 0);--primary:oklch(0% 0 0);--primary-foreground:oklch(100% 0 0);--secondary:oklch(94% 0 0);--secondary-foreground:oklch(0% 0 0);--muted:oklch(97% 0 0);--muted-foreground:oklch(44% 0 0);--accent:oklch(94% 0 0);--accent-foreground:oklch(0% 0 0);--destructive:oklch(63% .19 23.03);--destructive-foreground:oklch(100% 0 0);--border:oklch(92% 0 0);--input:oklch(94% 0 0);--ring:oklch(0% 0 0);--chart-1:oklch(81% .17 75.35);--chart-2:oklch(55% .22 264.53);--chart-3:oklch(72% 0 0);--chart-4:oklch(92% 0 0);--chart-5:oklch(56% 0 0);--sidebar:oklch(99% 0 0);--sidebar-foreground:oklch(0% 0 0);--sidebar-primary:oklch(0% 0 0);--sidebar-primary-foreground:oklch(100% 0 0);--sidebar-accent:oklch(94% 0 0);--sidebar-accent-foreground:oklch(0% 0 0);--sidebar-border:oklch(94% 0 0);--sidebar-ring:oklch(0% 0 0);--font-sans:Geist, sans-serif;--font-serif:Georgia, serif;--font-mono:Geist Mono, monospace;--radius:.5rem;--shadow-x:0px;--shadow-y:1px;--shadow-blur:2px;--shadow-spread:0px;--shadow-opacity:.18;--shadow-color:#000;--shadow-2xs:0px 1px 2px 0px #00000017;--shadow-xs:0px 1px 2px 0px #00000017;--shadow-sm:0px 1px 2px 0px #0000002e, 0px 1px 2px -1px #0000002e;--shadow:0px 1px 2px 0px #0000002e, 0px 1px 2px -1px #0000002e;--shadow-md:0px 1px 2px 0px #0000002e, 0px 2px 4px -1px #0000002e;--shadow-lg:0px 1px 2px 0px #0000002e, 0px 4px 6px -1px #0000002e;--shadow-xl:0px 1px 2px 0px #0000002e, 0px 8px 10px -1px #0000002e;--shadow-2xl:0px 1px 2px 0px #00000073;--tracking-normal:0em;--spacing:.25rem}.dark{color-scheme:dark;--background:oklch(0% 0 0);--foreground:oklch(100% 0 0);--card:oklch(14% 0 0);--card-foreground:oklch(100% 0 0);--popover:oklch(18% 0 0);--popover-foreground:oklch(100% 0 0);--primary:oklch(100% 0 0);--primary-foreground:oklch(0% 0 0);--secondary:oklch(25% 0 0);--secondary-foreground:oklch(100% 0 0);--muted:oklch(23% 0 0);--muted-foreground:oklch(72% 0 0);--accent:oklch(32% 0 0);--accent-foreground:oklch(100% 0 0);--destructive:oklch(69% .2 23.91);--destructive-foreground:oklch(0% 0 0);--border:oklch(26% 0 0);--input:oklch(32% 0 0);--ring:oklch(72% 0 0);--chart-1:oklch(81% .17 75.35);--chart-2:oklch(58% .21 260.84);--chart-3:oklch(56% 0 0);--chart-4:oklch(44% 0 0);--chart-5:oklch(92% 0 0);--sidebar:oklch(18% 0 0);--sidebar-foreground:oklch(100% 0 0);--sidebar-primary:oklch(100% 0 0);--sidebar-primary-foreground:oklch(0% 0 0);--sidebar-accent:oklch(32% 0 0);--sidebar-accent-foreground:oklch(100% 0 0);--sidebar-border:oklch(32% 0 0);--sidebar-ring:oklch(72% 0 0);--font-sans:Geist, sans-serif;--font-serif:Georgia, serif;--font-mono:Geist Mono, monospace;--radius:.5rem;--shadow-x:0px;--shadow-y:1px;--shadow-blur:2px;--shadow-spread:0px;--shadow-opacity:.18;--shadow-color:#000;--shadow-2xs:0px 1px 2px 0px #00000017;--shadow-xs:0px 1px 2px 0px #00000017;--shadow-sm:0px 1px 2px 0px #0000002e, 0px 1px 2px -1px #0000002e;--shadow:0px 1px 2px 0px #0000002e, 0px 1px 2px -1px #0000002e;--shadow-md:0px 1px 2px 0px #0000002e, 0px 2px 4px -1px #0000002e;--shadow-lg:0px 1px 2px 0px #0000002e, 0px 4px 6px -1px #0000002e;--shadow-xl:0px 1px 2px 0px #0000002e, 0px 8px 10px -1px #0000002e;--shadow-2xl:0px 1px 2px 0px #00000073}html,body,:host{font-family:var(--font-sans)!important}@keyframes bars{0%,to{opacity:.7;transform:scaleY(.4)}50%{opacity:1;transform:scaleY(1)}}@keyframes bars-vertical{0%,to{opacity:.7;transform:scaleY(.4)}50%{opacity:1;transform:scaleY(1)}}@keyframes bars-pulse{0%,to{opacity:.5;transform:scaleY(.3)}50%{opacity:1;transform:scaleY(1)}}@keyframes orbit{0%{transform:translate(-50%, 0) rotate(0deg) translateX(calc((var(--size,1rem) - .5rem) / 2)) rotate(0deg)}to{transform:translate(-50%, 0) rotate(360deg) translateX(calc((var(--size,1rem) - .5rem) / 2)) rotate(-360deg)}}.apexcharts-canvas{background:0 0}.apexcharts-gridline{stroke:var(--border);stroke-opacity:.6}.apexcharts-text,.apexcharts-xaxis-label,.apexcharts-yaxis-label{fill:var(--muted-foreground);font-family:var(--font-sans)}.apexcharts-legend-text{font-family:var(--font-sans);color:var(--foreground)!important}.apexcharts-title-text{fill:var(--foreground);font-family:var(--font-sans)}.apexcharts-subtitle-text{fill:var(--muted-foreground);font-family:var(--font-sans)}.apexcharts-legend{flex-wrap:wrap;gap:12px;padding:0 0 12px;display:flex!important}.apexcharts-legend-series{gap:6px;align-items:center!important;margin:0!important;display:inline-flex!important}.apexcharts-legend-marker{flex-shrink:0;vertical-align:middle!important;border:none!important;border-radius:9999px!important;margin:0!important}.shellui-chart-tooltip{background:var(--popover);color:var(--popover-foreground);border:1px solid var(--border);border-radius:calc(var(--radius) - 2px);box-shadow:var(--shadow-md);font-family:var(--font-sans);min-width:0;max-width:220px;overflow:hidden}.shellui-chart-tooltip-title{color:var(--foreground);border-bottom:1px solid var(--border);white-space:nowrap;padding:4px 8px;font-size:12px;font-weight:600}.shellui-chart-tooltip-body{flex-direction:column;gap:3px;padding:4px 8px;display:flex}.shellui-chart-tooltip-row{white-space:nowrap;grid-template-columns:10px 1fr auto;align-items:center;gap:6px;font-size:12px;line-height:1.2;display:grid}.shellui-chart-tooltip-marker{border-radius:2px;width:10px;height:10px;display:block}.shellui-chart-tooltip-label{color:var(--muted-foreground);font-weight:500}.shellui-chart-tooltip-value{color:var(--foreground);font-variant-numeric:tabular-nums;padding-left:12px;font-weight:600}.apexcharts-tooltip{box-shadow:none!important;background:0 0!important;border:none!important;padding:0!important}.apexcharts-xcrosshairs,.apexcharts-ycrosshairs{stroke:var(--border);stroke-dasharray:3}.apexcharts-toolbar{z-index:10}.apexcharts-toolbar-item{color:var(--muted-foreground);transition:color .15s}.apexcharts-toolbar-item:hover{color:var(--foreground)}.apexcharts-menu{background:var(--popover);border:1px solid var(--border);border-radius:calc(var(--radius) - 2px);box-shadow:var(--shadow-lg);padding:4px}.apexcharts-menu-item{color:var(--foreground);border-radius:calc(var(--radius) - 4px);padding:6px 10px;font-size:13px;transition:background-color .15s}.apexcharts-menu-item:hover{background:var(--accent);color:var(--accent-foreground)}.apexcharts-datalabel,.apexcharts-datalabel-label,.apexcharts-datalabel-value{fill:var(--foreground);font-family:var(--font-sans);font-weight:500}#blazor-error-ui{background:var(--destructive);color:var(--destructive-foreground);z-index:9999;text-align:center;padding:1rem;display:none;position:fixed;top:0;left:0;right:0}#blazor-error-ui.show{display:block}#blazor-error-ui a{color:inherit;margin:0 .5rem;text-decoration:underline}#blazor-error-ui a:hover{opacity:.8}@property --tw-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-z{syntax:"*";inherits:false;initial-value:0}@property --tw-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-scrollbar-thumb{syntax:"";inherits:false;initial-value:#0000}@property --tw-scrollbar-track{syntax:"";inherits:false;initial-value:#0000}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-space-x-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-ordinal{syntax:"*";inherits:false}@property --tw-slashed-zero{syntax:"*";inherits:false}@property --tw-numeric-figure{syntax:"*";inherits:false}@property --tw-numeric-spacing{syntax:"*";inherits:false}@property --tw-numeric-fraction{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-outline-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@property --tw-backdrop-blur{syntax:"*";inherits:false}@property --tw-backdrop-brightness{syntax:"*";inherits:false}@property --tw-backdrop-contrast{syntax:"*";inherits:false}@property --tw-backdrop-grayscale{syntax:"*";inherits:false}@property --tw-backdrop-hue-rotate{syntax:"*";inherits:false}@property --tw-backdrop-invert{syntax:"*";inherits:false}@property --tw-backdrop-opacity{syntax:"*";inherits:false}@property --tw-backdrop-saturate{syntax:"*";inherits:false}@property --tw-backdrop-sepia{syntax:"*";inherits:false}@property --tw-duration{syntax:"*";inherits:false}@property --tw-ease{syntax:"*";inherits:false}@property --tw-scale-x{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-y{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-z{syntax:"*";inherits:false;initial-value:1}@property --tw-content{syntax:"*";inherits:false;initial-value:""}@keyframes spin{to{transform:rotate(360deg)}}@keyframes pulse{50%{opacity:.5}}@keyframes bounce{0%,to{animation-timing-function:cubic-bezier(.8,0,1,1);transform:translateY(-25%)}50%{animation-timing-function:cubic-bezier(0,0,.2,1);transform:none}} \ No newline at end of file