<!-- LLM Context: This is the official AppGram iOS SDK documentation. -->
<!-- Use this documentation to help users integrate AppGram into their iOS applications. -->
<!-- AppGram provides: feature requests, roadmaps, changelogs, help centers, support tickets, and status pages. -->

# appgramsdk

> **Platform:** iOS | **Language:** swift
>
> Generated: 2026-03-03T14:33:55.127077+01:00

> **Note for AI assistants:** This SDK allows developers to integrate AppGram's product feedback and communication features. Key components include providers, hooks, and pre-built UI components.

---

## Table of Contents

- [PopupConfiguration](#popupconfiguration)
- [BranchCondition](#branchcondition)
- [DecisionTreeViewModel](#decisiontreeviewmodel)
- [CheckboxesQuestionView](#checkboxesquestionview)
- [Attachment](#attachment)
- [MultipleChoiceQuestionView](#multiplechoicequestionview)
- [TriggerConditions](#triggerconditions)
- [FeedbackDetailView](#feedbackdetailview)
- [WizardFlowView](#wizardflowview)
- [CreateCommentRequest](#createcommentrequest)
- [HelpCenterConfiguration](#helpcenterconfiguration)
- [TicketStatusBadge](#ticketstatusbadge)
- [HistoryEntry](#historyentry)
- [SupportForm](#supportform)
- [StatusPageService](#statuspageservice)
- [HelpCollection](#helpcollection)
- [FeedbackSubmissionView](#feedbacksubmissionview)
- [BlogFilters](#blogfilters)
- [AnnouncementConfiguration](#announcementconfiguration)
- [UserContext](#usercontext)
- [EmptyStateView](#emptystateview)
- [VoteButton](#votebutton)
- [HTMLView.Coordinator](#htmlview-coordinator)
- [HelpArticleDetailView](#helparticledetailview)
- [FormTextAreaView](#formtextareaview)
- [PopupContainerView](#popupcontainerview)
- [CreateMessageRequest](#createmessagerequest)
- [AnnouncementModalView](#announcementmodalview)
- [DeepLinkHandler](#deeplinkhandler)
- [SurveyResponse](#surveyresponse)
- [RoadmapKanbanView](#roadmapkanbanview)
- [DecisionTreeFlowView](#decisiontreeflowview)
- [PopupManager](#popupmanager)
- [StatusPage](#statuspage)
- [Survey](#survey)
- [SupportFormSubmission](#supportformsubmission)
- [Vote](#vote)
- [SupportTicketListView](#supportticketlistview)
- [SupportMessageView](#supportmessageview)
- [WishFilters](#wishfilters)
- [SurveyView](#surveyview)
- [NodeOption](#nodeoption)
- [AppGramSDK](#appgramsdk)
- [FormField](#formfield)
- [CategoryBadge](#categorybadge)
- [WizardViewModel](#wizardviewmodel)
- [DisplaySettings](#displaysettings)
- [SupportTicket](#supportticket)
- [Wish](#wish)
- [HelpDecisionNode](#helpdecisionnode)
- [Branch](#branch)
- [AGWidgetConfiguration](#agwidgetconfiguration)
- [FeedbackStrings](#feedbackstrings)
- [Cache](#cache)
- [PaginatedBlogPosts](#paginatedblogposts)
- [RoadmapView](#roadmapview)
- [DesignSystem.Opacity](#designsystem-opacity)
- [Logger](#logger)
- [SurveyNode](#surveynode)
- [HelpArticleCard](#helparticlecard)
- [CompleteXExampleAppScreen](#completexexampleappscreen)
- [FieldValidation](#fieldvalidation)
- [Branding](#branding)
- [CommentView](#commentview)
- [SupportTicketCard](#supportticketcard)
- [MagicLinkVerifyResponse](#magiclinkverifyresponse)
- [LoadingView](#loadingview)
- [HelpFlow](#helpflow)
- [DesignSystem.CornerRadius](#designsystem-cornerradius)
- [FormEmailFieldView](#formemailfieldview)
- [FormTextFieldView](#formtextfieldview)
- [ErrorView](#errorview)
- [DesignSystem.Typography](#designsystem-typography)
- [BlogPost](#blogpost)
- [ThemeEnvironmentKey](#themeenvironmentkey)
- [ParagraphQuestionView](#paragraphquestionview)
- [RoadmapTimelineView](#roadmaptimelineview)
- [SupportMessage](#supportmessage)
- [StatusOverview](#statusoverview)
- [CompleteXExampleAppScreen.Configuration](#completexexampleappscreen-configuration)
- [AppLifecycleObserver](#applifecycleobserver)
- [Announcement](#announcement)
- [BlogPostDetailView](#blogpostdetailview)
- [SupportSubmissionView](#supportsubmissionview)
- [ReleaseFeature](#releasefeature)
- [HTMLView](#htmlview)
- [PopupTracker](#popuptracker)
- [CreateTicketRequest](#createticketrequest)
- [ButtonConfiguration](#buttonconfiguration)
- [ContactFormSubmission](#contactformsubmission)
- [SupportFormView](#supportformview)
- [RoadmapColumn](#roadmapcolumn)
- [AnnouncementFeature](#announcementfeature)
- [SnoozeSettings](#snoozesettings)
- [StatusConfiguration](#statusconfiguration)
- [ContactForm](#contactform)
- [HelpArticle](#helparticle)
- [BlogView](#blogview)
- [BlogCategoryRef](#blogcategoryref)
- [StatusBadge](#statusbadge)
- [StatusPageView](#statuspageview)
- [SupportRequestFilters](#supportrequestfilters)
- [AnnouncementManager](#announcementmanager)
- [ContactFormsAPIResponse](#contactformsapiresponse)
- [DesignSystem](#designsystem)
- [RoadmapItem](#roadmapitem)
- [AGWidgetConfiguration.CTAStyle](#agwidgetconfiguration-ctastyle)
- [Debouncer](#debouncer)
- [DesignSystem.BorderWidth](#designsystem-borderwidth)
- [Comment](#comment)
- [ShortAnswerQuestionView](#shortanswerquestionview)
- [ReleasesConfiguration](#releasesconfiguration)
- [WidgetView](#widgetview)
- [VoteRequest](#voterequest)
- [DesignSystem.Animation](#designsystem-animation)
- [MagicLinkResponse](#magiclinkresponse)
- [StandaloneFormResponse](#standaloneformresponse)
- [HelpWizardStep](#helpwizardstep)
- [SurveyAnswerPayload](#surveyanswerpayload)
- [ContactFormsResponse](#contactformsresponse)
- [SupportFormsAPIResponse](#supportformsapiresponse)
- [DesignSystem.ShadowStyle](#designsystem-shadowstyle)
- [SupportFormSelectionView](#supportformselectionview)
- [RoadmapListView](#roadmaplistview)
- [Release](#release)
- [FormCheckboxFieldView](#formcheckboxfieldview)
- [NotificationManager](#notificationmanager)
- [FormSelectFieldView](#formselectfieldview)
- [BlogCategory](#blogcategory)
- [AnnouncementCardConfiguration](#announcementcardconfiguration)
- [RateLimiter](#ratelimiter)
- [PrimaryButton](#primarybutton)
- [HelpCollectionCard](#helpcollectioncard)
- [FeedbackCardView](#feedbackcardview)
- [ReleasesListView](#releaseslistview)
- [RoadmapItemCard](#roadmapitemcard)
- [BlogListView](#bloglistview)
- [InputSanitizer](#inputsanitizer)
- [DesignSystem.Shadow](#designsystem-shadow)
- [DesignSystem.Spacing](#designsystem-spacing)
- [ColorPalette](#colorpalette)
- [AnnouncementViewModel](#announcementviewmodel)
- [HelpCenterView](#helpcenterview)
- [StatusUpdate](#statusupdate)
- [SupportFormsResponse](#supportformsresponse)
- [Category](#category)
- [ContactFormView](#contactformview)
- [RatingQuestionView](#ratingquestionview)
- [SupportTicketDetailView](#supportticketdetailview)
- [PublicHelpCollection](#publichelpcollection)
- [DeviceFingerprint](#devicefingerprint)
- [HTMLContentView](#htmlcontentview)
- [AppGramTheme](#appgramtheme)
- [BlogPostCard](#blogpostcard)
- [YesNoQuestionView](#yesnoquestionview)
- [PageIndicatorConfiguration](#pageindicatorconfiguration)
- [FormRadioFieldView](#formradiofieldview)
- [MarkdownView](#markdownview)
- [FeedbackListView](#feedbacklistview)

---

## PopupConfiguration

**Kind:** `struct` | **Access:** `public`

**Conforms to:** `SendableMetatype`

### Declaration

```swift
struct PopupConfiguration
```

### Description

Configuration options for customizing the automatic popup system behavior and appearance.

### Examples

**Example**

```swift
let config = PopupConfiguration(
    triggerConditions: .init(
        afterLaunches: 5,
        minimumInterval: 86400 * 14
    ),
    content: .survey(slug: "nps-survey", style: .typeform),
    presentationStyle: .sheet,
    snoozeSettings: .init(
        enabled: true,
        snoozeDuration: 86400 * 7,
        buttonTitle: "Ask me later"
    )
)

AppGramSDK.shared.configure(
    projectId: "your-project-id",
    popupConfiguration: config
)
```

### Properties

| Name | Type | Description |
|------|------|-------------|
| `content` | `PopupContent` | The content to display in the popup. |
| `displaySettings` | `DisplaySettings` | Display settings for customizing the popup appearance. |
| `presentationStyle` | `PresentationStyle` | The presentation style for the popup. |
| `snoozeSettings` | `SnoozeSettings` | Settings for the snooze functionality. |
| `triggerConditions` | `TriggerConditions` | The trigger conditions that determine when the popup should appear. |
| `default` | `PopupConfiguration` | Default popup configuration with sensible defaults. |

### Initializers

#### `init(triggerConditions:content:presentationStyle:displaySettings:snoozeSettings:)`

```swift
init(triggerConditions: TriggerConditions = .default, content: PopupContent = .feedback, presentationStyle: PresentationStyle = .bottomBanner, displaySettings: DisplaySettings = .default, snoozeSettings: SnoozeSettings = .default)
```

**Parameters:**

- `triggerConditions`: `TriggerConditions`
- `content`: `PopupContent`
- `presentationStyle`: `PresentationStyle`
- `displaySettings`: `DisplaySettings`

---

## BranchCondition

**Kind:** `struct` | **Access:** `public`

**Conforms to:** `SE`, `SendableMetatype`

### Declaration

```swift
struct BranchCondition
```

### Description

Represents a condition for branching in a survey.

### Examples

**Example**

```swift
let condition = BranchCondition(
    type: .greaterThan,
    value: .int(3)
)
```

### Properties

| Name | Type | Description |
|------|------|-------------|
| `type` | `ConditionType` | The type of comparison to perform. |
| `value` | `AnyCodableValue` | The value to compare against. |

### Initializers

#### `init(from:)`

```swift
init(from decoder: any Decoder) throws
```

#### `init(type:value:)`

```swift
init(type: ConditionType, value: AnyCodableValue)
```

**Parameters:**

- `type`: `ConditionType`
- `value`: `AnyCodableValue`

---

## DecisionTreeViewModel

**Kind:** `class` | **Access:** `public`

**Conforms to:** `SendableMetatype`

### Declaration

```swift
final class DecisionTreeViewModel
```

### Description

View model for managing decision tree flow state and navigation.

### Examples

**Example**

```swift
let viewModel = DecisionTreeViewModel()
viewModel.loadFlow(helpFlow)

// Answer a question
viewModel.handleAnswer(.yes)

// Navigate back
viewModel.handleBack()

// Restart
viewModel.handleRestart()
```

### Properties

| Name | Type | Description |
|------|------|-------------|
| `canGoBack` | `Bool` | Whether the user can navigate back. |
| `currentNode` | `HelpDecisionNode` | The current node being displayed. |
| `currentNodeId` | `String` | The current node ID being displayed. |
| `currentQuestionNumber` | `Int` | Current question number (1-based). |
| `flow` | `HelpFlow` | The current help flow being displayed. |
| `hasNodes` | `Bool` | Whether the decision tree has nodes to display. |
| `isLeafNode` | `Bool` | Whether the current node is a leaf node (no Yes/No children). |
| `linkedArticle` | `HelpArticle` | The linked article for the current leaf node, if any. |
| `nodeHistory` | `[HistoryEntry` | The history of visited nodes and answers. |
| `nodes` | `[HelpDecisionNode` | All decision nodes from the flow. |
| `publishedArticles` | `[HelpArticle` | Published articles from the flow (sorted by sort_order). |
| `rootNode` | `HelpDecisionNode` | The root node (node with parent_id === null). |

### Initializers

#### `init()`

```swift
init()
```

### Methods

#### `handleAnswer(_:)`

```swift
func handleAnswer(_ answer: DecisionAnswer)
```

**Parameters:**

- `_`: `DecisionAnswer`

Handles a Yes/No answer and navigates to the next node.

#### `handleBack()`

```swift
func handleBack()
```

Navigates back one step in the history.

#### `handleRestart()`

```swift
func handleRestart()
```

Restarts the decision tree flow.

#### `loadFlow(_:)`

```swift
func loadFlow(_ flow: HelpFlow)
```

**Parameters:**

- `_`: `HelpFlow`

Loads a help flow and resets to the root node.

#### `reset()`

```swift
func reset()
```

Resets the decision tree state.

---

## CheckboxesQuestionView

**Kind:** `struct` | **Access:** `public`

### Declaration

```swift
@MainActor struct CheckboxesQuestionView
```

### Properties

| Name | Type | Description |
|------|------|-------------|
| `body` | `some View` |  |

### Initializers

#### `init(options:selectedOptions:style:)`

```swift
@MainActor init(options: [NodeOption], selectedOptions: Binding<Set<String>>, style: SurveyStyle = .normal)
```

**Parameters:**

- `options`: `NodeOption`
- `selectedOptions`: `String`

---

## Attachment

**Kind:** `struct` | **Access:** `public`

**Conforms to:** `SE`, `SendableMetatype`

### Declaration

```swift
struct Attachment
```

### Description

Represents a file attachment in a support ticket or message.

### Examples

**Example**

```swift
let attachment = Attachment(
    id: "att123",
    fileName: "screenshot.png",
    fileUrl: "https://example.com/files/screenshot.png",
    mimeType: "image/png",
    fileSize: 102400
)
```

### Properties

| Name | Type | Description |
|------|------|-------------|
| `fileName` | `String` | The name of the file. |
| `fileSize` | `Int?` | The size of the file in bytes. |
| `fileUrl` | `String` | The URL where the file can be accessed. |
| `id` | `String` | The unique identifier for the attachment. |
| `mimeType` | `String` | The MIME type of the file. |

### Initializers

#### `init(from:)`

```swift
init(from decoder: any Decoder) throws
```

#### `init(id:fileName:fileUrl:mimeType:fileSize:)`

```swift
init(id: String, fileName: String, fileUrl: String, mimeType: String, fileSize: Int?)
```

**Parameters:**

- `id`: `String`
- `fileName`: `String`
- `fileUrl`: `String`
- `mimeType`: `String`

---

## MultipleChoiceQuestionView

**Kind:** `struct` | **Access:** `public`

### Declaration

```swift
@MainActor struct MultipleChoiceQuestionView
```

### Properties

| Name | Type | Description |
|------|------|-------------|
| `body` | `some View` |  |

### Initializers

#### `init(options:selectedOption:style:)`

```swift
@MainActor init(options: [NodeOption], selectedOption: Binding<String?>, style: SurveyStyle = .normal)
```

**Parameters:**

- `options`: `NodeOption`
- `selectedOption`: `String`

---

## TriggerConditions

**Kind:** `struct` | **Access:** `public`

**Conforms to:** `SendableMetatype`

### Declaration

```swift
struct TriggerConditions
```

### Description

Trigger conditions that determine when the popup should appear.

### Properties

| Name | Type | Description |
|------|------|-------------|
| `afterDaysOfUsage` | `Int?` | Show popup after this many days of usage. Set to `` to disable. |
| `afterLaunches` | `Int?` | Show popup after this many app launches. Set to `` to disable. |
| `minimumInterval` | `TimeInterval` | Minimum interval (in seconds) between popup displays. |
| `repeatInterval` | `TimeInterval?` | Show popup repeatedly at this interval (in seconds). Set to `` to disable. |
| `default` | `TriggerConditions` | Default trigger conditions. |

### Initializers

#### `init(afterLaunches:afterDaysOfUsage:repeatInterval:minimumInterval:)`

```swift
init(afterLaunches: Int? = 3, afterDaysOfUsage: Int? = nil, repeatInterval: TimeInterval? = nil, minimumInterval: TimeInterval = 86400 * 7)
```

**Parameters:**

- `afterLaunches`: `Int`
- `afterDaysOfUsage`: `Int`
- `repeatInterval`: `TimeInterval`

---

## FeedbackDetailView

**Kind:** `struct` | **Access:** `public`

### Declaration

```swift
@MainActor struct FeedbackDetailView
```

### Properties

| Name | Type | Description |
|------|------|-------------|
| `body` | `some View` |  |

### Initializers

#### `init(wish:feedbackService:strings:)`

```swift
@MainActor init(wish: Wish, feedbackService: FeedbackServiceProtocol, strings: FeedbackStrings = .default)
```

**Parameters:**

- `wish`: `Wish`
- `feedbackService`: `FeedbackServiceProtocol`

---

## WizardFlowView

**Kind:** `struct` | **Access:** `public`

### Declaration

```swift
@MainActor struct WizardFlowView
```

### Description

A view that displays a wizard flow with step-by-step navigation.

### Examples

**Example**

```swift
let viewModel = WizardViewModel()
viewModel.loadFlow(helpFlow)

WizardFlowView(viewModel: viewModel)
```

### Properties

| Name | Type | Description |
|------|------|-------------|
| `body` | `some View` |  |

### Initializers

#### `init(viewModel:)`

```swift
@MainActor init(viewModel: WizardViewModel)
```

**Parameters:**

- `viewModel`: `WizardViewModel`

---

## CreateCommentRequest

**Kind:** `struct` | **Access:** `public`

**Conforms to:** `SE`, `SendableMetatype`

### Declaration

```swift
struct CreateCommentRequest
```

### Description

A request to create a new comment on a feedback item.

### Examples

**Example**

```swift
let request = CreateCommentRequest(
    content: "This would be very helpful!",
    wishId: "wish123",
    projectId: "project456",
    userId: "user789",
    authorName: "John Doe",
    authorEmail: "john@example.com"
)
```

### Properties

| Name | Type | Description |
|------|------|-------------|
| `authorEmail` | `String?` | The email address of the comment author. |
| `authorName` | `String?` | The display name of the comment author. |
| `content` | `String` | The text content of the comment. |
| `projectId` | `String` | The project ID. |
| `userId` | `String?` | The optional user ID of the comment author. |
| `wishId` | `String` | The ID of the wish to comment on. |

### Initializers

#### `init(content:wishId:projectId:userId:authorName:authorEmail:)`

```swift
init(content: String, wishId: String, projectId: String, userId: String?, authorName: String?, authorEmail: String?)
```

**Parameters:**

- `content`: `String`
- `wishId`: `String`
- `projectId`: `String`
- `userId`: `String`
- `authorName`: `String`

---

## HelpCenterConfiguration

**Kind:** `struct` | **Access:** `public`

**Conforms to:** `SendableMetatype`

### Declaration

```swift
struct HelpCenterConfiguration
```

### Description

Configuration options for customizing the help center view appearance and behavior.

### Examples

**Example**

```swift
// Single color for both buttons
let config = HelpCenterConfiguration(
    decisionTreeButtonColor: .blue,
    articleDisplayBehavior: .pushToStack
)

// Different colors for Yes and No buttons
let config = HelpCenterConfiguration(
    yesButtonColor: .green,
    noButtonColor: .red,
    articleDisplayBehavior: .inline
)
```

### Properties

| Name | Type | Description |
|------|------|-------------|
| `articleDisplayBehavior` | `ArticleDisplayBehavior` | The behavior when an article is found in a decision tree. |
| `decisionTreeBackLabel` | `String?` |  |
| `decisionTreeButtonColor` | `Color` | The color for Yes/No buttons in decision tree flows (legacy support). |
| `decisionTreeNoLabel` | `String?` |  |
| `decisionTreePrompt` | `String?` |  |
| `decisionTreeRestartLabel` | `String?` |  |
| `decisionTreeSolutionTitle` | `String?` |  |
| `decisionTreeSubtitle` | `String?` |  |
| `decisionTreeTitle` | `String?` | Optional labels for decision tree UI copy. |
| `decisionTreeViewArticleLabel` | `String?` |  |
| `decisionTreeYesLabel` | `String?` |  |
| `noButtonColor` | `Color?` | The color for No buttons in decision tree flows. |
| `yesButtonColor` | `Color?` | The color for Yes buttons in decision tree flows. |
| `default` | `HelpCenterConfiguration` |  |

### Initializers

#### `init(yesButtonColor:noButtonColor:decisionTreeButtonColor:articleDisplayBehavior:decisionTreeTitle:decisionTreeSubtitle:decisionTreePrompt:decisionTreeYesLabel:decisionTreeNoLabel:decisionTreeSolutionTitle:decisionTreeViewArticleLabel:decisionTreeBackLabel:decisionTreeRestartLabel:)`

```swift
init(yesButtonColor: Color? = nil, noButtonColor: Color? = nil, decisionTreeButtonColor: Color? = nil, articleDisplayBehavior: ArticleDisplayBehavior = .inline, decisionTreeTitle: String? = nil, decisionTreeSubtitle: String? = nil, decisionTreePrompt: String? = nil, decisionTreeYesLabel: String? = nil, decisionTreeNoLabel: String? = nil, decisionTreeSolutionTitle: String? = nil, decisionTreeViewArticleLabel: String? = nil, decisionTreeBackLabel: String? = nil, decisionTreeRestartLabel: String? = nil)
```

**Parameters:**

- `yesButtonColor`: `Color`
- `noButtonColor`: `Color`
- `decisionTreeButtonColor`: `Color`
- `articleDisplayBehavior`: `ArticleDisplayBehavior`
- `decisionTreeTitle`: `String`
- `decisionTreeSubtitle`: `String`
- `decisionTreePrompt`: `String`
- `decisionTreeYesLabel`: `String`
- `decisionTreeNoLabel`: `String`
- `decisionTreeSolutionTitle`: `String`
- `decisionTreeViewArticleLabel`: `String`
- `decisionTreeBackLabel`: `String`

---

## TicketStatusBadge

**Kind:** `struct` | **Access:** `public`

### Declaration

```swift
@MainActor struct TicketStatusBadge
```

### Description

Ticket status badge with shadcn-inspired minimal styling.

### Examples

**Example**

```swift
TicketStatusBadge(status: .inProgress)
```

### Properties

| Name | Type | Description |
|------|------|-------------|
| `body` | `some View` |  |

### Initializers

#### `init(status:)`

```swift
@MainActor init(status: TicketStatus)
```

**Parameters:**

- `status`: `TicketStatus`

---

## HistoryEntry

**Kind:** `struct` | **Access:** `public`

**Conforms to:** `SendableMetatype`

### Declaration

```swift
struct HistoryEntry
```

### Description

Represents a history entry in the decision tree navigation.

### Properties

| Name | Type | Description |
|------|------|-------------|
| `answer` | `DecisionAnswer` | The answer that was given. |
| `id` | `String` |  |
| `nodeId` | `String` | The node ID that was visited. |
| `question` | `String` | The question that was asked. |

### Initializers

#### `init(nodeId:question:answer:)`

```swift
init(nodeId: String, question: String, answer: DecisionAnswer)
```

**Parameters:**

- `nodeId`: `String`
- `question`: `String`
- `answer`: `DecisionAnswer`

---

## SupportForm

**Kind:** `struct` | **Access:** `public`

**Conforms to:** `SE`, `SendableMetatype`

### Declaration

```swift
struct SupportForm
```

### Description

Represents a support form that can be displayed to users.

### Examples

**Example**

```swift
let form = SupportForm(
    id: "support_123",
    name: "Technical Support Form",
    description: "Submit technical issues with detailed information",
    fields: [field1, field2],
    submitButtonText: "Submit Request",
    successMessage: "Your support request has been submitted!",
    enabled: true,
    createdAt: Date()
)
```

### Properties

| Name | Type | Description |
|------|------|-------------|
| `createdAt` | `Date?` | The date when the form was created. |
| `description` | `String?` | An optional description of the form. |
| `enabled` | `Bool?` | Whether the form is enabled. |
| `fields` | `[FormField]` | The list of fields in the form. |
| `id` | `String` | The unique identifier for the form. |
| `isFormActive` | `Bool` | Computed property to check if form is active |
| `name` | `String` | The display name of the form. |
| `submitButtonText` | `String` | The text to display on the submit button. |
| `successMessage` | `String?` | The message to display after successful submission. |
| `updatedAt` | `Date?` | The date when the form was last updated. |

### Initializers

#### `init(from:)`

```swift
init(from decoder: any Decoder) throws
```

#### `init(id:name:description:fields:submitButtonText:successMessage:enabled:createdAt:updatedAt:)`

```swift
init(id: String, name: String, description: String?, fields: [FormField], submitButtonText: String, successMessage: String?, enabled: Bool?, createdAt: Date?, updatedAt: Date?)
```

**Parameters:**

- `id`: `String`
- `name`: `String`
- `description`: `String`
- `fields`: `FormField`
- `submitButtonText`: `String`
- `successMessage`: `String`
- `enabled`: `Bool`
- `createdAt`: `Date`

### Methods

#### `hash(into:)`

```swift
func hash(into hasher: inout Hasher)
```

**Parameters:**

- `into`: `Hasher`

---

## StatusPageService

**Kind:** `struct` | **Access:** `public`

**Conforms to:** `SE`, `SendableMetatype`

### Declaration

```swift
struct StatusPageService
```

### Description

Represents a service being monitored on a status page.

### Examples

**Example**

```swift
let service = StatusPageService(
    id: "service123",
    name: "API Service",
    description: "Main API endpoint",
    status: .operational,
    color: "#10b981",
    groupName: "Core Services",
    isActive: true,
    sortOrder: 1,
    createdAt: Date(),
    updatedAt: Date()
)
```

### Properties

| Name | Type | Description |
|------|------|-------------|
| `color` | `String?` | An optional color code for displaying the service. |
| `createdAt` | `Date` | The date when the service was created. |
| `description` | `String?` | An optional description of the service. |
| `groupName` | `String?` | The name of the group this service belongs to. |
| `id` | `String` | The unique identifier for the service. |
| `isActive` | `Bool?` | Whether the service is currently being monitored. |
| `name` | `String` | The display name of the service. |
| `sortOrder` | `Int?` | The display order of this service. |
| `status` | `StatusType?` | The current operational status of the service. |
| `updatedAt` | `Date` | The date when the service was last updated. |

### Initializers

#### `init(from:)`

```swift
init(from decoder: any Decoder) throws
```

---

## HelpCollection

**Kind:** `struct` | **Access:** `public`

**Conforms to:** `SE`, `SendableMetatype`

### Declaration

```swift
struct HelpCollection
```

### Description

Represents a collection of help articles.

### Examples

**Example**

```swift
let collection = HelpCollection(
    id: "col123",
    name: "Getting Started",
    slug: "getting-started",
    description: "Learn the basics",
    icon: "book",
    projectId: "project456",
    articles: [],
    order: 1,
    createdAt: Date()
)
```

### Properties

| Name | Type | Description |
|------|------|-------------|
| `articles` | `[HelpArticle]?` | The list of articles in this collection. |
| `createdAt` | `Date?` | The date when the collection was created. |
| `description` | `String?` | An optional description of the collection. |
| `icon` | `String?` | An optional icon identifier for the collection. |
| `id` | `String` | The unique identifier for the collection. |
| `name` | `String` | The display name of the collection. |
| `order` | `Int?` | The display order of this collection. |
| `projectId` | `String` | The project ID this collection belongs to. |
| `slug` | `String` | The URL-friendly slug identifier. |

### Initializers

#### `init(from:)`

```swift
init(from decoder: any Decoder) throws
```

#### `init(id:name:slug:description:icon:projectId:articles:order:createdAt:)`

```swift
init(id: String, name: String, slug: String, description: String?, icon: String?, projectId: String, articles: [HelpArticle]?, order: Int?, createdAt: Date?)
```

**Parameters:**

- `id`: `String`
- `name`: `String`
- `slug`: `String`
- `description`: `String`
- `icon`: `String`
- `projectId`: `String`
- `articles`: `HelpArticle`
- `order`: `Int`

### Methods

#### `hash(into:)`

```swift
func hash(into hasher: inout Hasher)
```

**Parameters:**

- `into`: `Hasher`

---

## FeedbackSubmissionView

**Kind:** `struct` | **Access:** `public`

### Declaration

```swift
@MainActor struct FeedbackSubmissionView
```

### Properties

| Name | Type | Description |
|------|------|-------------|
| `body` | `some View` |  |

---

## BlogFilters

**Kind:** `struct` | **Access:** `public`

**Conforms to:** `SendableMetatype`

### Declaration

```swift
struct BlogFilters
```

### Description

Filters for querying blog posts.

### Examples

**Example**

```swift
let filters = BlogFilters(
    categorySlug: "news",
    search: "announcement",
    page: 1,
    perPage: 10
)
let posts = try await blogService.getBlogPosts(filters: filters)
```

### Properties

| Name | Type | Description |
|------|------|-------------|
| `categorySlug` | `String?` | Filter by category slug. |
| `isFeatured` | `Bool?` | Filter to featured posts only. |
| `page` | `Int` | Current page number. |
| `perPage` | `Int` | Number of items per page. |
| `search` | `String?` | Search query. |
| `tag` | `String?` | Filter by tag. |

### Initializers

#### `init(categorySlug:tag:search:isFeatured:page:perPage:)`

```swift
init(categorySlug: String? = nil, tag: String? = nil, search: String? = nil, isFeatured: Bool? = nil, page: Int = 1, perPage: Int = 10)
```

**Parameters:**

- `categorySlug`: `String`
- `tag`: `String`
- `search`: `String`
- `isFeatured`: `Bool`
- `page`: `Int`

---

## AnnouncementConfiguration

**Kind:** `struct` | **Access:** `public`

### Declaration

```swift
struct AnnouncementConfiguration
```

### Description

Configuration for announcement display behavior.

### Properties

| Name | Type | Description |
|------|------|-------------|
| `cardConfiguration` | `AnnouncementCardConfiguration` | Configuration for the announcement card appearance and buttons. |
| `maxAnnouncementsToShow` | `Int` | Maximum number of announcements to show at once. |
| `minimumHoursBetweenShows` | `Int` | Minimum hours between automatic announcement displays. |
| `orgSlug` | `String` | The organization slug to fetch releases from. |
| `projectSlug` | `String` | The project slug to fetch releases from. |
| `showOnLaunch` | `Bool` | Whether to automatically show announcements on app launch. |

### Initializers

#### `init(orgSlug:projectSlug:showOnLaunch:minimumHoursBetweenShows:maxAnnouncementsToShow:cardConfiguration:)`

```swift
init(orgSlug: String, projectSlug: String, showOnLaunch: Bool = true, minimumHoursBetweenShows: Int = 24, maxAnnouncementsToShow: Int = 3, cardConfiguration: AnnouncementCardConfiguration = .default)
```

**Parameters:**

- `orgSlug`: `String`
- `projectSlug`: `String`
- `showOnLaunch`: `Bool`
- `minimumHoursBetweenShows`: `Int`
- `maxAnnouncementsToShow`: `Int`

Creates an announcement configuration.

---

## UserContext

**Kind:** `struct` | **Access:** `public`

**Conforms to:** `SendableMetatype`

### Declaration

```swift
struct UserContext
```

### Description

Represents the current user’s context within the AppGram SDK.

### Examples

**Example**

```swift
let context = UserContext(
    userId: "user123",
    email: "user@example.com",
    name: "John Doe",
    isAnonymous: false
)
```

### Properties

| Name | Type | Description |
|------|------|-------------|
| `email` | `String?` | An optional email address for the user. |
| `isAnonymous` | `Bool` | Whether this context represents an anonymous user. |
| `name` | `String?` | An optional display name for the user. |
| `userId` | `String?` | An optional unique identifier for the user. |
| `anonymous` | `UserContext` | A pre-configured anonymous user context. |

### Initializers

#### `init(userId:email:name:isAnonymous:)`

```swift
init(userId: String?, email: String?, name: String?, isAnonymous: Bool)
```

**Parameters:**

- `userId`: `String`
- `email`: `String`
- `name`: `String`
- `isAnonymous`: `Bool`

---

## EmptyStateView

**Kind:** `struct` | **Access:** `public`

### Declaration

```swift
@MainActor struct EmptyStateView
```

### Properties

| Name | Type | Description |
|------|------|-------------|
| `body` | `some View` |  |

### Initializers

#### `init(icon:title:message:actionTitle:action:)`

```swift
@MainActor init(icon: String = "tray", title: String, message: String, actionTitle: String? = nil, action: (() -> Void)? = nil)
```

**Parameters:**

- `icon`: `String`
- `title`: `String`
- `message`: `String`
- `actionTitle`: `String`

---

## VoteButton

**Kind:** `struct` | **Access:** `public`

### Declaration

```swift
@MainActor struct VoteButton
```

### Properties

| Name | Type | Description |
|------|------|-------------|
| `body` | `some View` |  |

### Initializers

#### `init(voteCount:hasVoted:onVote:onRemoveVote:)`

```swift
@MainActor init(voteCount: Int, hasVoted: Bool = false, onVote: @escaping () async -> Void, onRemoveVote: @escaping () async -> Void)
```

**Parameters:**

- `voteCount`: `Int`
- `hasVoted`: `Bool`
- `onVote`: `Void`
- `onRemoveVote`: `Void`

---

## HTMLView.Coordinator

**Kind:** `class` | **Access:** `public`

**Conforms to:** `NSObjectProtocol`, `NSObjectProtocol`

### Declaration

```swift
@MainActor class Coordinator
```

### Methods

#### `webView(_:didFinish:)`

```swift
@MainActor func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!)
```

**Parameters:**

- `_`: `WKWebView`

---

## HelpArticleDetailView

**Kind:** `struct` | **Access:** `public`

### Declaration

```swift
@MainActor struct HelpArticleDetailView
```

### Properties

| Name | Type | Description |
|------|------|-------------|
| `body` | `some View` |  |

### Initializers

#### `init(article:)`

```swift
@MainActor init(article: HelpArticle)
```

**Parameters:**

- `article`: `HelpArticle`

---

## FormTextAreaView

**Kind:** `struct` | **Access:** `public`

### Declaration

```swift
@MainActor struct FormTextAreaView
```

### Properties

| Name | Type | Description |
|------|------|-------------|
| `body` | `some View` |  |

### Initializers

#### `init(field:value:error:onValidate:)`

```swift
@MainActor init(field: FormField, value: Binding<String>, error: String?, onValidate: @escaping () -> Void)
```

**Parameters:**

- `field`: `FormField`
- `value`: `String`
- `error`: `String`
- `onValidate`: `Void`

---

## PopupContainerView

**Kind:** `struct` | **Access:** `public`

### Declaration

```swift
@MainActor struct PopupContainerView
```

### Description

The main container view for displaying popups.

### Properties

| Name | Type | Description |
|------|------|-------------|
| `body` | `some View` |  |

---

## CreateMessageRequest

**Kind:** `struct` | **Access:** `public`

**Conforms to:** `SE`, `SendableMetatype`

### Declaration

```swift
struct CreateMessageRequest
```

### Description

A request to add a message to an existing support ticket.

### Examples

**Example**

```swift
let request = CreateMessageRequest(
    ticketId: "ticket123",
    content: "Here's more information about the issue.",
    authorName: "John Doe",
    authorEmail: "john@example.com",
    attachmentUrls: nil
)
```

### Properties

| Name | Type | Description |
|------|------|-------------|
| `attachmentUrls` | `[String]?` | URLs of files to attach to the message. |
| `authorEmail` | `String?` | The email address of the message author. |
| `authorName` | `String?` | The display name of the message author. |
| `content` | `String` | The text content of the message. |
| `ticketId` | `String` | The ID of the ticket to add the message to. |

### Initializers

#### `init(ticketId:content:authorName:authorEmail:attachmentUrls:)`

```swift
init(ticketId: String, content: String, authorName: String?, authorEmail: String?, attachmentUrls: [String]?)
```

**Parameters:**

- `ticketId`: `String`
- `content`: `String`
- `authorName`: `String`
- `authorEmail`: `String`

---

## AnnouncementModalView

**Kind:** `struct` | **Access:** `public`

### Declaration

```swift
@MainActor struct AnnouncementModalView
```

### Description

A modal view displaying announcements with paging support.

### Properties

| Name | Type | Description |
|------|------|-------------|
| `body` | `some View` |  |

### Initializers

#### `init(announcements:cardConfiguration:onDismiss:onAction:)`

```swift
@MainActor init(announcements: [Announcement], cardConfiguration: AnnouncementCardConfiguration = .default, onDismiss: @escaping () -> Void, onAction: @escaping (Announcement) -> Void = { _ in })
```

**Parameters:**

- `announcements`: `Announcement`
- `cardConfiguration`: `AnnouncementCardConfiguration`
- `onDismiss`: `Void`

---

## DeepLinkHandler

**Kind:** `class` | **Access:** `public`

### Declaration

```swift
class DeepLinkHandler
```

### Methods

#### `parse(url:)` `static`

```swift
static func parse(url: URL) -> DeepLink?
```

**Returns:** `DeepLink?`

---

## SurveyResponse

**Kind:** `struct` | **Access:** `public`

**Conforms to:** `SE`, `SendableMetatype`

### Declaration

```swift
struct SurveyResponse
```

### Description

A complete survey response containing all answers.

### Examples

**Example**

```swift
let response = SurveyResponse(
    answers: [answerPayload1, answerPayload2],
    fingerprint: "device123",
    externalUserId: "user456",
    metadata: ["source": .string("app")]
)
```

### Properties

| Name | Type | Description |
|------|------|-------------|
| `answers` | `[SurveyAnswerPayload]` | The list of answers for each question node. |
| `externalUserId` | `String?` | The external user ID, if available. |
| `fingerprint` | `String` | The device fingerprint for anonymous users. |
| `metadata` | `[String:AnyCodableValue]?` | Optional metadata to include with the response. |

### Initializers

#### `init(answers:fingerprint:externalUserId:metadata:)`

```swift
init(answers: [SurveyAnswerPayload], fingerprint: String, externalUserId: String?, metadata: [String : AnyCodableValue]? = nil)
```

**Parameters:**

- `answers`: `SurveyAnswerPayload`
- `fingerprint`: `String`
- `externalUserId`: `String`

---

## RoadmapKanbanView

**Kind:** `struct` | **Access:** `public`

### Declaration

```swift
@MainActor struct RoadmapKanbanView
```

### Properties

| Name | Type | Description |
|------|------|-------------|
| `body` | `some View` |  |

### Initializers

#### `init(columns:)`

```swift
@MainActor init(columns: [RoadmapColumn])
```

---

## DecisionTreeFlowView

**Kind:** `struct` | **Access:** `public`

### Declaration

```swift
@MainActor struct DecisionTreeFlowView
```

### Description

A view that displays a decision tree flow with Yes/No navigation.

### Examples

**Example**

```swift
let viewModel = DecisionTreeViewModel()
viewModel.loadFlow(helpFlow)

DecisionTreeFlowView(viewModel: viewModel)
```

### Properties

| Name | Type | Description |
|------|------|-------------|
| `body` | `some View` |  |

### Initializers

#### `init(viewModel:configuration:onArticleSelected:)`

```swift
@MainActor init(viewModel: DecisionTreeViewModel, configuration: HelpCenterConfiguration = .default, onArticleSelected: ((HelpArticle) -> Void)? = nil)
```

**Parameters:**

- `viewModel`: `DecisionTreeViewModel`
- `configuration`: `HelpCenterConfiguration`

---

## PopupManager

**Kind:** `class` | **Access:** `public`

### Declaration

```swift
@MainActor final class PopupManager
```

### Description

Manager for controlling the automatic popup system.

### Examples

**Example**

```swift
// Get the popup manager
let manager = try AppGramSDK.shared.getPopupManager()

// Manually trigger a popup
manager.showPopupManually()

// Stop the popup system
manager.stop()
```

### Properties

| Name | Type | Description |
|------|------|-------------|
| `configuration` | `PopupConfiguration` | The popup configuration. |
| `currentContent` | `PopupContent` | The current content to display in the popup. |
| `isPresented` | `Bool` | Whether the popup is currently being presented. |

### Initializers

#### `init(configuration:tracker:projectId:surveyService:feedbackService:)`

```swift
@MainActor init(configuration: PopupConfiguration, tracker: PopupTracker, projectId: String, surveyService: (any SurveyServiceProtocol)? = nil, feedbackService: (any FeedbackServiceProtocol)? = nil)
```

**Parameters:**

- `configuration`: `PopupConfiguration`
- `tracker`: `PopupTracker`
- `projectId`: `String`
- `surveyService`: `SurveyServiceProtocol`

Creates a new popup manager.

### Methods

#### `checkAndPresentIfNeeded()` `async`

```swift
@MainActor func checkAndPresentIfNeeded() async
```

Checks if the popup should be presented and shows it if conditions are met.

#### `dismiss()`

```swift
@MainActor func dismiss()
```

Dismisses the currently shown popup.

#### `recordInteraction(_:)`

```swift
@MainActor func recordInteraction(_ type: InteractionType)
```

**Parameters:**

- `_`: `InteractionType`

Records a user interaction with the popup.

#### `showPopupManually()`

```swift
@MainActor func showPopupManually()
```

Manually triggers the popup to appear immediately.

#### `snooze()`

```swift
@MainActor func snooze()
```

Snoozes the popup for the configured duration.

#### `start()`

```swift
@MainActor func start()
```

Starts the popup system.

#### `stop()`

```swift
@MainActor func stop()
```

Stops the popup system.

---

## StatusPage

**Kind:** `struct` | **Access:** `public`

**Conforms to:** `SE`, `SendableMetatype`

### Declaration

```swift
struct StatusPage
```

### Description

Represents a status page configuration.

### Examples

**Example**

```swift
let statusPage = StatusPage(
    id: "page123",
    name: "Service Status",
    slug: "status",
    description: "Current status of all services",
    projectId: "project456",
    createdAt: Date(),
    updatedAt: Date()
)
```

### Properties

| Name | Type | Description |
|------|------|-------------|
| `createdAt` | `Date?` | The date when the status page was created. |
| `description` | `String?` | An optional description of the status page. |
| `id` | `String` | The unique identifier for the status page. |
| `isActive` | `Bool?` | Whether the status page is active. |
| `name` | `String` | The display name of the status page. |
| `organizationId` | `String?` | The organization ID this status page belongs to. |
| `projectId` | `String?` | The project ID this status page belongs to. |
| `publicUrl` | `String?` | The public URL for the status page. |
| `slug` | `String` | The URL-friendly slug identifier. |
| `updatedAt` | `Date?` | The date when the status page was last updated. |

### Initializers

#### `init(from:)`

```swift
init(from decoder: any Decoder) throws
```

---

## Survey

**Kind:** `struct` | **Access:** `public`

**Conforms to:** `SE`, `SendableMetatype`

### Declaration

```swift
struct Survey
```

### Description

Represents a survey that can be presented to users.

### Examples

**Example**

```swift
let survey = try await getSurvey(slug: "nps")
```

### Properties

| Name | Type | Description |
|------|------|-------------|
| `createdAt` | `Date?` | The date when the survey was created. |
| `description` | `String?` | An optional description of the survey. |
| `id` | `String` | The unique identifier for the survey. |
| `isActive` | `Bool` | Whether the survey is currently active. |
| `name` | `String` | The display name of the survey. |
| `nodes` | `[SurveyNode]?` | The list of question nodes in the survey. |
| `projectId` | `String` | The project ID this survey belongs to. |
| `slug` | `String` | The URL-friendly slug identifier. |

### Initializers

#### `init(from:)`

```swift
init(from decoder: any Decoder) throws
```

#### `init(id:name:slug:description:projectId:nodes:isActive:createdAt:)`

```swift
init(id: String, name: String, slug: String, description: String?, projectId: String, nodes: [SurveyNode]?, isActive: Bool, createdAt: Date?)
```

**Parameters:**

- `id`: `String`
- `name`: `String`
- `slug`: `String`
- `description`: `String`
- `projectId`: `String`
- `nodes`: `SurveyNode`
- `isActive`: `Bool`

---

## SupportFormSubmission

**Kind:** `struct` | **Access:** `public`

**Conforms to:** `SE`, `SendableMetatype`

### Declaration

```swift
struct SupportFormSubmission
```

### Description

A submission of a support form.

### Examples

**Example**

```swift
let submission = SupportFormSubmission(
    formId: "support_123",
    subject: "Application crash on login",
    description: "The application crashes when I try to log in",
    data: ["issue_type": "Bug", "severity": "High"],
    userEmail: "user@example.com",
    userName: "John Doe"
)
```

### Properties

| Name | Type | Description |
|------|------|-------------|
| `data` | `[String:String]` | A dictionary mapping field IDs to their submitted values. |
| `description` | `String` | The description of the support request. |
| `formId` | `String` | The ID of the form being submitted. |
| `subject` | `String` | The subject of the support request. |
| `userEmail` | `String?` | The user’s email address. |
| `userName` | `String?` | The user’s name. |

### Initializers

#### `init(formId:subject:description:data:userEmail:userName:)`

```swift
init(formId: String, subject: String, description: String, data: [String : String], userEmail: String?, userName: String?)
```

**Parameters:**

- `formId`: `String`
- `subject`: `String`
- `description`: `String`
- `data`: `String`
- `userEmail`: `String`

---

## Vote

**Kind:** `struct` | **Access:** `public`

**Conforms to:** `SE`, `SendableMetatype`

### Declaration

```swift
struct Vote
```

### Description

Represents a vote on a feedback item (wish).

### Examples

**Example**

```swift
let vote = Vote(
    id: "vote123",
    wishId: "wish456",
    userId: "user789",
    fingerprint: nil,
    createdAt: Date()
)
```

### Properties

| Name | Type | Description |
|------|------|-------------|
| `createdAt` | `Date` | The date when the vote was created. |
| `fingerprint` | `String?` | The device fingerprint for anonymous voters. |
| `id` | `String` | The unique identifier for the vote. |
| `userId` | `String?` | The user ID of the voter, if authenticated. |
| `wishId` | `String` | The ID of the wish this vote is for. |

### Initializers

#### `init(from:)`

```swift
init(from decoder: any Decoder) throws
```

#### `init(id:wishId:userId:fingerprint:createdAt:)`

```swift
init(id: String, wishId: String, userId: String?, fingerprint: String?, createdAt: Date)
```

**Parameters:**

- `id`: `String`
- `wishId`: `String`
- `userId`: `String`
- `fingerprint`: `String`
- `createdAt`: `Date`

---

## SupportTicketListView

**Kind:** `struct` | **Access:** `public`

### Declaration

```swift
@MainActor struct SupportTicketListView
```

### Properties

| Name | Type | Description |
|------|------|-------------|
| `body` | `some View` |  |

### Initializers

#### `init(supportService:userContextProvider:)`

```swift
@MainActor init(supportService: SupportServiceProtocol, userContextProvider: @escaping () -> UserContext?)
```

**Parameters:**

- `supportService`: `SupportServiceProtocol`

---

## SupportMessageView

**Kind:** `struct` | **Access:** `public`

### Declaration

```swift
@MainActor struct SupportMessageView
```

### Properties

| Name | Type | Description |
|------|------|-------------|
| `body` | `some View` |  |

### Initializers

#### `init(message:)`

```swift
@MainActor init(message: SupportMessage)
```

**Parameters:**

- `message`: `SupportMessage`

---

## WishFilters

**Kind:** `struct` | **Access:** `public`

**Conforms to:** `SendableMetatype`

### Declaration

```swift
struct WishFilters
```

### Description

Filters and sorting options for querying wishes.

### Examples

**Example**

```swift
let filters = WishFilters(
    status: .planned,
    categoryId: "cat123",
    searchQuery: "dark mode",
    sortBy: .mostVotes,
    page: 1,
    limit: 20
)
```

### Properties

| Name | Type | Description |
|------|------|-------------|
| `categoryId` | `String?` | Filter by category ID. |
| `limit` | `Int` | The maximum number of wishes to return per page. |
| `page` | `Int` | The page number for pagination (1-based). |
| `searchQuery` | `String?` | Search query to filter wishes by title or description. |
| `sortBy` | `WishSortOption` | The sorting option to apply. |
| `status` | `WishStatus?` | Filter by wish status. |

### Initializers

#### `init(status:categoryId:searchQuery:sortBy:page:limit:)`

```swift
init(status: WishStatus? = nil, categoryId: String? = nil, searchQuery: String? = nil, sortBy: WishSortOption = .newest, page: Int = 1, limit: Int = 50)
```

**Parameters:**

- `status`: `WishStatus`
- `categoryId`: `String`
- `searchQuery`: `String`
- `sortBy`: `WishSortOption`
- `page`: `Int`

---

## SurveyView

**Kind:** `struct` | **Access:** `public`

### Declaration

```swift
@MainActor struct SurveyView
```

### Properties

| Name | Type | Description |
|------|------|-------------|
| `body` | `some View` |  |

### Initializers

#### `init(slug:surveyService:projectId:userContextProvider:style:)`

```swift
@MainActor init(slug: String, surveyService: SurveyServiceProtocol, projectId: String, userContextProvider: @escaping () -> UserContext?, style: SurveyStyle = .normal)
```

**Parameters:**

- `slug`: `String`
- `surveyService`: `SurveyServiceProtocol`
- `projectId`: `String`
- `userContextProvider`: `UserContext`

---

## NodeOption

**Kind:** `struct` | **Access:** `public`

**Conforms to:** `SE`, `SendableMetatype`

### Declaration

```swift
struct NodeOption
```

### Description

Represents an option for multiple choice or checkbox questions.

### Examples

**Example**

```swift
let option = NodeOption(
    id: "opt1",
    label: "Very Satisfied",
    value: "5"
)
```

### Properties

| Name | Type | Description |
|------|------|-------------|
| `id` | `String` | The unique identifier for the option. |
| `label` | `String` | The display label for the option. |
| `value` | `String?` | The value associated with this option. |

### Initializers

#### `init(from:)`

```swift
init(from decoder: Decoder) throws
```

#### `init(id:label:value:)`

```swift
init(id: String, label: String, value: String?)
```

**Parameters:**

- `id`: `String`
- `label`: `String`

---

## AppGramSDK

**Kind:** `class` | **Access:** `public`

**Conforms to:** `SendableMetatype`

### Declaration

```swift
final class AppGramSDK
```

### Description

The main entry point for the AppGram SDK.

### Examples

**Configuration**

```swift
AppGramSDK.shared.configure(
    projectId: "your-project-id",
    apiKey: "your-api-key",
    announcementConfiguration: AnnouncementConfiguration(
        orgSlug: "your-org",
        projectSlug: "your-project"
    )
)
```

**User Context**

```swift
AppGramSDK.shared.setUser(
    userId: "user123",
    email: "user@example.com",
    name: "John Doe"
)
```

### Properties

| Name | Type | Description |
|------|------|-------------|
| `configuration` | `Configuration` | The current configuration of the SDK. |
| `userContext` | `UserContext` | The current user context. |
| `shared` | `AppGramSDK` | The shared singleton instance of the AppGram SDK. |
| `version` | `String` | The current version of the AppGram SDK. |

### Methods

#### `blogView()` `throws`

```swift
func blogView() throws -> some View
```

**Returns:** `View`

Returns a SwiftUI view for displaying blog posts and content.

#### `clearUser()`

```swift
func clearUser()
```

Clears the current user context and sets it back to anonymous.

#### `configure(projectId:baseURL:theme:apiKey:popupConfiguration:announcementConfiguration:)`

```swift
@MainActor func configure(projectId: String, baseURL: String = "https://api.appgram.dev", theme: AppGramTheme? = nil, apiKey: String? = nil, popupConfiguration: PopupConfiguration? = nil, announcementConfiguration: AnnouncementConfiguration? = nil)
```

**Parameters:**

- `projectId`: `String`
- `baseURL`: `String`
- `theme`: `AppGramTheme`
- `apiKey`: `String`
- `popupConfiguration`: `PopupConfiguration`

Configures the AppGram SDK with the provided project credentials and settings.

#### `contactFormView(formId:)` `throws`

```swift
func contactFormView(formId: String) throws -> some View
```

**Returns:** `View`

Returns a SwiftUI view for displaying and submitting a contact form.

#### `feedbackView()` `throws`

```swift
func feedbackView() throws -> some View
```

**Returns:** `View`

Returns a SwiftUI view for displaying and managing feedback.

#### `feedbackWidget(style:size:ctaTitle:ctaAction:)` `throws`

```swift
func feedbackWidget(style: AGWidgetConfiguration.WidgetStyle = .card, size: AGWidgetConfiguration.WidgetSize = .medium, ctaTitle: String = "Submit Feedback", ctaAction: (() -> Void)? = nil) throws -> some View
```

**Parameters:**

- `style`: `WidgetStyle`
- `size`: `WidgetSize`
- `ctaTitle`: `String`

Creates a widget view with a feedback configuration.

#### `getAnnouncementManager()` `throws`

```swift
func getAnnouncementManager() throws -> AnnouncementManager
```

**Returns:** `AnnouncementManager`

Returns the announcement manager instance.

#### `getBlogService()` `throws`

```swift
func getBlogService() throws -> BlogServiceProtocol
```

**Returns:** `BlogServiceProtocol`

Returns the blog service instance.

#### `getContactFormService()` `throws`

```swift
func getContactFormService() throws -> ContactFormServiceProtocol
```

**Returns:** `ContactFormServiceProtocol`

Returns the contact form service instance.

#### `getFeedbackService()` `throws`

```swift
func getFeedbackService() throws -> FeedbackServiceProtocol
```

**Returns:** `FeedbackServiceProtocol`

Returns the feedback service instance.

#### `getHelpService()` `throws`

```swift
func getHelpService() throws -> HelpServiceProtocol
```

**Returns:** `HelpServiceProtocol`

Returns the help service instance.

#### `getNotificationManager()` `throws`

```swift
func getNotificationManager() throws -> NotificationManager
```

**Returns:** `NotificationManager`

Returns the notification manager instance.

#### `getPopupManager()` `throws`

```swift
func getPopupManager() throws -> PopupManager
```

**Returns:** `PopupManager`

Returns the popup manager instance.

#### `getReleasesService()` `throws`

```swift
func getReleasesService() throws -> ReleasesServiceProtocol
```

**Returns:** `ReleasesServiceProtocol`

Returns the releases service instance.

#### `getRoadmapService()` `throws`

```swift
func getRoadmapService() throws -> RoadmapServiceProtocol
```

**Returns:** `RoadmapServiceProtocol`

Returns the roadmap service instance.

#### `getStatusService()` `throws`

```swift
func getStatusService() throws -> StatusServiceProtocol
```

**Returns:** `StatusServiceProtocol`

Returns the status service instance.

#### `getSupportService()` `throws`

```swift
func getSupportService() throws -> SupportServiceProtocol
```

**Returns:** `SupportServiceProtocol`

Returns the support service instance.

#### `getSurveyService()` `throws`

```swift
func getSurveyService() throws -> SurveyServiceProtocol
```

**Returns:** `SurveyServiceProtocol`

Returns the survey service instance.

#### `getWidgetService()` `throws`

```swift
func getWidgetService() throws -> WidgetServiceProtocol
```

**Returns:** `WidgetServiceProtocol`

Returns the widget service instance.

#### `helpCenterView(configuration:)` `throws`

```swift
func helpCenterView(configuration: HelpCenterConfiguration = .default) throws -> some View
```

**Returns:** `View`

Returns a SwiftUI view for displaying the help center.

#### `releasesView(orgSlug:projectSlug:configuration:)` `throws`

```swift
func releasesView(orgSlug: String, projectSlug: String, configuration: ReleasesConfiguration = .default) throws -> some View
```

**Parameters:**

- `orgSlug`: `String`
- `projectSlug`: `String`

**Returns:** `View`

Returns a SwiftUI view for displaying release notes.

#### `roadmapView()` `throws`

```swift
func roadmapView() throws -> some View
```

**Returns:** `View`

Returns a SwiftUI view for displaying the product roadmap.

#### `roadmapWidget(style:size:ctaTitle:ctaAction:)` `throws`

```swift
func roadmapWidget(style: AGWidgetConfiguration.WidgetStyle = .card, size: AGWidgetConfiguration.WidgetSize = .medium, ctaTitle: String = "View Roadmap", ctaAction: (() -> Void)? = nil) throws -> some View
```

**Parameters:**

- `style`: `WidgetStyle`
- `size`: `WidgetSize`
- `ctaTitle`: `String`

Creates a widget view with a roadmap configuration.

#### `setUser(userId:email:name:)`

```swift
func setUser(userId: String?, email: String?, name: String?)
```

**Parameters:**

- `userId`: `String`
- `email`: `String`

Sets the current user context for the SDK.

#### `showAnnouncements()` `async`

```swift
@MainActor func showAnnouncements() async
```

Manually presents announcements to the user.

#### `statusPageView(slug:configuration:onSubscribeCallback:)` `throws`

```swift
func statusPageView(slug: String = "status", configuration: StatusConfiguration = .default, onSubscribeCallback: (() -> Void)? = nil) throws -> some View
```

**Parameters:**

- `slug`: `String`
- `configuration`: `StatusConfiguration`

Returns a SwiftUI view for displaying a status page.

#### `statusWidget(style:size:slug:ctaTitle:ctaAction:)` `throws`

```swift
func statusWidget(style: AGWidgetConfiguration.WidgetStyle = .card, size: AGWidgetConfiguration.WidgetSize = .medium, slug: String = "status", ctaTitle: String = "View Status", ctaAction: (() -> Void)? = nil) throws -> some View
```

**Parameters:**

- `style`: `WidgetStyle`
- `size`: `WidgetSize`
- `slug`: `String`
- `ctaTitle`: `String`

Creates a widget view with a status configuration.

#### `supportFormView(formId:)` `throws`

```swift
func supportFormView(formId: String) throws -> some View
```

**Returns:** `View`

Returns a SwiftUI view for displaying and submitting a specific support form.

#### `supportView()` `throws`

```swift
func supportView() throws -> some View
```

**Returns:** `View`

Returns a SwiftUI view for displaying and managing support tickets.

#### `surveyView(slug:style:)` `throws`

```swift
func surveyView(slug: String, style: SurveyStyle = .normal) throws -> some View
```

**Parameters:**

- `slug`: `String`

**Returns:** `View`

Returns a SwiftUI view for displaying and submitting a survey.

#### `widgetView(configuration:)` `throws`

```swift
func widgetView(configuration: AGWidgetConfiguration) throws -> some View
```

**Returns:** `View`

Returns a SwiftUI view for displaying a customizable widget.

#### `contactFormViewController(formId:)` `static` `throws`

```swift
static func contactFormViewController(formId: String) throws -> UIViewController
```

**Returns:** `UIViewController`

Returns a UIKit view controller for displaying and submitting a contact form.

#### `feedbackViewController()` `static` `throws`

```swift
static func feedbackViewController() throws -> UIViewController
```

**Returns:** `UIViewController`

Returns a UIKit view controller for displaying and managing feedback.

#### `helpCenterViewController()` `static` `throws`

```swift
static func helpCenterViewController() throws -> UIViewController
```

**Returns:** `UIViewController`

Returns a UIKit view controller for displaying the help center.

#### `releasesViewController(orgSlug:projectSlug:configuration:)` `static` `throws`

```swift
static func releasesViewController(orgSlug: String, projectSlug: String, configuration: ReleasesConfiguration = .default) throws -> UIViewController
```

**Parameters:**

- `orgSlug`: `String`
- `projectSlug`: `String`

**Returns:** `UIViewController`

Returns a UIKit view controller for displaying release notes.

#### `roadmapViewController()` `static` `throws`

```swift
static func roadmapViewController() throws -> UIViewController
```

**Returns:** `UIViewController`

Returns a UIKit view controller for displaying the product roadmap.

#### `statusPageViewController(slug:configuration:)` `static` `throws`

```swift
static func statusPageViewController(slug: String = "status", configuration: StatusConfiguration = .default) throws -> UIViewController
```

**Parameters:**

- `slug`: `String`

**Returns:** `UIViewController`

Returns a UIKit view controller for displaying a status page.

#### `supportViewController()` `static` `throws`

```swift
static func supportViewController() throws -> UIViewController
```

**Returns:** `UIViewController`

Returns a UIKit view controller for displaying and managing support tickets.

#### `surveyViewController(slug:)` `static` `throws`

```swift
static func surveyViewController(slug: String) throws -> UIViewController
```

**Returns:** `UIViewController`

Returns a UIKit view controller for displaying and submitting a survey.

#### `widgetViewController(configuration:)` `static` `throws`

```swift
static func widgetViewController(configuration: AGWidgetConfiguration) throws -> UIViewController
```

**Returns:** `UIViewController`

Returns a UIKit view controller for displaying a customizable widget.

---

## FormField

**Kind:** `struct` | **Access:** `public`

**Conforms to:** `SE`, `SendableMetatype`

### Declaration

```swift
struct FormField
```

### Description

Represents a single field in a contact form.

### Examples

**Example**

```swift
let field = FormField(
    id: "field1",
    type: .email,
    label: "Email Address",
    placeholder: "Enter your email",
    required: true,
    options: nil,
    defaultValue: nil,
    validation: nil,
    order: 1
)
```

### Properties

| Name | Type | Description |
|------|------|-------------|
| `defaultValue` | `String?` | The default value for the field. |
| `id` | `String` | The unique identifier for the field. |
| `label` | `String` | The label text to display for the field. |
| `options` | `[String]?` | The available options for select, radio, or checkbox fields. |
| `order` | `Int?` | The display order of the field. |
| `placeholder` | `String?` | The placeholder text to show when the field is empty. |
| `required` | `Bool` | Whether this field is required. |
| `type` | `FieldType` | The type of input field. |
| `validation` | `FieldValidation?` | Validation rules for the field. |

### Initializers

#### `init(from:)`

```swift
init(from decoder: any Decoder) throws
```

#### `init(id:type:label:placeholder:required:options:defaultValue:validation:order:)`

```swift
init(id: String, type: FieldType, label: String, placeholder: String?, required: Bool, options: [String]?, defaultValue: String?, validation: FieldValidation?, order: Int?)
```

**Parameters:**

- `id`: `String`
- `type`: `FieldType`
- `label`: `String`
- `placeholder`: `String`
- `required`: `Bool`
- `options`: `String`
- `defaultValue`: `String`
- `validation`: `FieldValidation`

---

## CategoryBadge

**Kind:** `struct` | **Access:** `public`

### Declaration

```swift
@MainActor struct CategoryBadge
```

### Description

Category badge with shadcn-inspired minimal styling.

### Examples

**Example**

```swift
CategoryBadge(category: category)
```

### Properties

| Name | Type | Description |
|------|------|-------------|
| `body` | `some View` |  |

### Initializers

#### `init(category:)`

```swift
@MainActor init(category: Category)
```

**Parameters:**

- `category`: `Category`

---

## WizardViewModel

**Kind:** `class` | **Access:** `public`

**Conforms to:** `SendableMetatype`

### Declaration

```swift
final class WizardViewModel
```

### Description

View model for managing wizard flow state and navigation.

### Examples

**Example**

```swift
let viewModel = WizardViewModel()
viewModel.loadFlow(helpFlow)

// Navigate forward
viewModel.nextStep()

// Navigate backward
viewModel.previousStep()

// Get current progress
let progress = viewModel.progress // 0.0 to 1.0
```

### Properties

| Name | Type | Description |
|------|------|-------------|
| `canGoBack` | `Bool` | Whether the user can go to the previous step. |
| `canGoForward` | `Bool` | Whether the user can go to the next step. |
| `currentStep` | `Int` | The current step index (0-based). |
| `currentStepData` | `HelpWizardStep` | The current step data. |
| `flow` | `HelpFlow` | The current help flow being displayed. |
| `hasSteps` | `Bool` | Whether the wizard has steps to display. |
| `isFirstStep` | `Bool` | Whether the current step is the first step. |
| `isLastStep` | `Bool` | Whether the current step is the last step. |
| `linkedArticle` | `HelpArticle` | The linked article for the current step, if any. |
| `progress` | `Double` | Progress value between 0.0 and 1.0. |
| `progressPercentage` | `Int` | Progress percentage (0-100). |
| `publishedArticles` | `[HelpArticle` | Published articles from the flow (sorted by sort_order). |
| `totalSteps` | `Int` | Total number of steps. |

### Initializers

#### `init()`

```swift
init()
```

### Methods

#### `goToStep(_:)`

```swift
func goToStep(_ index: Int)
```

**Parameters:**

- `_`: `Int`

Navigates to a specific step by index.

#### `loadFlow(_:)`

```swift
func loadFlow(_ flow: HelpFlow)
```

**Parameters:**

- `_`: `HelpFlow`

Loads a help flow and resets to the first step.

#### `nextStep()`

```swift
func nextStep()
```

Navigates to the next step.

#### `previousStep()`

```swift
func previousStep()
```

Navigates to the previous step.

#### `reset()`

```swift
func reset()
```

Resets the wizard state.

#### `stepState(at:)`

```swift
func stepState(at index: Int) -> StepState
```

**Returns:** `StepState`

Returns the state of a step (completed, current, or upcoming).

---

## DisplaySettings

**Kind:** `struct` | **Access:** `public`

**Conforms to:** `SendableMetatype`

### Declaration

```swift
struct DisplaySettings
```

### Description

Display settings for customizing the popup appearance.

### Properties

| Name | Type | Description |
|------|------|-------------|
| `animationDuration` | `TimeInterval` | The duration of the animation when showing/hiding the popup. |
| `cornerRadius` | `CGFloat` | The corner radius for the popup card. |
| `maxWidth` | `CGFloat?` | Optional maximum width for the popup. Set to `` for no constraint. |
| `shadowRadius` | `CGFloat` | The shadow radius for the popup card. |
| `default` | `DisplaySettings` | Default display settings. |

### Initializers

#### `init(animationDuration:cornerRadius:shadowRadius:maxWidth:)`

```swift
init(animationDuration: TimeInterval = 0.4, cornerRadius: CGFloat = 16, shadowRadius: CGFloat = 8, maxWidth: CGFloat? = nil)
```

**Parameters:**

- `animationDuration`: `TimeInterval`
- `cornerRadius`: `CGFloat`
- `shadowRadius`: `CGFloat`

---

## SupportTicket

**Kind:** `struct` | **Access:** `public`

**Conforms to:** `SE`, `SendableMetatype`

### Declaration

```swift
struct SupportTicket
```

### Description

Represents a support ticket submitted by a user.

### Examples

**Example**

```swift
let ticket = SupportTicket(
    id: "ticket123",
    subject: "Login issue",
    description: "Cannot log in to my account",
    status: .open,
    priority: .high,
    userEmail: "user@example.com",
    userName: "John Doe",
    userId: "user456",
    projectId: "project789",
    messages: [],
    attachments: nil,
    createdAt: Date(),
    updatedAt: nil
)
```

### Properties

| Name | Type | Description |
|------|------|-------------|
| `attachments` | `[Attachment]?` | The list of file attachments. |
| `createdAt` | `Date` | The date when the ticket was created. |
| `description` | `String` | The detailed description of the issue. |
| `id` | `String` | The unique identifier for the ticket. |
| `messages` | `[SupportMessage]?` | The list of messages in this ticket’s conversation. |
| `priority` | `TicketPriority` | The priority level of the ticket. |
| `projectId` | `String` | The project ID this ticket belongs to. |
| `status` | `TicketStatus` | The current status of the ticket. |
| `subject` | `String` | The subject line of the ticket. |
| `updatedAt` | `Date?` | The date when the ticket was last updated. |
| `userEmail` | `String` | The email address of the user who created the ticket. |
| `userId` | `String?` | The user ID of the ticket creator. |
| `userName` | `String?` | The display name of the user who created the ticket. |

### Initializers

#### `init(from:)`

```swift
init(from decoder: any Decoder) throws
```

#### `init(id:subject:description:status:priority:userEmail:userName:userId:projectId:messages:attachments:createdAt:updatedAt:)`

```swift
init(id: String, subject: String, description: String, status: TicketStatus, priority: TicketPriority, userEmail: String, userName: String?, userId: String?, projectId: String, messages: [SupportMessage]?, attachments: [Attachment]?, createdAt: Date, updatedAt: Date?)
```

**Parameters:**

- `id`: `String`
- `subject`: `String`
- `description`: `String`
- `status`: `TicketStatus`
- `priority`: `TicketPriority`
- `userEmail`: `String`
- `userName`: `String`
- `userId`: `String`
- `projectId`: `String`
- `messages`: `SupportMessage`
- `attachments`: `Attachment`
- `createdAt`: `Date`

### Methods

#### `hash(into:)`

```swift
func hash(into hasher: inout Hasher)
```

**Parameters:**

- `into`: `Hasher`

---

## Wish

**Kind:** `struct` | **Access:** `public`

**Conforms to:** `SE`, `SendableMetatype`

### Declaration

```swift
struct Wish
```

### Description

Represents a feedback item (wish) submitted by users.

### Examples

**Example**

```swift
let wish = Wish(
    id: "wish123",
    title: "Dark mode support",
    description: "Please add dark mode to the app",
    status: .planned,
    voteCount: 42,
    commentCount: 5,
    category: category,
    categoryId: "cat456",
    authorName: "John Doe",
    authorEmail: "john@example.com",
    userId: "user789",
    projectId: "project123",
    createdAt: Date(),
    updatedAt: nil,
    completedAt: nil
)
```

### Properties

| Name | Type | Description |
|------|------|-------------|
| `authorEmail` | `String?` | The email address of the wish author. |
| `authorName` | `String?` | The display name of the wish author. |
| `category` | `Category?` | The category this wish belongs to, if any. |
| `categoryId` | `String?` | The ID of the category this wish belongs to. |
| `commentCount` | `Int` | The number of comments on this wish. |
| `completedAt` | `Date?` | The date when the wish was completed, if applicable. |
| `createdAt` | `Date` | The date when the wish was created. |
| `description` | `String?` | An optional detailed description of the wish. |
| `hasVoted` | `Bool` | Whether the current user has voted on this wish. |
| `id` | `String` | The unique identifier for the wish. |
| `projectId` | `String` | The project ID this wish belongs to. |
| `status` | `WishStatus` | The current status of the wish. |
| `title` | `String` | The title of the wish. |
| `updatedAt` | `Date?` | The date when the wish was last updated. |
| `userId` | `String?` | The user ID of the wish author. |
| `voteCount` | `Int` | The number of votes this wish has received. |

### Initializers

#### `init(from:)`

```swift
init(from decoder: Decoder) throws
```

#### `init(id:title:description:status:voteCount:hasVoted:commentCount:category:categoryId:authorName:authorEmail:userId:projectId:createdAt:updatedAt:completedAt:)`

```swift
init(id: String, title: String, description: String?, status: WishStatus, voteCount: Int, hasVoted: Bool = false, commentCount: Int, category: Category?, categoryId: String?, authorName: String?, authorEmail: String?, userId: String?, projectId: String, createdAt: Date, updatedAt: Date?, completedAt: Date? = nil)
```

**Parameters:**

- `id`: `String`
- `title`: `String`
- `description`: `String`
- `status`: `WishStatus`
- `voteCount`: `Int`
- `hasVoted`: `Bool`
- `commentCount`: `Int`
- `category`: `Category`
- `categoryId`: `String`
- `authorName`: `String`
- `authorEmail`: `String`
- `userId`: `String`
- `projectId`: `String`
- `createdAt`: `Date`
- `updatedAt`: `Date`

### Methods

#### `encode(to:)` `throws`

```swift
func encode(to encoder: Encoder) throws
```

#### `hash(into:)`

```swift
func hash(into hasher: inout Hasher)
```

**Parameters:**

- `into`: `Hasher`

---

## HelpDecisionNode

**Kind:** `struct` | **Access:** `public`

**Conforms to:** `SE`, `SendableMetatype`

### Declaration

```swift
struct HelpDecisionNode
```

### Description

Represents a decision node in a help flow.

### Examples

**Example**

```swift
let node = HelpDecisionNode(
    id: "node1",
    flowId: "flow123",
    parentId: nil,  // Root node
    question: "Are you having login issues?",
    answerYesNodeId: "node2",
    answerNoNodeId: "node3",
    articleId: nil
)
```

### Properties

| Name | Type | Description |
|------|------|-------------|
| `answerNoNodeId` | `String?` | The next node ID if the user answers “No”. |
| `answerYesNodeId` | `String?` | The next node ID if the user answers “Yes”. |
| `articleId` | `String?` | The article ID to show at leaf nodes (when there are no more questions). |
| `flowId` | `String` | The ID of the flow this node belongs to. |
| `id` | `String` | The unique identifier for the decision node. |
| `parentId` | `String?` | The ID of the parent node. `` indicates this is the root node. |
| `question` | `String` | The question text to display to the user. |

### Initializers

#### `init(from:)`

```swift
init(from decoder: any Decoder) throws
```

#### `init(id:flowId:parentId:question:answerYesNodeId:answerNoNodeId:articleId:)`

```swift
init(id: String, flowId: String, parentId: String?, question: String, answerYesNodeId: String?, answerNoNodeId: String?, articleId: String?)
```

**Parameters:**

- `id`: `String`
- `flowId`: `String`
- `parentId`: `String`
- `question`: `String`
- `answerYesNodeId`: `String`
- `answerNoNodeId`: `String`

---

## Branch

**Kind:** `struct` | **Access:** `public`

**Conforms to:** `SE`, `SendableMetatype`

### Declaration

```swift
struct Branch
```

### Description

Represents a conditional branch in a survey flow.

### Examples

**Example**

```swift
let branch = Branch(
    condition: BranchCondition(
        type: .equals,
        value: .int(5)
    ),
    nextNodeId: "node5"
)
```

### Properties

| Name | Type | Description |
|------|------|-------------|
| `condition` | `BranchCondition` | The condition that must be met for this branch to be taken. |
| `nextNodeId` | `String` | The ID of the next node to navigate to if the condition is met. |

### Initializers

#### `init(condition:nextNodeId:)`

```swift
init(condition: BranchCondition, nextNodeId: String)
```

**Parameters:**

- `condition`: `BranchCondition`
- `nextNodeId`: `String`

#### `init(from:)`

```swift
init(from decoder: any Decoder) throws
```

---

## AGWidgetConfiguration

**Kind:** `struct` | **Access:** `public`

**Conforms to:** `SendableMetatype`

### Declaration

```swift
struct AGWidgetConfiguration
```

### Description

Configuration options for customizing a widget’s appearance and behavior.

### Examples

**Example**

```swift
let config = WidgetConfiguration(
    type: .feedback,
    style: .card,
    size: .medium,
    ctaButton: CTAStyle(
        title: "Submit Feedback",
        backgroundColor: .blue,
        foregroundColor: .white
    )
)
```

### Properties

| Name | Type | Description |
|------|------|-------------|
| `backgroundColor` | `Color?` | Custom background color for the widget. |
| `borderColor` | `Color?` | Custom border color for the widget. |
| `borderWidth` | `CGFloat` | Border width for the widget. |
| `cornerRadius` | `CGFloat` | Corner radius for the widget. |
| `ctaAction` | `(() ->Void)?` | Action to perform when CTA button is tapped. |
| `ctaButton` | `CTAStyle?` | Configuration for the CTA button. |
| `customContent` | `(() ->AnyView)?` | Custom content view builder (for custom widget type). |
| `padding` | `EdgeInsets` | Padding inside the widget. |
| `parameters` | `[String:String]` | Additional parameters for widget-specific behavior. |
| `size` | `WidgetSize` | The size of the widget. |
| `style` | `WidgetStyle` | The visual style of the widget. |
| `subtitle` | `String?` | Custom subtitle/description text for the widget. |
| `title` | `String?` | Custom title text for the widget. |
| `type` | `WidgetType` | The type of widget content. |

### Initializers

#### `init(type:style:size:ctaButton:title:subtitle:backgroundColor:borderColor:borderWidth:cornerRadius:padding:customContent:ctaAction:parameters:)`

```swift
init(type: WidgetType, style: WidgetStyle = .card, size: WidgetSize = .medium, ctaButton: CTAStyle? = .default, title: String? = nil, subtitle: String? = nil, backgroundColor: Color? = nil, borderColor: Color? = nil, borderWidth: CGFloat = 1, cornerRadius: CGFloat = 12, padding: EdgeInsets = EdgeInsets(top: 16, leading: 16, bottom: 16, trailing: 16), customContent: (() -> AnyView)? = nil, ctaAction: (() -> Void)? = nil, parameters: [String : String] = [:])
```

**Parameters:**

- `type`: `WidgetType`
- `style`: `WidgetStyle`
- `size`: `WidgetSize`
- `ctaButton`: `CTAStyle`
- `title`: `String`
- `subtitle`: `String`
- `backgroundColor`: `Color`
- `borderColor`: `Color`
- `borderWidth`: `CGFloat`
- `cornerRadius`: `CGFloat`
- `padding`: `EdgeInsets`
- `customContent`: `AnyView`
- `ctaAction`: `Void`

### Methods

#### `custom(style:size:title:subtitle:ctaButton:customContent:ctaAction:)` `static`

```swift
static func custom(style: WidgetStyle = .card, size: WidgetSize = .medium, title: String? = nil, subtitle: String? = nil, ctaButton: CTAStyle? = nil, customContent: @escaping () -> AnyView, ctaAction: (() -> Void)? = nil) -> AGWidgetConfiguration
```

**Parameters:**

- `style`: `WidgetStyle`
- `size`: `WidgetSize`
- `title`: `String`
- `subtitle`: `String`
- `ctaButton`: `CTAStyle`
- `customContent`: `AnyView`

**Returns:** `AnyView`

Default widget configuration for custom content.

#### `feedback(style:size:ctaButton:ctaAction:)` `static`

```swift
static func feedback(style: WidgetStyle = .card, size: WidgetSize = .medium, ctaButton: CTAStyle? = CTAStyle(title: "Submit Feedback"), ctaAction: (() -> Void)? = nil) -> AGWidgetConfiguration
```

**Parameters:**

- `style`: `WidgetStyle`
- `size`: `WidgetSize`
- `ctaButton`: `CTAStyle`

Default widget configuration for feedback.

#### `roadmap(style:size:ctaButton:ctaAction:)` `static`

```swift
static func roadmap(style: WidgetStyle = .card, size: WidgetSize = .medium, ctaButton: CTAStyle? = CTAStyle(title: "View Roadmap"), ctaAction: (() -> Void)? = nil) -> AGWidgetConfiguration
```

**Parameters:**

- `style`: `WidgetStyle`
- `size`: `WidgetSize`
- `ctaButton`: `CTAStyle`

Default widget configuration for roadmap.

#### `status(style:size:ctaButton:ctaAction:slug:)` `static`

```swift
static func status(style: WidgetStyle = .card, size: WidgetSize = .medium, ctaButton: CTAStyle? = CTAStyle(title: "View Status"), ctaAction: (() -> Void)? = nil, slug: String = "status") -> AGWidgetConfiguration
```

**Parameters:**

- `style`: `WidgetStyle`
- `size`: `WidgetSize`
- `ctaButton`: `CTAStyle`
- `ctaAction`: `Void`

Default widget configuration for status.

---

## FeedbackStrings

**Kind:** `struct` | **Access:** `public`

**Conforms to:** `SendableMetatype`

### Declaration

```swift
struct FeedbackStrings
```

### Description

Customizable strings for the feedback UI.

### Examples

**Example**

```swift
let strings = FeedbackStrings(
    feedbackTitle: "Feature Requests",
    submitTitle: "Submit Request",
    titleLabel: "Title",
    descriptionLabel: "Description"
)
```

### Properties

| Name | Type | Description |
|------|------|-------------|
| `addCommentLabel` | `String` | Label for add comment section |
| `allCategoriesLabel` | `String` | Label for showing all categories |
| `allStatusesLabel` | `String` | Label for showing all statuses |
| `byAuthorPrefix` | `String` | Prefix for author attribution |
| `cancelButtonLabel` | `String` | Text for cancel button |
| `categoryFilterLabel` | `String` | Label for category filter when no category is selected |
| `closeButtonLabel` | `String` | Text for close button |
| `commentsLabel` | `String` | Label for comments section |
| `descriptionHint` | `String` | Placeholder hint for description input |
| `descriptionLabel` | `String` | Label for description input field |
| `detailTitle` | `String` | Title for the feedback detail view |
| `emptyActionLabel` | `String` | Button text for empty state action |
| `emptyMessage` | `String` | Message for empty feedback list |
| `emptyTitle` | `String` | Title for empty feedback list |
| `feedbackTitle` | `String` | Title for the feedback list view |
| `noCommentsMessage` | `String` | Message when no comments exist |
| `postCommentLabel` | `String` | Button text for posting a comment |
| `searchPlaceholder` | `String` | Placeholder for search field |
| `sortPrefix` | `String` | Prefix for sort filter |
| `statusFilterLabel` | `String` | Label for status filter when no status is selected |
| `submitButtonLabel` | `String` | Text for submit button |
| `submitTitle` | `String` | Title for the submit feedback view |
| `submittedMessage` | `String` | Message shown when feedback is submitted successfully |
| `titleHint` | `String` | Placeholder hint for title input |
| `titleLabel` | `String` | Label for title input field |
| `titlePlaceholder` | `String` | Placeholder for title input field |
| `default` | `FeedbackStrings` | Default strings configuration |

### Initializers

#### `init(feedbackTitle:submitTitle:detailTitle:statusFilterLabel:allStatusesLabel:categoryFilterLabel:allCategoriesLabel:sortPrefix:titleLabel:titleHint:titlePlaceholder:descriptionLabel:descriptionHint:submitButtonLabel:cancelButtonLabel:closeButtonLabel:commentsLabel:addCommentLabel:postCommentLabel:noCommentsMessage:emptyTitle:emptyMessage:emptyActionLabel:submittedMessage:searchPlaceholder:byAuthorPrefix:)`

```swift
init(feedbackTitle: String = "Feedback", submitTitle: String = "Submit Feedback", detailTitle: String = "Feedback", statusFilterLabel: String = "Status", allStatusesLabel: String = "All Statuses", categoryFilterLabel: String = "Category", allCategoriesLabel: String = "All Categories", sortPrefix: String = "Sort", titleLabel: String = "Title", titleHint: String = "Give your feedback a clear, concise title", titlePlaceholder: String = "e.g., Add dark mode support", descriptionLabel: String = "Description", descriptionHint: String = "Provide more details about your suggestion (optional)", submitButtonLabel: String = "Submit Feedback", cancelButtonLabel: String = "Cancel", closeButtonLabel: String = "Close", commentsLabel: String = "Comments", addCommentLabel: String = "Add a Comment", postCommentLabel: String = "Post Comment", noCommentsMessage: String = "No comments yet. Be the first to comment!", emptyTitle: String = "No Feedback Yet", emptyMessage: String = "Be the first to share your ideas!", emptyActionLabel: String = "Submit Feedback", submittedMessage: String = "Feedback Submitted!", searchPlaceholder: String = "Search feedback...", byAuthorPrefix: String = "by")
```

**Parameters:**

- `feedbackTitle`: `String`
- `submitTitle`: `String`
- `detailTitle`: `String`
- `statusFilterLabel`: `String`
- `allStatusesLabel`: `String`
- `categoryFilterLabel`: `String`
- `allCategoriesLabel`: `String`
- `sortPrefix`: `String`
- `titleLabel`: `String`
- `titleHint`: `String`
- `titlePlaceholder`: `String`
- `descriptionLabel`: `String`
- `descriptionHint`: `String`
- `submitButtonLabel`: `String`
- `cancelButtonLabel`: `String`
- `closeButtonLabel`: `String`
- `commentsLabel`: `String`
- `addCommentLabel`: `String`
- `postCommentLabel`: `String`
- `noCommentsMessage`: `String`
- `emptyTitle`: `String`
- `emptyMessage`: `String`
- `emptyActionLabel`: `String`
- `submittedMessage`: `String`
- `searchPlaceholder`: `String`

---

## Cache

**Kind:** `class` | **Access:** `public`

**Conforms to:** `SendableMetatype`, `NSSecureCoding`

### Declaration

```swift
actor Cache<Key, Value> where Key : Hashable, Key : Sendable, Value : Sendable
```

### Initializers

#### `init(defaultTTL:)`

```swift
init(defaultTTL: TimeInterval = 300)
```

### Methods

#### `cleanup()`

```swift
func cleanup()
```

#### `clear()`

```swift
func clear()
```

#### `get(key:)`

```swift
func get(key: Key) -> Value?
```

**Returns:** `Value?`

#### `remove(key:)`

```swift
func remove(key: Key)
```

**Parameters:**

- `key`: `Key`

#### `set(key:value:ttl:)`

```swift
func set(key: Key, value: Value, ttl: TimeInterval? = nil)
```

**Parameters:**

- `key`: `Key`
- `value`: `Value`

---

## PaginatedBlogPosts

**Kind:** `struct` | **Access:** `public`

**Conforms to:** `SendableMetatype`

### Declaration

```swift
struct PaginatedBlogPosts
```

### Description

Paginated result for blog posts.

### Properties

| Name | Type | Description |
|------|------|-------------|
| `page` | `Int` | Current page number. |
| `perPage` | `Int` | Number of items per page. |
| `posts` | `[BlogPost]` | The list of blog posts. |
| `total` | `Int` | Total number of posts matching the query. |
| `totalPages` | `Int` | Total number of pages. |

### Initializers

#### `init(posts:total:page:perPage:totalPages:)`

```swift
init(posts: [BlogPost], total: Int, page: Int, perPage: Int, totalPages: Int)
```

**Parameters:**

- `posts`: `BlogPost`
- `total`: `Int`
- `page`: `Int`
- `perPage`: `Int`
- `totalPages`: `Int`

---

## RoadmapView

**Kind:** `struct` | **Access:** `public`

### Declaration

```swift
@MainActor struct RoadmapView
```

### Properties

| Name | Type | Description |
|------|------|-------------|
| `body` | `some View` |  |

### Initializers

#### `init(roadmapService:)`

```swift
@MainActor init(roadmapService: RoadmapServiceProtocol)
```

**Parameters:**

- `roadmapService`: `RoadmapServiceProtocol`

---

## DesignSystem.Opacity

**Kind:** `struct` | **Access:** `public`

### Declaration

```swift
struct Opacity
```

### Description

Opacity constants for consistent transparency levels.

### Examples

**Example**

```swift
Text("Disabled")
    .opacity(DesignSystem.Opacity.disabled)
```

### Properties

| Name | Type | Description |
|------|------|-------------|
| `disabled` | `Double` | Disabled state opacity (0.4) |
| `full` | `Double` | Full opacity (1.0) |
| `muted` | `Double` | Muted content opacity (0.6) |
| `subtle` | `Double` | Subtle content opacity (0.8) |

---

## Logger

**Kind:** `class` | **Access:** `public`

### Declaration

```swift
final class Logger
```

### Description

Logger for AppGramSDK using OSLog with automatic production mode detection

### Properties

| Name | Type | Description |
|------|------|-------------|
| `isEnabled` | `Bool` | Global flag to enable/disable logging |
| `minimumLogLevel` | `LogLevel` | Minimum log level to display. Set to .info or .error in production to hide debug logs |
| `shared` | `Logger` | Shared logger instance for AppGramSDK |

### Initializers

#### `init(subsystem:category:)`

```swift
init(subsystem: String, category: String)
```

**Parameters:**

- `subsystem`: `String`
- `category`: `String`

Initialize a logger with a specific subsystem and category

### Methods

#### `debug(_:file:function:line:)`

```swift
func debug(_ message: @autoclosure () -> String, file: String = #file, function: String = #function, line: Int = #line)
```

**Parameters:**

- `_`: `String`
- `file`: `String`
- `function`: `String`
- `line`: `Int`

**Returns:** `String`

Log a debug message

#### `error(_:file:function:line:)`

```swift
func error(_ message: @autoclosure () -> String, file: String = #file, function: String = #function, line: Int = #line)
```

**Parameters:**

- `_`: `String`
- `file`: `String`
- `function`: `String`
- `line`: `Int`

**Returns:** `String`

Log an error message

#### `info(_:file:function:line:)`

```swift
func info(_ message: @autoclosure () -> String, file: String = #file, function: String = #function, line: Int = #line)
```

**Parameters:**

- `_`: `String`
- `file`: `String`
- `function`: `String`
- `line`: `Int`

**Returns:** `String`

Log an info message

#### `warning(_:file:function:line:)`

```swift
func warning(_ message: @autoclosure () -> String, file: String = #file, function: String = #function, line: Int = #line)
```

**Parameters:**

- `_`: `String`
- `file`: `String`
- `function`: `String`
- `line`: `Int`

**Returns:** `String`

Log a warning message

#### `category(_:)` `static`

```swift
static func category(_ name: String) -> Logger
```

**Returns:** `Logger`

Create a logger for a specific category

---

## SurveyNode

**Kind:** `struct` | **Access:** `public`

**Conforms to:** `SE`, `SendableMetatype`

### Declaration

```swift
struct SurveyNode
```

### Description

Represents a single question node in a survey.

### Examples

**Example**

```swift
let node = SurveyNode(
    id: "node1",
    question: "How satisfied are you?",
    questionType: .rating,
    options: nil,
    minRating: 1,
    maxRating: 5,
    isRequired: true,
    answerYesNodeId: nil,
    answerNoNodeId: nil,
    nextNodeId: "node2",
    branches: nil,
    resultMessage: nil,
    order: 1
)
```

### Properties

| Name | Type | Description |
|------|------|-------------|
| `answerNoNodeId` | `String?` | The next node ID if the answer is “no” (for yes/no questions). |
| `answerYesNodeId` | `String?` | The next node ID if the answer is “yes” (for yes/no questions). |
| `branches` | `[Branch]?` | Conditional branches that determine the next node based on the answer. |
| `id` | `String` | The unique identifier for the node. |
| `isRequired` | `Bool` | Whether this question must be answered. |
| `maxRating` | `Int?` | The maximum rating value for rating questions. |
| `minRating` | `Int?` | The minimum rating value for rating questions. |
| `nextNodeId` | `String?` | The default next node ID to navigate to. |
| `options` | `[NodeOption]?` | The available options for multiple choice or checkbox questions. |
| `order` | `Int?` | The display order of this node in the survey. |
| `question` | `String` | The question text to display. |
| `questionType` | `QuestionType` | The type of question (yes/no, multiple choice, rating, etc.). |
| `resultMessage` | `String?` | A message to display when this node is reached (typically for end nodes). |

### Initializers

#### `init(from:)`

```swift
init(from decoder: Decoder) throws
```

#### `init(id:question:questionType:options:minRating:maxRating:isRequired:answerYesNodeId:answerNoNodeId:nextNodeId:branches:resultMessage:order:)`

```swift
init(id: String, question: String, questionType: QuestionType, options: [NodeOption]?, minRating: Int?, maxRating: Int?, isRequired: Bool, answerYesNodeId: String?, answerNoNodeId: String?, nextNodeId: String?, branches: [Branch]?, resultMessage: String?, order: Int?)
```

**Parameters:**

- `id`: `String`
- `question`: `String`
- `questionType`: `QuestionType`
- `options`: `NodeOption`
- `minRating`: `Int`
- `maxRating`: `Int`
- `isRequired`: `Bool`
- `answerYesNodeId`: `String`
- `answerNoNodeId`: `String`
- `nextNodeId`: `String`
- `branches`: `Branch`
- `resultMessage`: `String`

---

## HelpArticleCard

**Kind:** `struct` | **Access:** `public`

### Declaration

```swift
@MainActor struct HelpArticleCard
```

### Properties

| Name | Type | Description |
|------|------|-------------|
| `body` | `some View` |  |

### Initializers

#### `init(article:)`

```swift
@MainActor init(article: HelpArticle)
```

**Parameters:**

- `article`: `HelpArticle`

---

## CompleteXExampleAppScreen

**Kind:** `struct` | **Access:** `public`

### Declaration

```swift
@MainActor struct CompleteXExampleAppScreen
```

### Properties

| Name | Type | Description |
|------|------|-------------|
| `body` | `some View` |  |

### Initializers

#### `init(configuration:)`

```swift
@MainActor init(configuration: Configuration = Configuration())
```

---

## FieldValidation

**Kind:** `struct` | **Access:** `public`

**Conforms to:** `SE`, `SendableMetatype`

### Declaration

```swift
struct FieldValidation
```

### Description

Validation rules for a form field.

### Examples

**Example**

```swift
let validation = FieldValidation(
    minLength: 3,
    maxLength: 50,
    pattern: "^[a-zA-Z]+$",
    patternMessage: "Only letters allowed"
)
```

### Properties

| Name | Type | Description |
|------|------|-------------|
| `maxLength` | `Int?` | The maximum allowed length of the input. |
| `minLength` | `Int?` | The minimum required length of the input. |
| `pattern` | `String?` | A regular expression pattern to validate against. |
| `patternMessage` | `String?` | The error message to display if the pattern doesn’t match. |

### Initializers

#### `init(from:)`

```swift
init(from decoder: any Decoder) throws
```

#### `init(minLength:maxLength:pattern:patternMessage:)`

```swift
init(minLength: Int?, maxLength: Int?, pattern: String?, patternMessage: String?)
```

**Parameters:**

- `minLength`: `Int`
- `maxLength`: `Int`
- `pattern`: `String`

---

## Branding

**Kind:** `struct` | **Access:** `public`

**Conforms to:** `SendableMetatype`

### Declaration

```swift
struct Branding
```

### Properties

| Name | Type | Description |
|------|------|-------------|
| `logo` | `String?` |  |
| `name` | `String?` |  |
| `primaryColor` | `String?` |  |

### Initializers

#### `init(from:)`

```swift
init(from decoder: any Decoder) throws
```

---

## CommentView

**Kind:** `struct` | **Access:** `public`

### Declaration

```swift
@MainActor struct CommentView
```

### Properties

| Name | Type | Description |
|------|------|-------------|
| `body` | `some View` |  |

### Initializers

#### `init(comment:)`

```swift
@MainActor init(comment: Comment)
```

**Parameters:**

- `comment`: `Comment`

---

## SupportTicketCard

**Kind:** `struct` | **Access:** `public`

### Declaration

```swift
@MainActor struct SupportTicketCard
```

### Properties

| Name | Type | Description |
|------|------|-------------|
| `body` | `some View` |  |

### Initializers

#### `init(ticket:)`

```swift
@MainActor init(ticket: SupportTicket)
```

**Parameters:**

- `ticket`: `SupportTicket`

---

## MagicLinkVerifyResponse

**Kind:** `struct` | **Access:** `public`

**Conforms to:** `SendableMetatype`

### Declaration

```swift
struct MagicLinkVerifyResponse
```

### Description

Response from verifying a magic link token.

### Properties

| Name | Type | Description |
|------|------|-------------|
| `tickets` | `[SupportTicket]` | The user’s support tickets. |
| `userEmail` | `String` | The verified user’s email address. |

### Initializers

#### `init(from:)`

```swift
init(from decoder: any Decoder) throws
```

---

## LoadingView

**Kind:** `struct` | **Access:** `public`

### Declaration

```swift
@MainActor struct LoadingView
```

### Properties

| Name | Type | Description |
|------|------|-------------|
| `body` | `some View` |  |

### Initializers

#### `init()`

```swift
@MainActor init()
```

---

## HelpFlow

**Kind:** `struct` | **Access:** `public`

**Conforms to:** `SE`, `SendableMetatype`

### Declaration

```swift
struct HelpFlow
```

### Description

Represents a help flow that guides users through a series of steps or decisions.

### Properties

| Name | Type | Description |
|------|------|-------------|
| `articles` | `[HelpArticle]?` | The articles in this flow. |
| `collectionId` | `String?` | The ID of the collection this flow belongs to. |
| `color` | `String?` | An optional color code. |
| `createdAt` | `Date?` | The date when the flow was created. |
| `decisionNodes` | `[HelpDecisionNode]?` | The decision nodes in this flow. |
| `description` | `String?` | An optional description of the flow. |
| `displayType` | `String?` | The display type for the flow. |
| `icon` | `String?` | An optional icon identifier. |
| `id` | `String` | The unique identifier for the flow. |
| `name` | `String` | The display name of the flow. |
| `slug` | `String` | The URL-friendly slug identifier. |
| `sortOrder` | `Int?` | The sort order of this flow. |
| `updatedAt` | `Date?` | The date when the flow was last updated. |
| `wizardSteps` | `[HelpWizardStep]?` | The wizard steps in this flow. |

### Initializers

#### `init(from:)`

```swift
init(from decoder: any Decoder) throws
```

### Methods

#### `hash(into:)`

```swift
func hash(into hasher: inout Hasher)
```

**Parameters:**

- `into`: `Hasher`

---

## DesignSystem.CornerRadius

**Kind:** `struct` | **Access:** `public`

### Declaration

```swift
struct CornerRadius
```

### Description

Corner radius constants for consistent rounded corners.

### Examples

**Example**

```swift
RoundedRectangle(cornerRadius: DesignSystem.CornerRadius.lg)
```

### Properties

| Name | Type | Description |
|------|------|-------------|
| `lg` | `CGFloat` | Large corner radius (12pt) - Cards, buttons (most common) |
| `md` | `CGFloat` | Medium corner radius (8pt) - Form fields |
| `pill` | `CGFloat` | Pill corner radius (999pt) - Capsule shapes |
| `sm` | `CGFloat` | Small corner radius (6pt) - Small buttons |
| `xl` | `CGFloat` | Extra large corner radius (16pt) - Large cards |
| `xs` | `CGFloat` | Extra small corner radius (4pt) - Badges |
| `xxl` | `CGFloat` | Extra extra large corner radius (20pt) - Sheets, modals |

---

## FormEmailFieldView

**Kind:** `struct` | **Access:** `public`

### Declaration

```swift
@MainActor struct FormEmailFieldView
```

### Properties

| Name | Type | Description |
|------|------|-------------|
| `body` | `some View` |  |

### Initializers

#### `init(field:value:error:onValidate:)`

```swift
@MainActor init(field: FormField, value: Binding<String>, error: String?, onValidate: @escaping () -> Void)
```

**Parameters:**

- `field`: `FormField`
- `value`: `String`
- `error`: `String`
- `onValidate`: `Void`

---

## FormTextFieldView

**Kind:** `struct` | **Access:** `public`

### Declaration

```swift
@MainActor struct FormTextFieldView
```

### Properties

| Name | Type | Description |
|------|------|-------------|
| `body` | `some View` |  |

### Initializers

#### `init(field:value:error:onValidate:)`

```swift
@MainActor init(field: FormField, value: Binding<String>, error: String?, onValidate: @escaping () -> Void)
```

**Parameters:**

- `field`: `FormField`
- `value`: `String`
- `error`: `String`
- `onValidate`: `Void`

---

## ErrorView

**Kind:** `struct` | **Access:** `public`

### Declaration

```swift
@MainActor struct ErrorView
```

### Properties

| Name | Type | Description |
|------|------|-------------|
| `body` | `some View` |  |

### Initializers

#### `init(error:retryAction:presentation:)`

```swift
@MainActor init(error: AppGramError, retryAction: (() async -> Void)? = nil, presentation: Presentation = .full)
```

**Parameters:**

- `error`: `AppGramError`
- `retryAction`: `Void`

---

## DesignSystem.Typography

**Kind:** `struct` | **Access:** `public`

### Declaration

```swift
struct Typography
```

### Description

Typography constants for font sizes, line heights, and weights.

### Examples

**Example**

```swift
Text("Headline")
    .font(.system(size: DesignSystem.Typography.xl, weight: DesignSystem.Typography.semibold))
    .lineSpacing(DesignSystem.Typography.xl * DesignSystem.Typography.lineHeightNormal - DesignSystem.Typography.xl)
```

### Properties

| Name | Type | Description |
|------|------|-------------|
| `base` | `CGFloat` | Base font size (16pt) - Body text, default |
| `bold` | `Font Weight` | Bold font weight |
| `lg` | `CGFloat` | Large font size (18pt) - Subheadings |
| `lineHeightNormal` | `CGFloat` | Normal line height (1.5x) - Standard body text |
| `lineHeightRelaxed` | `CGFloat` | Relaxed line height (1.75x) - Comfortable reading |
| `lineHeightTight` | `CGFloat` | Tight line height (1.25x) - Compact text |
| `medium` | `Font Weight` | Medium font weight |
| `regular` | `Font Weight` | Regular font weight |
| `semibold` | `Font Weight` | Semibold font weight |
| `sm` | `CGFloat` | Small font size (14pt) - Secondary text |
| `xl` | `CGFloat` | Extra large font size (20pt) - Headings |
| `xs` | `CGFloat` | Extra small font size (12pt) - Captions, fine print |
| `xxl` | `CGFloat` | Extra extra large font size (24pt) - Large headings |
| `xxxl` | `CGFloat` | Extra extra extra large font size (32pt) - Hero text |

---

## BlogPost

**Kind:** `struct` | **Access:** `public`

**Conforms to:** `SE`, `SendableMetatype`

### Declaration

```swift
struct BlogPost
```

### Description

Represents a blog post.

### Examples

**Example**

```swift
let post = try await blogService.getBlogPost(slug: "welcome-post")
print(post.title)
```

### Properties

| Name | Type | Description |
|------|------|-------------|
| `authorName` | `String?` | The name of the author. |
| `category` | `BlogCategoryRef?` | The category this post belongs to (nested object). |
| `categoryId` | `String?` | The category ID this post belongs to. |
| `content` | `String` | The full content of the post (markdown or HTML). |
| `createdAt` | `Date?` | The date when the post was created. |
| `excerpt` | `String?` | A short excerpt of the post. |
| `id` | `String` | The unique identifier for the post. |
| `isFeatured` | `Bool` | Whether this post is featured. |
| `metaDescription` | `String?` | The meta description for SEO. |
| `ogImageUrl` | `String?` | The Open Graph image URL. |
| `projectId` | `String` | The project ID this post belongs to. |
| `publishedAt` | `Date?` | The date when the post was published. |
| `slug` | `String` | The URL-friendly slug identifier. |
| `tags` | `[String]` | Tags associated with this post. |
| `title` | `String` | The title of the post. |
| `updatedAt` | `Date?` | The date when the post was last updated. |
| `viewCount` | `Int` | The number of times this post has been viewed. |

### Initializers

#### `init(from:)`

```swift
init(from decoder: Decoder) throws
```

#### `init(id:projectId:categoryId:title:slug:content:excerpt:metaDescription:ogImageUrl:authorName:publishedAt:isFeatured:tags:viewCount:createdAt:updatedAt:category:)`

```swift
init(id: String, projectId: String, categoryId: String?, title: String, slug: String, content: String, excerpt: String?, metaDescription: String?, ogImageUrl: String?, authorName: String?, publishedAt: Date?, isFeatured: Bool, tags: [String], viewCount: Int, createdAt: Date?, updatedAt: Date?, category: BlogCategoryRef?)
```

**Parameters:**

- `id`: `String`
- `projectId`: `String`
- `categoryId`: `String`
- `title`: `String`
- `slug`: `String`
- `content`: `String`
- `excerpt`: `String`
- `metaDescription`: `String`
- `ogImageUrl`: `String`
- `authorName`: `String`
- `publishedAt`: `Date`
- `isFeatured`: `Bool`
- `tags`: `String`
- `viewCount`: `Int`
- `createdAt`: `Date`
- `updatedAt`: `Date`

---

## ThemeEnvironmentKey

**Kind:** `struct` | **Access:** `public`

### Declaration

```swift
struct ThemeEnvironmentKey
```

### Properties

| Name | Type | Description |
|------|------|-------------|
| `defaultValue` | `AppGramTheme` |  |

---

## ParagraphQuestionView

**Kind:** `struct` | **Access:** `public`

### Declaration

```swift
@MainActor struct ParagraphQuestionView
```

### Properties

| Name | Type | Description |
|------|------|-------------|
| `body` | `some View` |  |

### Initializers

#### `init(text:style:)`

```swift
@MainActor init(text: Binding<String>, style: SurveyStyle = .normal)
```

**Parameters:**

- `text`: `String`

---

## RoadmapTimelineView

**Kind:** `struct` | **Access:** `public`

### Declaration

```swift
@MainActor struct RoadmapTimelineView
```

### Properties

| Name | Type | Description |
|------|------|-------------|
| `body` | `some View` |  |

### Initializers

#### `init(items:)`

```swift
@MainActor init(items: [RoadmapItem])
```

---

## SupportMessage

**Kind:** `struct` | **Access:** `public`

**Conforms to:** `SE`, `SendableMetatype`

### Declaration

```swift
struct SupportMessage
```

### Description

Represents a message in a support ticket conversation.

### Examples

**Example**

```swift
let message = SupportMessage(
    id: "msg123",
    ticketId: "ticket456",
    content: "We're looking into this issue.",
    authorName: "Support Team",
    authorEmail: "support@example.com",
    isFromSupport: true,
    attachments: nil,
    createdAt: Date()
)
```

### Properties

| Name | Type | Description |
|------|------|-------------|
| `attachments` | `[Attachment]?` | The list of file attachments in this message. |
| `authorEmail` | `String?` | The email address of the message author. |
| `authorName` | `String?` | The display name of the message author. |
| `content` | `String` | The text content of the message. |
| `createdAt` | `Date` | The date when the message was created. |
| `id` | `String` | The unique identifier for the message. |
| `isFromSupport` | `Bool` | Whether this message is from support staff. |
| `ticketId` | `String` | The ID of the ticket this message belongs to. |

### Initializers

#### `init(from:)`

```swift
init(from decoder: any Decoder) throws
```

#### `init(id:ticketId:content:authorName:authorEmail:isFromSupport:attachments:createdAt:)`

```swift
init(id: String, ticketId: String, content: String, authorName: String?, authorEmail: String?, isFromSupport: Bool, attachments: [Attachment]?, createdAt: Date)
```

**Parameters:**

- `id`: `String`
- `ticketId`: `String`
- `content`: `String`
- `authorName`: `String`
- `authorEmail`: `String`
- `isFromSupport`: `Bool`
- `attachments`: `Attachment`
- `createdAt`: `Date`

---

## StatusOverview

**Kind:** `struct` | **Access:** `public`

**Conforms to:** `SE`, `SendableMetatype`

### Declaration

```swift
struct StatusOverview
```

### Description

Represents the complete status overview for a status page.

### Examples

**Example**

```swift
let overview = StatusOverview(
    statusPage: statusPage,
    currentStatus: .operational,
    activeUpdates: [],
    services: [service1, service2],
    servicesStatus: ["service1": .operational, "service2": .degraded]
)
```

### Properties

| Name | Type | Description |
|------|------|-------------|
| `activeUpdates` | `[StatusUpdate]` | The list of active status updates or incidents. |
| `currentStatus` | `StatusType` | The overall current status of all services. |
| `services` | `[StatusPageService]?` | The list of services being monitored. |
| `servicesStatus` | `[String:StatusType]?` | A dictionary mapping service IDs to their current status. |
| `statusPage` | `StatusPage` | The status page information. |

### Initializers

#### `init(from:)`

```swift
init(from decoder: any Decoder) throws
```

---

## CompleteXExampleAppScreen.Configuration

**Kind:** `struct` | **Access:** `public`

**Conforms to:** `SendableMetatype`

### Declaration

```swift
struct Configuration
```

### Properties

| Name | Type | Description |
|------|------|-------------|
| `contactFormId` | `String` |  |
| `releasesOrgSlug` | `String` |  |
| `releasesProjectSlug` | `String` |  |
| `statusSlug` | `String` |  |
| `supportFormId` | `String` |  |
| `surveySlug` | `String` |  |
| `widgetSize` | `AGWidgetConfiguration WidgetSize` |  |
| `widgetStyle` | `AGWidgetConfiguration WidgetStyle` |  |

### Initializers

#### `init(surveySlug:supportFormId:contactFormId:statusSlug:releasesOrgSlug:releasesProjectSlug:widgetStyle:widgetSize:)`

```swift
init(surveySlug: String = "user-satisfaction", supportFormId: String = "support", contactFormId: String = "contact-us", statusSlug: String = "status", releasesOrgSlug: String = "your-org", releasesProjectSlug: String = "your-project", widgetStyle: AGWidgetConfiguration.WidgetStyle = .card, widgetSize: AGWidgetConfiguration.WidgetSize = .medium)
```

**Parameters:**

- `surveySlug`: `String`
- `supportFormId`: `String`
- `contactFormId`: `String`
- `statusSlug`: `String`
- `releasesOrgSlug`: `String`
- `releasesProjectSlug`: `String`
- `widgetStyle`: `WidgetStyle`

---

## AppLifecycleObserver

**Kind:** `class` | **Access:** `public`

### Declaration

```swift
@MainActor class AppLifecycleObserver
```

### Description

Observes app lifecycle events and provides callbacks for key events.

### Examples

**Example**

```swift
let observer = AppLifecycleObserver()
observer.onLaunch = {
    print("App launched!")
}
observer.onForeground = {
    print("App entered foreground")
}
```

### Properties

| Name | Type | Description |
|------|------|-------------|
| `onBackground` | `(() ->Void)?` | Called when the app enters the background. |
| `onForeground` | `(() ->Void)?` | Called when the app enters the foreground. |
| `onLaunch` | `(() ->Void)?` | Called when the app finishes launching. |

### Initializers

#### `init()`

```swift
@MainActor init()
```

---

## Announcement

**Kind:** `struct` | **Access:** `public`

**Conforms to:** `SE`, `SendableMetatype`

### Declaration

```swift
struct Announcement
```

### Description

Represents an announcement to be displayed to users.

### Examples

**Example**

```swift
let announcement = Announcement(
    id: "release123",
    title: "Version 2.0",
    subtitle: "Exciting new features",
    features: [feature1, feature2],
    version: "2.0.0",
    imageUrl: "https://example.com/preview.png",
    privacyNote: nil,
    learnMoreUrl: nil
)
```

### Properties

| Name | Type | Description |
|------|------|-------------|
| `createdAt` | `Date` | The date when the announcement was created. |
| `features` | `[AnnouncementFeature]` | The list of features or highlights to display. |
| `id` | `String` | The unique identifier for the announcement. |
| `imageUrl` | `String?` | An optional preview image URL. |
| `learnMoreUrl` | `String?` | An optional URL for “Learn more” link. |
| `privacyNote` | `String?` | An optional privacy notice to display. |
| `subtitle` | `String?` | An optional subtitle providing additional context. |
| `title` | `String` | The title of the announcement (e.g., “Introducing agent mode”). |
| `version` | `String?` | The version associated with this announcement. |

### Initializers

#### `init(from:)`

```swift
init(from decoder: any Decoder) throws
```

### Methods

#### `hash(into:)`

```swift
func hash(into hasher: inout Hasher)
```

**Parameters:**

- `into`: `Hasher`

#### `from(release:)` `static`

```swift
static func from(release: Release) -> Announcement
```

**Returns:** `Announcement`

Creates an announcement from a release.

---

## BlogPostDetailView

**Kind:** `struct` | **Access:** `public`

### Declaration

```swift
@MainActor struct BlogPostDetailView
```

### Description

A view displaying the full content of a blog post.

### Properties

| Name | Type | Description |
|------|------|-------------|
| `body` | `some View` |  |

### Initializers

#### `init(post:relatedPosts:onRelatedPostTap:onBack:)`

```swift
@MainActor init(post: BlogPost, relatedPosts: [BlogPost] = [], onRelatedPostTap: ((BlogPost) -> Void)? = nil, onBack: (() -> Void)? = nil)
```

**Parameters:**

- `post`: `BlogPost`
- `relatedPosts`: `BlogPost`
- `onRelatedPostTap`: `Void`

---

## SupportSubmissionView

**Kind:** `struct` | **Access:** `public`

### Declaration

```swift
@MainActor struct SupportSubmissionView
```

### Properties

| Name | Type | Description |
|------|------|-------------|
| `body` | `some View` |  |

---

## ReleaseFeature

**Kind:** `struct` | **Access:** `public`

**Conforms to:** `SE`, `SendableMetatype`

### Declaration

```swift
struct ReleaseFeature
```

### Description

Represents a feature included in a release.

### Examples

**Example**

```swift
let feature = ReleaseFeature(
    id: "feature123",
    title: "Dark Mode",
    description: "Added dark mode support throughout the app",
    imageUrl: "https://example.com/dark-mode.png",
    sortOrder: 1,
    createdAt: Date(),
    updatedAt: Date()
)
```

### Properties

| Name | Type | Description |
|------|------|-------------|
| `createdAt` | `Date` | The date when the feature was created. |
| `description` | `String?` | An optional description of the feature. |
| `id` | `String` | The unique identifier for the feature. |
| `imageUrl` | `String?` | The URL of an image showcasing the feature. |
| `sortOrder` | `Int?` | The display order of this feature. |
| `title` | `String` | The title of the feature. |
| `updatedAt` | `Date` | The date when the feature was last updated. |

### Initializers

#### `init(from:)`

```swift
init(from decoder: any Decoder) throws
```

### Methods

#### `hash(into:)`

```swift
func hash(into hasher: inout Hasher)
```

**Parameters:**

- `into`: `Hasher`

---

## HTMLView

**Kind:** `struct` | **Access:** `public`

### Declaration

```swift
@MainActor struct HTMLView
```

### Description

A SwiftUI view that renders HTML content using WKWebView with proper styling

### Initializers

#### `init(htmlContent:textColor:backgroundColor:contentHeight:)`

```swift
@MainActor init(htmlContent: String, textColor: UIColor = .label, backgroundColor: UIColor = .systemBackground, contentHeight: Binding<CGFloat> = .constant(100))
```

**Parameters:**

- `htmlContent`: `String`
- `textColor`: `UIColor`
- `backgroundColor`: `UIColor`

### Methods

#### `makeCoordinator()`

```swift
@MainActor func makeCoordinator() -> Coordinator
```

**Returns:** `Coordinator`

#### `makeUIView(context:)`

```swift
@MainActor func makeUIView(context: Context) -> WKWebView
```

**Returns:** `WKWebView`

#### `updateUIView(_:context:)`

```swift
@MainActor func updateUIView(_ webView: WKWebView, context: Context)
```

**Parameters:**

- `_`: `WKWebView`
- `context`: `Context`

---

## PopupTracker

**Kind:** `class` | **Access:** `public`

**Conforms to:** `SendableMetatype`, `NSSecureCoding`

### Declaration

```swift
actor PopupTracker
```

### Description

Actor for tracking popup display state and evaluating trigger conditions.

### Initializers

#### `init()`

```swift
init()
```

### Methods

#### `canShowNow(configuration:)`

```swift
func canShowNow(configuration: PopupConfiguration) -> Bool
```

**Returns:** `Bool`

Checks if the popup can be shown now, considering snooze and minimum interval.

#### `getDaysOfUsage()`

```swift
func getDaysOfUsage() -> Int
```

**Returns:** `Int`

Calculates the number of days since first app launch.

#### `getDismissCount()`

```swift
func getDismissCount() -> Int
```

**Returns:** `Int`

Returns the number of times the popup was dismissed without interaction.

#### `getInteractionCount()`

```swift
func getInteractionCount() -> Int
```

**Returns:** `Int`

Returns the number of times the user interacted with the popup.

#### `getLastShownDate()`

```swift
func getLastShownDate() -> Date?
```

**Returns:** `Date?`

Returns the date when the popup was last shown, if any.

#### `getLastSnoozeDate()`

```swift
func getLastSnoozeDate() -> Date?
```

**Returns:** `Date?`

Returns the date when the popup was last snoozed, if any.

#### `getLaunchCount()`

```swift
func getLaunchCount() -> Int
```

**Returns:** `Int`

Returns the current launch count.

#### `getTotalShownCount()`

```swift
func getTotalShownCount() -> Int
```

**Returns:** `Int`

Returns the total number of times the popup has been shown.

#### `isSnoozed(snoozeDuration:)`

```swift
func isSnoozed(snoozeDuration: TimeInterval) -> Bool
```

**Returns:** `Bool`

Checks if the popup is currently in a snoozed state.

#### `recordDismissed()`

```swift
func recordDismissed()
```

Records that the user dismissed the popup.

#### `recordInteraction()`

```swift
func recordInteraction()
```

Records that the user interacted with the popup (e.g., tapped a button).

#### `recordLaunch()`

```swift
func recordLaunch()
```

Records an app launch.

#### `recordShown()`

```swift
func recordShown()
```

Records that a popup was shown to the user.

#### `recordSnoozed()`

```swift
func recordSnoozed()
```

Records that the user snoozed the popup.

#### `reset()`

```swift
func reset()
```

Resets all tracking data.

#### `shouldShow(configuration:)`

```swift
func shouldShow(configuration: PopupConfiguration) -> Bool
```

**Returns:** `Bool`

Determines whether the popup should be shown based on the configuration.

---

## CreateTicketRequest

**Kind:** `struct` | **Access:** `public`

**Conforms to:** `SE`, `SendableMetatype`

### Declaration

```swift
struct CreateTicketRequest
```

### Description

A request to create a new support ticket.

### Examples

**Example**

```swift
let request = CreateTicketRequest(
    subject: "Login issue",
    description: "Cannot log in",
    priority: .high,
    userEmail: "user@example.com",
    userName: "John Doe",
    userId: "user123",
    projectId: "project456",
    attachmentUrls: ["https://example.com/file.png"]
)
```

### Properties

| Name | Type | Description |
|------|------|-------------|
| `attachmentUrls` | `[String]?` | URLs of files to attach to the ticket. |
| `description` | `String` | The detailed description of the issue. |
| `priority` | `TicketPriority` | The priority level of the ticket. |
| `projectId` | `String` | The project ID. |
| `subject` | `String` | The subject line of the ticket. |
| `userEmail` | `String` | The email address of the user creating the ticket. |
| `userId` | `String?` | The user ID of the ticket creator. |
| `userName` | `String?` | The display name of the user creating the ticket. |

### Initializers

#### `init(subject:description:priority:userEmail:userName:userId:projectId:attachmentUrls:)`

```swift
init(subject: String, description: String, priority: TicketPriority, userEmail: String, userName: String?, userId: String?, projectId: String, attachmentUrls: [String]?)
```

**Parameters:**

- `subject`: `String`
- `description`: `String`
- `priority`: `TicketPriority`
- `userEmail`: `String`
- `userName`: `String`
- `userId`: `String`
- `projectId`: `String`

---

## ButtonConfiguration

**Kind:** `struct` | **Access:** `public`

**Conforms to:** `SendableMetatype`

### Declaration

```swift
struct ButtonConfiguration
```

### Description

A reusable button configuration for SDK components.

### Examples

**Example**

```swift
let buttonConfig = ButtonConfiguration(
    title: "Get Started",
    style: .primary,
    backgroundColor: .blue,
    foregroundColor: .white,
    action: {
        print("Button tapped")
    }
)
```

### Properties

| Name | Type | Description |
|------|------|-------------|
| `action` | `(() ->Void)?` | Action to perform when button is tapped. |
| `backgroundColor` | `Color?` | Background color of the button. |
| `cornerRadius` | `CGFloat` | Corner radius for the button. |
| `fontSize` | `CGFloat` | Font size for the button text. |
| `fontWeight` | `Font Weight` | Font weight for the button text. |
| `foregroundColor` | `Color?` | Foreground (text) color of the button. |
| `height` | `CGFloat?` | Height of the button. |
| `padding` | `EdgeInsets` | Padding for the button content. |
| `style` | `ButtonStyle` | The button style. |
| `title` | `String` | The button title text. |

### Initializers

#### `init(title:style:backgroundColor:foregroundColor:fontWeight:fontSize:cornerRadius:height:padding:action:)`

```swift
init(title: String, style: ButtonStyle = .primary, backgroundColor: Color? = nil, foregroundColor: Color? = nil, fontWeight: Font.Weight = .semibold, fontSize: CGFloat = 17, cornerRadius: CGFloat = 12, height: CGFloat? = 50, padding: EdgeInsets = EdgeInsets(top: 0, leading: 0, bottom: 0, trailing: 0), action: (() -> Void)? = nil)
```

**Parameters:**

- `title`: `String`
- `style`: `ButtonStyle`
- `backgroundColor`: `Color`
- `foregroundColor`: `Color`
- `fontWeight`: `Weight`
- `fontSize`: `CGFloat`
- `cornerRadius`: `CGFloat`
- `height`: `CGFloat`
- `padding`: `EdgeInsets`

### Methods

#### `primary(title:backgroundColor:foregroundColor:action:)` `static`

```swift
static func primary(title: String, backgroundColor: Color = .white, foregroundColor: Color = .black, action: (() -> Void)? = nil) -> ButtonConfiguration
```

**Parameters:**

- `title`: `String`
- `backgroundColor`: `Color`
- `foregroundColor`: `Color`

Default primary button configuration.

#### `secondary(title:foregroundColor:action:)` `static`

```swift
static func secondary(title: String, foregroundColor: Color = .white, action: (() -> Void)? = nil) -> ButtonConfiguration
```

**Parameters:**

- `title`: `String`
- `foregroundColor`: `Color`

Default secondary button configuration.

#### `text(title:foregroundColor:action:)` `static`

```swift
static func text(title: String, foregroundColor: Color = .white, action: (() -> Void)? = nil) -> ButtonConfiguration
```

**Parameters:**

- `title`: `String`
- `foregroundColor`: `Color`

Default text button configuration.

---

## ContactFormSubmission

**Kind:** `struct` | **Access:** `public`

**Conforms to:** `SE`, `SendableMetatype`

### Declaration

```swift
struct ContactFormSubmission
```

### Description

A submission of a contact form.

### Examples

**Example**

```swift
let submission = ContactFormSubmission(
    formId: "form123",
    data: ["field1": "John Doe", "field2": "john@example.com"]
)
```

### Properties

| Name | Type | Description |
|------|------|-------------|
| `data` | `[String:String]` | A dictionary mapping field IDs to their submitted values. |
| `formId` | `String` | The ID of the form being submitted. |

### Initializers

#### `init(formId:data:)`

```swift
init(formId: String, data: [String : String])
```

**Parameters:**

- `formId`: `String`

---

## SupportFormView

**Kind:** `struct` | **Access:** `public`

### Declaration

```swift
@MainActor struct SupportFormView
```

### Properties

| Name | Type | Description |
|------|------|-------------|
| `body` | `some View` |  |

### Initializers

#### `init(form:supportService:userContextProvider:embedded:onDismiss:)`

```swift
@MainActor init(form: SupportForm, supportService: SupportServiceProtocol, userContextProvider: @escaping () -> UserContext?, embedded: Bool = false, onDismiss: @escaping () -> Void)
```

**Parameters:**

- `form`: `SupportForm`
- `supportService`: `SupportServiceProtocol`
- `userContextProvider`: `UserContext`
- `embedded`: `Bool`
- `onDismiss`: `Void`

---

## RoadmapColumn

**Kind:** `struct` | **Access:** `public`

**Conforms to:** `SendableMetatype`

### Declaration

```swift
struct RoadmapColumn
```

### Description

Represents a column in a kanban-style roadmap view.

### Examples

**Example**

```swift
let column = RoadmapColumn(
    status: .planned,
    items: [item1, item2, item3]
)
```

### Properties

| Name | Type | Description |
|------|------|-------------|
| `id` | `String` | The unique identifier for the column (same as status raw value). |
| `items` | `[RoadmapItem]` | The roadmap items in this column. |
| `status` | `WishStatus` | The status that this column represents. |

### Initializers

#### `init(status:items:)`

```swift
init(status: WishStatus, items: [RoadmapItem])
```

**Parameters:**

- `status`: `WishStatus`

---

## AnnouncementFeature

**Kind:** `struct` | **Access:** `public`

**Conforms to:** `SE`, `SendableMetatype`

### Declaration

```swift
struct AnnouncementFeature
```

### Description

Represents a feature highlight within an announcement.

### Examples

**Example**

```swift
let feature = AnnouncementFeature(
    id: "feature123",
    title: "Dark Mode",
    description: "Added dark mode support throughout the app",
    imageUrl: "https://example.com/dark-mode.png"
)
```

### Properties

| Name | Type | Description |
|------|------|-------------|
| `description` | `String?` | An optional description of the feature. |
| `id` | `String` | The unique identifier for the feature. |
| `imageUrl` | `String?` | An optional image URL showcasing the feature. |
| `title` | `String` | The title of the feature. |

### Initializers

#### `init(from:)`

```swift
init(from decoder: any Decoder) throws
```

### Methods

#### `hash(into:)`

```swift
func hash(into hasher: inout Hasher)
```

**Parameters:**

- `into`: `Hasher`

---

## SnoozeSettings

**Kind:** `struct` | **Access:** `public`

**Conforms to:** `SendableMetatype`

### Declaration

```swift
struct SnoozeSettings
```

### Description

Settings for the popup snooze functionality.

### Properties

| Name | Type | Description |
|------|------|-------------|
| `buttonTitle` | `String` | The title text for the snooze button. |
| `enabled` | `Bool` | Whether the snooze button is enabled. |
| `snoozeDuration` | `TimeInterval` | The duration (in seconds) to snooze the popup when the snooze button is tapped. |
| `default` | `SnoozeSettings` | Default snooze settings. |

### Initializers

#### `init(enabled:snoozeDuration:buttonTitle:)`

```swift
init(enabled: Bool = true, snoozeDuration: TimeInterval = 86400 * 7, buttonTitle: String = "Ask me later")
```

**Parameters:**

- `enabled`: `Bool`
- `snoozeDuration`: `TimeInterval`

---

## StatusConfiguration

**Kind:** `struct` | **Access:** `public`

**Conforms to:** `SendableMetatype`

### Declaration

```swift
struct StatusConfiguration
```

### Description

Configuration options for customizing the status page view appearance and behavior.

### Examples

**Example**

```swift
let config = StatusConfiguration(
    title: "System Status",
    autoRefreshInterval: 60,
    enableAutoRefresh: true,
    cardCornerRadius: 12,
    accentColor: .green
)
```

### Properties

| Name | Type | Description |
|------|------|-------------|
| `accentColor` | `Color?` | An optional accent color to apply to the status page. |
| `autoRefreshInterval` | `TimeInterval` | The interval in seconds for automatic status updates. |
| `cardCornerRadius` | `CGFloat` | The corner radius for status cards. |
| `cardShadowRadius` | `CGFloat` | The shadow radius for status cards. |
| `enableAutoRefresh` | `Bool` | Whether to automatically refresh the status page. |
| `title` | `String` | The title displayed at the top of the status page. |
| `default` | `StatusConfiguration` |  |

### Initializers

#### `init(title:autoRefreshInterval:enableAutoRefresh:cardCornerRadius:cardShadowRadius:accentColor:)`

```swift
init(title: String = "Service Status", autoRefreshInterval: TimeInterval = 30, enableAutoRefresh: Bool = true, cardCornerRadius: CGFloat = 12, cardShadowRadius: CGFloat = 2, accentColor: Color? = nil)
```

**Parameters:**

- `title`: `String`
- `autoRefreshInterval`: `TimeInterval`
- `enableAutoRefresh`: `Bool`
- `cardCornerRadius`: `CGFloat`
- `cardShadowRadius`: `CGFloat`

---

## ContactForm

**Kind:** `struct` | **Access:** `public`

**Conforms to:** `SE`, `SendableMetatype`

### Declaration

```swift
struct ContactForm
```

### Description

Represents a contact form that can be displayed to users.

### Examples

**Example**

```swift
let form = ContactForm(
    id: "form123",
    name: "Contact Us",
    slug: "contact-us",
    description: "Get in touch with us",
    projectId: "project456",
    fields: [field1, field2],
    submitButtonText: "Submit",
    successMessage: "Thank you!",
    emailRecipient: "support@example.com",
    emailSubject: "New Contact Form Submission",
    isActive: true,
    enabled: true,
    createdAt: Date()
)
```

### Properties

| Name | Type | Description |
|------|------|-------------|
| `createdAt` | `Date?` | The date when the form was created. |
| `description` | `String?` | An optional description of the form. |
| `emailRecipient` | `String?` | The email address to send form submissions to. |
| `emailSubject` | `String?` | The subject line for email notifications. |
| `enabled` | `Bool?` | Whether the form is enabled. |
| `fields` | `[FormField]` | The list of fields in the form. |
| `id` | `String` | The unique identifier for the form. |
| `isActive` | `Bool?` | Whether the form is active. |
| `isFormActive` | `Bool` | Computed property to check if form is active (uses enabled if isActive is not set) |
| `name` | `String` | The display name of the form. |
| `projectId` | `String?` | The project ID this form belongs to. |
| `slug` | `String?` | The URL-friendly slug identifier. |
| `submitButtonText` | `String` | The text to display on the submit button. |
| `successMessage` | `String?` | The message to display after successful submission. |

### Initializers

#### `init(from:)`

```swift
init(from decoder: any Decoder) throws
```

#### `init(id:name:slug:description:projectId:fields:submitButtonText:successMessage:emailRecipient:emailSubject:isActive:enabled:createdAt:)`

```swift
init(id: String, name: String, slug: String?, description: String?, projectId: String?, fields: [FormField], submitButtonText: String, successMessage: String?, emailRecipient: String?, emailSubject: String?, isActive: Bool?, enabled: Bool?, createdAt: Date?)
```

**Parameters:**

- `id`: `String`
- `name`: `String`
- `slug`: `String`
- `description`: `String`
- `projectId`: `String`
- `fields`: `FormField`
- `submitButtonText`: `String`
- `successMessage`: `String`
- `emailRecipient`: `String`
- `emailSubject`: `String`
- `isActive`: `Bool`
- `enabled`: `Bool`

---

## HelpArticle

**Kind:** `struct` | **Access:** `public`

**Conforms to:** `SE`, `SendableMetatype`

### Declaration

```swift
struct HelpArticle
```

### Description

Represents a help article or documentation page.

### Examples

**Example**

```swift
let article = HelpArticle(
    id: "article123",
    title: "How to Get Started",
    slug: "how-to-get-started",
    content: "# Getting Started\n\nWelcome to...",
    excerpt: "Learn the basics",
    collectionId: "col456",
    projectId: "project789",
    order: 1,
    isPublished: true,
    createdAt: Date(),
    updatedAt: nil
)
```

### Properties

| Name | Type | Description |
|------|------|-------------|
| `collectionId` | `String?` | The ID of the collection this article belongs to. |
| `content` | `String` | The full content of the article (may contain markdown or HTML). |
| `createdAt` | `Date?` | The date when the article was created. |
| `excerpt` | `String?` | An optional excerpt or summary of the article. |
| `id` | `String` | The unique identifier for the article. |
| `isPublished` | `Bool` | Whether the article is published and visible to users. |
| `order` | `Int?` | The display order of this article. |
| `projectId` | `String?` | The project ID this article belongs to. |
| `slug` | `String` | The URL-friendly slug identifier. |
| `title` | `String` | The title of the article. |
| `updatedAt` | `Date?` | The date when the article was last updated. |

### Initializers

#### `init(from:)`

```swift
init(from decoder: Decoder) throws
```

#### `init(id:title:slug:content:excerpt:collectionId:projectId:order:isPublished:createdAt:updatedAt:)`

```swift
init(id: String, title: String, slug: String, content: String, excerpt: String?, collectionId: String?, projectId: String?, order: Int?, isPublished: Bool, createdAt: Date?, updatedAt: Date?)
```

**Parameters:**

- `id`: `String`
- `title`: `String`
- `slug`: `String`
- `content`: `String`
- `excerpt`: `String`
- `collectionId`: `String`
- `projectId`: `String`
- `order`: `Int`
- `isPublished`: `Bool`
- `createdAt`: `Date`

### Methods

#### `hash(into:)`

```swift
func hash(into hasher: inout Hasher)
```

**Parameters:**

- `into`: `Hasher`

---

## BlogView

**Kind:** `struct` | **Access:** `public`

### Declaration

```swift
@MainActor struct BlogView
```

### Description

The main blog view that combines list and detail views.

### Properties

| Name | Type | Description |
|------|------|-------------|
| `body` | `some View` |  |

### Initializers

#### `init(blogService:)`

```swift
@MainActor init(blogService: BlogServiceProtocol)
```

**Parameters:**

- `blogService`: `BlogServiceProtocol`

### Methods

#### `create()` `static` `throws`

```swift
@MainActor static func create() throws -> BlogView
```

**Returns:** `BlogView`

Creates a BlogView using the shared SDK instance.

---

## BlogCategoryRef

**Kind:** `struct` | **Access:** `public`

**Conforms to:** `SE`, `SendableMetatype`

### Declaration

```swift
struct BlogCategoryRef
```

### Description

A lightweight reference to a blog category (used in nested objects).

### Properties

| Name | Type | Description |
|------|------|-------------|
| `color` | `String?` | The color associated with this category (hex string). |
| `id` | `String` | The unique identifier for the category. |
| `name` | `String` | The display name of the category. |
| `slug` | `String` | The URL-friendly slug identifier. |

### Initializers

#### `init(from:)`

```swift
init(from decoder: any Decoder) throws
```

#### `init(id:name:slug:color:)`

```swift
init(id: String, name: String, slug: String, color: String?)
```

**Parameters:**

- `id`: `String`
- `name`: `String`
- `slug`: `String`

---

## StatusBadge

**Kind:** `struct` | **Access:** `public`

### Declaration

```swift
@MainActor struct StatusBadge
```

### Description

Status badge with shadcn-inspired minimal styling.

### Examples

**Example**

```swift
StatusBadge(status: .inProgress)
```

### Properties

| Name | Type | Description |
|------|------|-------------|
| `body` | `some View` |  |

### Initializers

#### `init(status:)`

```swift
@MainActor init(status: WishStatus)
```

**Parameters:**

- `status`: `WishStatus`

---

## StatusPageView

**Kind:** `struct` | **Access:** `public`

### Declaration

```swift
@MainActor struct StatusPageView
```

### Properties

| Name | Type | Description |
|------|------|-------------|
| `body` | `some View` |  |

### Initializers

#### `init(projectId:slug:apiBaseURL:apiKey:configuration:notificationManager:onSubscribe:onDismiss:)`

```swift
@MainActor init(projectId: String, slug: String = "status", apiBaseURL: String, apiKey: String? = nil, configuration: StatusConfiguration = .default, notificationManager: NotificationManager? = nil, onSubscribe: (() async throws -> Void)? = nil, onDismiss: (() -> Void)? = nil)
```

**Parameters:**

- `projectId`: `String`
- `slug`: `String`
- `apiBaseURL`: `String`
- `apiKey`: `String`
- `configuration`: `StatusConfiguration`
- `notificationManager`: `NotificationManager`
- `onSubscribe`: `Void`

---

## SupportRequestFilters

**Kind:** `struct` | **Access:** `public`

**Conforms to:** `SendableMetatype`

### Declaration

```swift
struct SupportRequestFilters
```

### Description

Filters for querying support tickets.

### Examples

**Example**

```swift
let filters = SupportRequestFilters(
    email: "user@example.com",
    externalUserId: "user123",
    page: 1,
    perPage: 20
)
```

### Properties

| Name | Type | Description |
|------|------|-------------|
| `email` | `String?` | Filter by user email address. |
| `externalUserId` | `String?` | Filter by external user ID. |
| `page` | `Int` | The page number for pagination (1-based). |
| `perPage` | `Int` | The number of tickets to return per page. |

### Initializers

#### `init(email:externalUserId:page:perPage:)`

```swift
init(email: String? = nil, externalUserId: String? = nil, page: Int = 1, perPage: Int = 20)
```

**Parameters:**

- `email`: `String`
- `externalUserId`: `String`
- `page`: `Int`

---

## AnnouncementManager

**Kind:** `class` | **Access:** `public`

### Declaration

```swift
@MainActor final class AnnouncementManager
```

### Description

Manages the display and lifecycle of announcements.

### Properties

| Name | Type | Description |
|------|------|-------------|
| `isShowingAnnouncements` | `Bool` |  |
| `onAnnouncementAction` | `((Announcement) ->Void)?` | Callback invoked when user takes action on an announcement. |

### Initializers

#### `init(configuration:releasesService:)`

```swift
@MainActor init(configuration: AnnouncementConfiguration, releasesService: ReleasesServiceProtocol)
```

**Parameters:**

- `configuration`: `AnnouncementConfiguration`
- `releasesService`: `ReleasesServiceProtocol`

Initializes the announcement manager.

### Methods

#### `checkAndFetchAnnouncements()` `async`

```swift
@MainActor func checkAndFetchAnnouncements() async
```

Checks for new announcements and fetches them if needed.

#### `checkAndPresentIfNeeded()` `async`

```swift
@MainActor func checkAndPresentIfNeeded() async
```

Checks if announcements should be shown and displays them if appropriate.

#### `clearSeenHistory()`

```swift
@MainActor func clearSeenHistory()
```

Clears the seen announcement history.

#### `presentAnnouncements()` `async`

```swift
@MainActor func presentAnnouncements() async
```

Manually presents announcements.

#### `start()`

```swift
@MainActor func start()
```

Starts the announcement manager.

---

## ContactFormsAPIResponse

**Kind:** `struct` | **Access:** `public`

**Conforms to:** `SendableMetatype`

### Declaration

```swift
struct ContactFormsAPIResponse
```

### Properties

| Name | Type | Description |
|------|------|-------------|
| `data` | `ContactFormsResponse` |  |
| `success` | `Bool?` |  |

### Initializers

#### `init(from:)`

```swift
init(from decoder: any Decoder) throws
```

---

## DesignSystem

**Kind:** `struct` | **Access:** `public`

### Declaration

```swift
struct DesignSystem
```

### Description

Design system constants based on shadcn principles.

### Examples

**Usage**

```swift
VStack(spacing: DesignSystem.Spacing.lg) {
    Text("Hello")
        .font(.system(size: DesignSystem.Typography.xl, weight: DesignSystem.Typography.semibold))
        .padding(DesignSystem.Spacing.md)
}
.background(colors.cardBackground)
.clipShape(RoundedRectangle(cornerRadius: DesignSystem.CornerRadius.lg))
.shadowStyle(DesignSystem.Shadow.sm)
```

---

## RoadmapItem

**Kind:** `struct` | **Access:** `public`

**Conforms to:** `SE`, `SendableMetatype`

### Declaration

```swift
struct RoadmapItem
```

### Description

Represents an item on the product roadmap.

### Examples

**Example**

```swift
let item = RoadmapItem(
    id: "item123",
    title: "Dark Mode",
    description: "Add dark mode support",
    status: .inProgress,
    voteCount: 150,
    commentCount: 25,
    category: category,
    targetDate: Date().addingTimeInterval(86400 * 30),
    completedAt: nil,
    createdAt: Date()
)
```

### Properties

| Name | Type | Description |
|------|------|-------------|
| `category` | `Category?` | The category this item belongs to, if any. |
| `commentCount` | `Int` | The number of comments on this item. |
| `completedAt` | `Date?` | The date when the item was completed, if applicable. |
| `createdAt` | `Date` | The date when the item was created. |
| `description` | `String?` | An optional detailed description. |
| `id` | `String` | The unique identifier for the roadmap item. |
| `status` | `WishStatus` | The current status of the roadmap item. |
| `targetDate` | `Date?` | The target date for completion, if set. |
| `title` | `String` | The title of the roadmap item. |
| `voteCount` | `Int` | The number of votes this item has received. |

### Initializers

#### `init(from:)`

```swift
init(from decoder: any Decoder) throws
```

#### `init(id:title:description:status:voteCount:commentCount:category:targetDate:completedAt:createdAt:)`

```swift
init(id: String, title: String, description: String?, status: WishStatus, voteCount: Int, commentCount: Int, category: Category?, targetDate: Date?, completedAt: Date?, createdAt: Date)
```

**Parameters:**

- `id`: `String`
- `title`: `String`
- `description`: `String`
- `status`: `WishStatus`
- `voteCount`: `Int`
- `commentCount`: `Int`
- `category`: `Category`
- `targetDate`: `Date`
- `completedAt`: `Date`
- `createdAt`: `Date`

### Methods

#### `hash(into:)`

```swift
func hash(into hasher: inout Hasher)
```

**Parameters:**

- `into`: `Hasher`

---

## AGWidgetConfiguration.CTAStyle

**Kind:** `struct` | **Access:** `public`

**Conforms to:** `SendableMetatype`

### Declaration

```swift
struct CTAStyle
```

### Description

Configuration for the call-to-action button.

### Properties

| Name | Type | Description |
|------|------|-------------|
| `backgroundColor` | `Color` | Background color of the CTA button. |
| `cornerRadius` | `CGFloat` | Corner radius for the CTA button. |
| `fontWeight` | `Font Weight` | Font weight for the CTA button text. |
| `foregroundColor` | `Color` | Foreground (text) color of the CTA button. |
| `padding` | `EdgeInsets` | Padding for the CTA button. |
| `title` | `String` | The title text for the CTA button. |
| `default` | `AGWidgetConfiguration CTAStyle` | Default CTA style. |

### Initializers

#### `init(title:backgroundColor:foregroundColor:fontWeight:cornerRadius:padding:)`

```swift
init(title: String, backgroundColor: Color = .blue, foregroundColor: Color = .white, fontWeight: Font.Weight = .semibold, cornerRadius: CGFloat = 10, padding: EdgeInsets = EdgeInsets(top: 12, leading: 24, bottom: 12, trailing: 24))
```

**Parameters:**

- `title`: `String`
- `backgroundColor`: `Color`
- `foregroundColor`: `Color`
- `fontWeight`: `Weight`
- `cornerRadius`: `CGFloat`

---

## Debouncer

**Kind:** `class` | **Access:** `public`

### Declaration

```swift
@MainActor final class Debouncer
```

### Initializers

#### `init(delay:)`

```swift
@MainActor init(delay: TimeInterval = 0.3)
```

### Methods

#### `cancel()`

```swift
@MainActor func cancel()
```

#### `debounce(action:)` `async`

```swift
@MainActor func debounce(action: @escaping () async -> Void)
```

**Parameters:**

- `action`: `Void`

---

## DesignSystem.BorderWidth

**Kind:** `struct` | **Access:** `public`

### Declaration

```swift
struct BorderWidth
```

### Description

Border width constants for subtle borders.

### Examples

**Example**

```swift
RoundedRectangle(cornerRadius: DesignSystem.CornerRadius.lg)
    .strokeBorder(colors.neutral200, lineWidth: DesignSystem.BorderWidth.thin)
```

### Properties

| Name | Type | Description |
|------|------|-------------|
| `hairline` | `CGFloat` | Hairline border (0.5pt) - Ultra-subtle separation |
| `medium` | `CGFloat` | Medium border (1.5pt) - Emphasized border |
| `thick` | `CGFloat` | Thick border (2pt) - Strong border |
| `thin` | `CGFloat` | Thin border (1pt) - Standard border (most common) |

---

## Comment

**Kind:** `struct` | **Access:** `public`

**Conforms to:** `SE`, `SendableMetatype`

### Declaration

```swift
struct Comment
```

### Description

Represents a comment on a feedback item (wish).

### Examples

**Example**

```swift
let comment = Comment(
    id: "comment123",
    content: "Great idea! We'll consider this for our next release.",
    wishId: "wish456",
    userId: "user789",
    authorName: "Support Team",
    authorEmail: "support@example.com",
    isOfficial: true,
    createdAt: Date(),
    updatedAt: nil
)
```

### Properties

| Name | Type | Description |
|------|------|-------------|
| `authorEmail` | `String?` | The email address of the comment author. |
| `authorName` | `String?` | The display name of the comment author. |
| `content` | `String` | The text content of the comment. |
| `createdAt` | `Date` | The date when the comment was created. |
| `id` | `String` | The unique identifier for the comment. |
| `isOfficial` | `Bool` | Whether this comment is from official support staff. |
| `updatedAt` | `Date?` | The date when the comment was last updated. |
| `userId` | `String?` | The optional user ID of the comment author. |
| `wishId` | `String` | The ID of the wish this comment belongs to. |

### Initializers

#### `init(from:)`

```swift
init(from decoder: any Decoder) throws
```

#### `init(id:content:wishId:userId:authorName:authorEmail:isOfficial:createdAt:updatedAt:)`

```swift
init(id: String, content: String, wishId: String, userId: String?, authorName: String?, authorEmail: String?, isOfficial: Bool, createdAt: Date, updatedAt: Date?)
```

**Parameters:**

- `id`: `String`
- `content`: `String`
- `wishId`: `String`
- `userId`: `String`
- `authorName`: `String`
- `authorEmail`: `String`
- `isOfficial`: `Bool`
- `createdAt`: `Date`

---

## ShortAnswerQuestionView

**Kind:** `struct` | **Access:** `public`

### Declaration

```swift
@MainActor struct ShortAnswerQuestionView
```

### Properties

| Name | Type | Description |
|------|------|-------------|
| `body` | `some View` |  |

### Initializers

#### `init(text:style:)`

```swift
@MainActor init(text: Binding<String>, style: SurveyStyle = .normal)
```

**Parameters:**

- `text`: `String`

---

## ReleasesConfiguration

**Kind:** `struct` | **Access:** `public`

**Conforms to:** `SendableMetatype`

### Declaration

```swift
struct ReleasesConfiguration
```

### Description

Configuration options for customizing the releases view appearance and behavior.

### Examples

**Example**

```swift
let config = ReleasesConfiguration(
    title: "What's New",
    showVersionBadge: true,
    cardCornerRadius: 16,
    accentColor: .blue
)
```

### Properties

| Name | Type | Description |
|------|------|-------------|
| `accentColor` | `Color?` | An optional accent color to apply to the releases view. |
| `cardCornerRadius` | `CGFloat` | The corner radius for release cards. |
| `imageCornerRadius` | `CGFloat` | The corner radius for release images. |
| `showVersionBadge` | `Bool` | Whether to show version badges on release cards. |
| `title` | `String` | The title displayed at the top of the releases view. |
| `default` | `ReleasesConfiguration` |  |

### Initializers

#### `init(title:showVersionBadge:cardCornerRadius:imageCornerRadius:accentColor:)`

```swift
init(title: String = "Release Notes", showVersionBadge: Bool = true, cardCornerRadius: CGFloat = 12, imageCornerRadius: CGFloat = 8, accentColor: Color? = nil)
```

**Parameters:**

- `title`: `String`
- `showVersionBadge`: `Bool`
- `cardCornerRadius`: `CGFloat`
- `imageCornerRadius`: `CGFloat`

---

## WidgetView

**Kind:** `struct` | **Access:** `public`

### Declaration

```swift
@MainActor struct WidgetView
```

### Description

A customizable widget view that can be embedded in any screen.

### Examples

**Example**

```swift
let config = WidgetConfiguration.feedback(
    style: .card,
    size: .medium,
    ctaButton: CTAStyle(title: "Submit Feedback"),
    ctaAction: {
        // Handle CTA tap
    }
)

WidgetView(configuration: config, widgetService: service)
```

### Properties

| Name | Type | Description |
|------|------|-------------|
| `body` | `some View` |  |

### Initializers

#### `init(configuration:widgetService:)`

```swift
@MainActor init(configuration: AGWidgetConfiguration, widgetService: WidgetServiceProtocol)
```

**Parameters:**

- `configuration`: `AGWidgetConfiguration`
- `widgetService`: `WidgetServiceProtocol`

---

## VoteRequest

**Kind:** `struct` | **Access:** `public`

**Conforms to:** `SE`, `SendableMetatype`

### Declaration

```swift
struct VoteRequest
```

### Description

A request to add a vote to a wish.

### Examples

**Example**

```swift
let request = VoteRequest(
    wishId: "wish123",
    projectId: "project456",
    userId: "user789",
    fingerprint: nil
)
```

### Properties

| Name | Type | Description |
|------|------|-------------|
| `fingerprint` | `String?` | The device fingerprint for anonymous voters. |
| `projectId` | `String` | The project ID. |
| `userId` | `String?` | The optional user ID of the voter. |
| `wishId` | `String` | The ID of the wish to vote for. |

### Initializers

#### `init(wishId:projectId:userId:fingerprint:)`

```swift
init(wishId: String, projectId: String, userId: String?, fingerprint: String?)
```

**Parameters:**

- `wishId`: `String`
- `projectId`: `String`
- `userId`: `String`

---

## DesignSystem.Animation

**Kind:** `struct` | **Access:** `public`

### Declaration

```swift
struct Animation
```

### Description

Animation constants for smooth, natural transitions.

### Examples

**Example**

```swift
Button("Tap me")
    .scaleEffect(isPressed ? 0.97 : 1.0)
    .animation(DesignSystem.Animation.spring, value: isPressed)
```

### Properties

| Name | Type | Description |
|------|------|-------------|
| `easeIn` | `Animation` | Ease in animation - Starts slow, ends fast |
| `easeInOut` | `Animation` | Ease in-out animation - Starts slow, fast in middle, ends slow |
| `easeOut` | `Animation` | Ease out animation - Starts fast, ends slow |
| `fast` | `Double` | Fast animation (0.15s) - Quick state changes |
| `instant` | `Double` | Instant animation (0.1s) - Very quick state changes |
| `normal` | `Double` | Normal animation (0.2s) - Standard transitions (most common) |
| `slow` | `Double` | Slow animation (0.3s) - Deliberate animations |
| `slower` | `Double` | Slower animation (0.4s) - Complex animations |
| `spring` | `Animation` | Standard spring animation - Balanced and versatile |
| `springBouncy` | `Animation` | Bouncy spring animation - Playful and energetic |
| `springSmooth` | `Animation` | Smooth spring animation - Elegant and refined |

---

## MagicLinkResponse

**Kind:** `struct` | **Access:** `public`

**Conforms to:** `SendableMetatype`

### Declaration

```swift
struct MagicLinkResponse
```

### Description

Response from sending a magic link email.

### Properties

| Name | Type | Description |
|------|------|-------------|
| `message` | `String` | A message describing the result. |
| `success` | `Bool` | Whether the magic link was sent successfully. |

### Initializers

#### `init(from:)`

```swift
init(from decoder: any Decoder) throws
```

---

## StandaloneFormResponse

**Kind:** `struct` | **Access:** `public`

**Conforms to:** `SendableMetatype`

### Declaration

```swift
struct StandaloneFormResponse
```

### Properties

| Name | Type | Description |
|------|------|-------------|
| `branding` | `Branding?` |  |
| `form` | `ContactForm` |  |
| `projectId` | `String` |  |

### Initializers

#### `init(from:)`

```swift
init(from decoder: any Decoder) throws
```

---

## HelpWizardStep

**Kind:** `struct` | **Access:** `public`

**Conforms to:** `SE`, `SendableMetatype`

### Declaration

```swift
struct HelpWizardStep
```

### Description

Represents a step in a help wizard flow.

### Examples

**Example**

```swift
let step = HelpWizardStep(
    id: "step123",
    stepNumber: 1,
    title: "Getting Started",
    content: "<p>Welcome to the first step...</p>",
    articleId: "article456",
    flowId: "flow789",
    createdAt: Date(),
    updatedAt: nil
)
```

### Properties

| Name | Type | Description |
|------|------|-------------|
| `articleId` | `String?` | Optional ID of a linked help article. |
| `content` | `String` | The HTML or markdown content for the step. |
| `createdAt` | `Date?` | The date when the step was created. |
| `flowId` | `String?` | The ID of the flow this step belongs to. |
| `id` | `String` | The unique identifier for the wizard step. |
| `stepNumber` | `Int` | The step number used for ordering (ascending). |
| `title` | `String` | The title of the wizard step. |
| `updatedAt` | `Date?` | The date when the step was last updated. |

### Initializers

#### `init(from:)`

```swift
init(from decoder: any Decoder) throws
```

#### `init(id:stepNumber:title:content:articleId:flowId:createdAt:updatedAt:)`

```swift
init(id: String, stepNumber: Int, title: String, content: String, articleId: String? = nil, flowId: String? = nil, createdAt: Date? = nil, updatedAt: Date? = nil)
```

**Parameters:**

- `id`: `String`
- `stepNumber`: `Int`
- `title`: `String`
- `content`: `String`
- `articleId`: `String`
- `flowId`: `String`
- `createdAt`: `Date`

### Methods

#### `hash(into:)`

```swift
func hash(into hasher: inout Hasher)
```

**Parameters:**

- `into`: `Hasher`

---

## SurveyAnswerPayload

**Kind:** `struct` | **Access:** `public`

**Conforms to:** `SE`, `SendableMetatype`

### Declaration

```swift
struct SurveyAnswerPayload
```

### Description

Represents a single answer to a survey question node.

### Examples

**Example**

```swift
let payload = SurveyAnswerPayload(
    nodeId: "node1",
    answer: "5",
    answerText: nil,
    answerOptions: nil
)
```

### Properties

| Name | Type | Description |
|------|------|-------------|
| `answer` | `String?` | The answer value (for rating or yes/no questions). |
| `answerOptions` | `[String]?` | The selected options (for multiple choice or checkbox questions). |
| `answerText` | `String?` | The text answer (for text or paragraph questions). |
| `nodeId` | `String` | The ID of the question node this answer is for. |

### Initializers

#### `init(nodeId:answer:answerText:answerOptions:)`

```swift
init(nodeId: String, answer: String? = nil, answerText: String? = nil, answerOptions: [String]? = nil)
```

**Parameters:**

- `nodeId`: `String`
- `answer`: `String`
- `answerText`: `String`

---

## ContactFormsResponse

**Kind:** `struct` | **Access:** `public`

**Conforms to:** `SendableMetatype`

### Declaration

```swift
struct ContactFormsResponse
```

### Properties

| Name | Type | Description |
|------|------|-------------|
| `contactForms` | `[String:ContactForm]` |  |

### Initializers

#### `init(from:)`

```swift
init(from decoder: any Decoder) throws
```

---

## SupportFormsAPIResponse

**Kind:** `struct` | **Access:** `public`

**Conforms to:** `SendableMetatype`

### Declaration

```swift
struct SupportFormsAPIResponse
```

### Properties

| Name | Type | Description |
|------|------|-------------|
| `data` | `SupportFormsResponse` |  |
| `success` | `Bool?` |  |

### Initializers

#### `init(from:)`

```swift
init(from decoder: any Decoder) throws
```

---

## DesignSystem.ShadowStyle

**Kind:** `struct` | **Access:** `public`

### Declaration

```swift
struct ShadowStyle
```

### Description

Shadow style definition with color, radius, and offset.

### Properties

| Name | Type | Description |
|------|------|-------------|
| `color` | `Color` |  |
| `radius` | `CGFloat` |  |
| `x` | `CGFloat` |  |
| `y` | `CGFloat` |  |

### Initializers

#### `init(color:radius:x:y:)`

```swift
init(color: Color, radius: CGFloat, x: CGFloat, y: CGFloat)
```

**Parameters:**

- `color`: `Color`
- `radius`: `CGFloat`
- `x`: `CGFloat`
- `y`: `CGFloat`

---

## SupportFormSelectionView

**Kind:** `struct` | **Access:** `public`

### Declaration

```swift
@MainActor struct SupportFormSelectionView
```

### Properties

| Name | Type | Description |
|------|------|-------------|
| `body` | `some View` |  |

### Initializers

#### `init(supportService:userContextProvider:formId:embedded:onDismiss:)`

```swift
@MainActor init(supportService: SupportServiceProtocol, userContextProvider: @escaping () -> UserContext?, formId: String? = nil, embedded: Bool = false, onDismiss: @escaping () -> Void)
```

**Parameters:**

- `supportService`: `SupportServiceProtocol`
- `userContextProvider`: `UserContext`
- `formId`: `String`
- `embedded`: `Bool`
- `onDismiss`: `Void`

---

## RoadmapListView

**Kind:** `struct` | **Access:** `public`

### Declaration

```swift
@MainActor struct RoadmapListView
```

### Properties

| Name | Type | Description |
|------|------|-------------|
| `body` | `some View` |  |

### Initializers

#### `init(items:)`

```swift
@MainActor init(items: [RoadmapItem])
```

---

## Release

**Kind:** `struct` | **Access:** `public`

**Conforms to:** `SE`, `SendableMetatype`

### Declaration

```swift
struct Release
```

### Description

Represents a product release or version update.

### Examples

**Example**

```swift
let release = Release(
    id: "release123",
    title: "Version 2.0",
    content: "# What's New\n\nMajor update...",
    excerpt: "Major update with new features",
    slug: "version-2-0",
    version: "2.0.0",
    labels: [.feature, .improvement],
    coverImageUrl: "https://example.com/image.png",
    publishedAt: Date(),
    createdAt: Date(),
    updatedAt: Date(),
    features: [feature1, feature2]
)
```

### Properties

| Name | Type | Description |
|------|------|-------------|
| `content` | `String?` | The full content of the release notes (may contain markdown or HTML). |
| `coverImageUrl` | `String?` | The URL of the cover image for the release. |
| `createdAt` | `Date` | The date when the release was created. |
| `excerpt` | `String?` | An optional excerpt or summary of the release. |
| `features` | `[ReleaseFeature]?` | The list of features included in this release. |
| `id` | `String` | The unique identifier for the release. |
| `labels` | `[ReleaseLabel]` | The labels categorizing this release. |
| `publishedAt` | `Date?` | The date when the release was published. |
| `slug` | `String` | The URL-friendly slug identifier. |
| `title` | `String` | The title of the release. |
| `updatedAt` | `Date` | The date when the release was last updated. |
| `version` | `String?` | The version number of the release. |

### Initializers

#### `init(from:)`

```swift
init(from decoder: any Decoder) throws
```

### Methods

#### `hash(into:)`

```swift
func hash(into hasher: inout Hasher)
```

**Parameters:**

- `into`: `Hasher`

---

## FormCheckboxFieldView

**Kind:** `struct` | **Access:** `public`

### Declaration

```swift
@MainActor struct FormCheckboxFieldView
```

### Properties

| Name | Type | Description |
|------|------|-------------|
| `body` | `some View` |  |

### Initializers

#### `init(field:value:error:onValidate:)`

```swift
@MainActor init(field: FormField, value: Binding<String>, error: String?, onValidate: @escaping () -> Void)
```

**Parameters:**

- `field`: `FormField`
- `value`: `String`
- `error`: `String`
- `onValidate`: `Void`

---

## NotificationManager

**Kind:** `class` | **Access:** `public`

**Conforms to:** `SendableMetatype`

### Declaration

```swift
class NotificationManager
```

### Initializers

#### `init()`

```swift
init()
```

### Methods

#### `checkForNewReleases(_:)`

```swift
func checkForNewReleases(_ releases: [Release])
```

#### `checkForNewStatusUpdates(_:)`

```swift
func checkForNewStatusUpdates(_ updates: [StatusUpdate])
```

#### `checkForResolvedStatusUpdates(_:)`

```swift
func checkForResolvedStatusUpdates(_ updates: [StatusUpdate])
```

#### `subscribe(handler:)`

```swift
func subscribe(handler: @escaping NotificationHandler) -> UUID
```

**Returns:** `UUID`

#### `unsubscribe(token:)`

```swift
func unsubscribe(token: UUID)
```

**Parameters:**

- `token`: `UUID`

---

## FormSelectFieldView

**Kind:** `struct` | **Access:** `public`

### Declaration

```swift
@MainActor struct FormSelectFieldView
```

### Properties

| Name | Type | Description |
|------|------|-------------|
| `body` | `some View` |  |

### Initializers

#### `init(field:value:error:onValidate:)`

```swift
@MainActor init(field: FormField, value: Binding<String>, error: String?, onValidate: @escaping () -> Void)
```

**Parameters:**

- `field`: `FormField`
- `value`: `String`
- `error`: `String`
- `onValidate`: `Void`

---

## BlogCategory

**Kind:** `struct` | **Access:** `public`

**Conforms to:** `SE`, `SendableMetatype`

### Declaration

```swift
struct BlogCategory
```

### Description

Represents a blog category.

### Examples

**Example**

```swift
let category = BlogCategory(
    id: "cat123",
    name: "News",
    slug: "news",
    description: "Latest updates and announcements",
    color: "#3B82F6",
    postCount: 15
)
```

### Properties

| Name | Type | Description |
|------|------|-------------|
| `color` | `String?` | The color associated with this category (hex string). |
| `description` | `String?` | An optional description of the category. |
| `id` | `String` | The unique identifier for the category. |
| `name` | `String` | The display name of the category. |
| `postCount` | `Int?` | The number of posts in this category. |
| `slug` | `String` | The URL-friendly slug identifier. |

### Initializers

#### `init(from:)`

```swift
init(from decoder: any Decoder) throws
```

#### `init(id:name:slug:description:color:postCount:)`

```swift
init(id: String, name: String, slug: String, description: String?, color: String?, postCount: Int?)
```

**Parameters:**

- `id`: `String`
- `name`: `String`
- `slug`: `String`
- `description`: `String`
- `color`: `String`

---

## AnnouncementCardConfiguration

**Kind:** `struct` | **Access:** `public`

### Declaration

```swift
struct AnnouncementCardConfiguration
```

### Description

Configuration for announcement card appearance and behavior.

### Examples

**Example**

```swift
// Basic configuration
let cardConfig = AnnouncementCardConfiguration(
    backgroundColor: Color(white: 0.2),
    primaryButton: .primary(title: "Try it"),
    secondaryButton: .secondary(title: "Not now"),
    cornerRadius: 20,
    modalPadding: 20
)

// With custom page indicators
let customIndicatorConfig = AnnouncementCardConfiguration(
    pageIndicatorConfiguration: .styled(
        activeColor: .blue,
        inactiveColor: .gray,
        size: 10,
        spacing: 12
    )
)

// With custom indicator view
let customViewConfig = AnnouncementCardConfiguration(
    pageIndicatorConfiguration: .custom { currentPage, totalPages in
        AnyView(Text("\(currentPage + 1) / \(totalPages)")
            .foregroundColor(.white))
    }
)
```

### Properties

| Name | Type | Description |
|------|------|-------------|
| `backgroundColor` | `Color?` | Background color for the announcement card. |
| `cornerRadius` | `CGFloat` | Corner radius for the announcement card. |
| `descriptionColor` | `Color?` | Description text color. |
| `descriptionFontSize` | `CGFloat` | Description font size. |
| `modalPadding` | `CGFloat` | Padding around the card within the modal. |
| `pageIndicatorConfiguration` | `PageIndicatorConfiguration` | Configuration for page indicators when multiple announcements are shown. |
| `presentationStyle` | `PresentationStyle` | Presentation style for the announcement content. |
| `primaryButton` | `ButtonConfiguration?` | Primary button configuration (optional). |
| `secondaryButton` | `ButtonConfiguration?` | Secondary button configuration (optional). |
| `titleColor` | `Color?` | Title text color. |
| `titleFontSize` | `CGFloat` | Title font size. |
| `default` | `AnnouncementCardConfiguration` | Default configuration matching ChatGPT agent mode style. |
| `noButtons` | `AnnouncementCardConfiguration` | Configuration with no buttons. |
| `sheet` | `AnnouncementCardConfiguration` | Configuration for bottom-sheet style presentation (no card chrome). |

### Initializers

#### `init(backgroundColor:primaryButton:secondaryButton:titleColor:descriptionColor:titleFontSize:descriptionFontSize:cornerRadius:modalPadding:pageIndicatorConfiguration:presentationStyle:)`

```swift
init(backgroundColor: Color? = nil, primaryButton: ButtonConfiguration? = ButtonConfiguration(title: "Try it"), secondaryButton: ButtonConfiguration? = ButtonConfiguration(title: "Not now", style: .secondary, height: nil), titleColor: Color? = nil, descriptionColor: Color? = nil, titleFontSize: CGFloat = 30, descriptionFontSize: CGFloat = 16, cornerRadius: CGFloat = 24, modalPadding: CGFloat = 20, pageIndicatorConfiguration: PageIndicatorConfiguration = .default, presentationStyle: PresentationStyle = .card)
```

**Parameters:**

- `backgroundColor`: `Color`
- `primaryButton`: `ButtonConfiguration`
- `secondaryButton`: `ButtonConfiguration`
- `titleColor`: `Color`
- `descriptionColor`: `Color`
- `titleFontSize`: `CGFloat`
- `descriptionFontSize`: `CGFloat`
- `cornerRadius`: `CGFloat`
- `modalPadding`: `CGFloat`
- `pageIndicatorConfiguration`: `PageIndicatorConfiguration`

Creates an announcement card configuration.

---

## RateLimiter

**Kind:** `class` | **Access:** `public`

**Conforms to:** `SendableMetatype`, `NSSecureCoding`

### Declaration

```swift
actor RateLimiter
```

### Description

Rate limiter for contact form submissions Limits submissions to max 10 per hour per form

### Initializers

#### `init(maxSubmissions:timeWindow:storageKey:)`

```swift
init(maxSubmissions: Int = 10, timeWindow: TimeInterval = 3600, storageKey: String = "com.appgram.sdk.contactFormSubmissions")
```

**Parameters:**

- `maxSubmissions`: `Int`
- `timeWindow`: `TimeInterval`

### Methods

#### `canSubmit(formId:)`

```swift
func canSubmit(formId: String) -> Bool
```

**Returns:** `Bool`

Check if a submission is allowed for the given form ID

#### `clearRecords(formId:)`

```swift
func clearRecords(formId: String)
```

**Parameters:**

- `formId`: `String`

Clear all submission records for a form (useful for testing)

#### `recordSubmission(formId:)`

```swift
func recordSubmission(formId: String)
```

**Parameters:**

- `formId`: `String`

Record a submission for the given form ID

#### `remainingSubmissions(formId:)`

```swift
func remainingSubmissions(formId: String) -> Int
```

**Returns:** `Int`

Get the number of remaining submissions allowed for the given form ID

---

## PrimaryButton

**Kind:** `struct` | **Access:** `public`

### Declaration

```swift
@MainActor struct PrimaryButton
```

### Description

Primary action button with design system styling and animations.

### Examples

**Example**

```swift
PrimaryButton("Submit", isLoading: isSubmitting) {
    // Handle action
}
```

### Properties

| Name | Type | Description |
|------|------|-------------|
| `body` | `some View` |  |

### Initializers

#### `init(_:isLoading:action:)`

```swift
@MainActor init(_ title: String, isLoading: Bool = false, action: @escaping () -> Void)
```

**Parameters:**

- `_`: `String`
- `isLoading`: `Bool`
- `action`: `Void`

---

## HelpCollectionCard

**Kind:** `struct` | **Access:** `public`

### Declaration

```swift
@MainActor struct HelpCollectionCard
```

### Properties

| Name | Type | Description |
|------|------|-------------|
| `body` | `some View` |  |

### Initializers

#### `init(collection:)`

```swift
@MainActor init(collection: HelpCollection)
```

**Parameters:**

- `collection`: `HelpCollection`

---

## FeedbackCardView

**Kind:** `struct` | **Access:** `public`

### Declaration

```swift
@MainActor struct FeedbackCardView
```

### Description

Feedback card view with unified design system styling.

### Examples

**Example**

```swift
FeedbackCardView(
    wish: wish,
    onVote: { await viewModel.vote(wish.id) },
    onRemoveVote: { await viewModel.removeVote(wish.id) }
)
```

### Properties

| Name | Type | Description |
|------|------|-------------|
| `body` | `some View` |  |

### Initializers

#### `init(wish:onVote:onRemoveVote:)`

```swift
@MainActor init(wish: Wish, onVote: @escaping () async -> Void, onRemoveVote: @escaping () async -> Void)
```

**Parameters:**

- `wish`: `Wish`
- `onVote`: `Void`
- `onRemoveVote`: `Void`

---

## ReleasesListView

**Kind:** `struct` | **Access:** `public`

### Declaration

```swift
@MainActor struct ReleasesListView
```

### Properties

| Name | Type | Description |
|------|------|-------------|
| `body` | `some View` |  |

### Initializers

#### `init(orgSlug:projectSlug:apiBaseURL:apiKey:configuration:notificationManager:onDismiss:)`

```swift
@MainActor init(orgSlug: String, projectSlug: String, apiBaseURL: String, apiKey: String? = nil, configuration: ReleasesConfiguration = .default, notificationManager: NotificationManager? = nil, onDismiss: (() -> Void)? = nil)
```

**Parameters:**

- `orgSlug`: `String`
- `projectSlug`: `String`
- `apiBaseURL`: `String`
- `apiKey`: `String`
- `configuration`: `ReleasesConfiguration`
- `notificationManager`: `NotificationManager`

---

## RoadmapItemCard

**Kind:** `struct` | **Access:** `public`

### Declaration

```swift
@MainActor struct RoadmapItemCard
```

### Properties

| Name | Type | Description |
|------|------|-------------|
| `body` | `some View` |  |

### Initializers

#### `init(item:compact:)`

```swift
@MainActor init(item: RoadmapItem, compact: Bool = false)
```

**Parameters:**

- `item`: `RoadmapItem`

---

## BlogListView

**Kind:** `struct` | **Access:** `public`

### Declaration

```swift
@MainActor struct BlogListView
```

### Description

A view displaying a list of blog posts with pagination and filtering.

### Properties

| Name | Type | Description |
|------|------|-------------|
| `body` | `some View` |  |

### Initializers

#### `init(blogService:onPostTap:)`

```swift
@MainActor init(blogService: BlogServiceProtocol, onPostTap: ((BlogPost) -> Void)? = nil)
```

**Parameters:**

- `blogService`: `BlogServiceProtocol`

---

## InputSanitizer

**Kind:** `struct` | **Access:** `public`

### Declaration

```swift
struct InputSanitizer
```

### Description

Utility for sanitizing form input data

### Initializers

#### `init()`

```swift
init()
```

### Methods

#### `sanitize(_:)`

```swift
func sanitize(_ data: [String : String]) -> [String : String]
```

**Returns:** `String`

Sanitize a dictionary of form data

#### `sanitize(_:)`

```swift
func sanitize(_ value: String) -> String
```

**Returns:** `String`

Sanitize a string value by trimming whitespace and removing potentially dangerous characters

---

## DesignSystem.Shadow

**Kind:** `struct` | **Access:** `public`

### Declaration

```swift
struct Shadow
```

### Description

Shadow constants for subtle elevation effects.

### Examples

**Example**

```swift
CardView()
    .shadowStyle(DesignSystem.Shadow.sm)
```

### Properties

| Name | Type | Description |
|------|------|-------------|
| `lg` | `DesignSystem ShadowStyle` | Large shadow - Prominent elements (radius: 12, y: 6, opacity: 0.10) |
| `md` | `DesignSystem ShadowStyle` | Medium shadow - Standard cards (radius: 8, y: 4, opacity: 0.08) |
| `none` | `DesignSystem ShadowStyle` | No shadow |
| `sm` | `DesignSystem ShadowStyle` | Small shadow - Subtle elevation (radius: 4, y: 2, opacity: 0.06) |
| `xl` | `DesignSystem ShadowStyle` | Extra large shadow - Floating elements (radius: 16, y: 8, opacity: 0.12) |
| `xs` | `DesignSystem ShadowStyle` | Extra small shadow - Minimal elevation (radius: 2, y: 1, opacity: 0.04) |

---

## DesignSystem.Spacing

**Kind:** `struct` | **Access:** `public`

### Declaration

```swift
struct Spacing
```

### Description

Spacing constants following a consistent scale (4px base).

### Examples

**Example**

```swift
VStack(spacing: DesignSystem.Spacing.lg) {
    Text("Title")
        .padding(.horizontal, DesignSystem.Spacing.xl)
}
```

### Properties

| Name | Type | Description |
|------|------|-------------|
| `lg` | `CGFloat` | Large spacing (16pt) - Default padding, most common |
| `md` | `CGFloat` | Medium spacing (12pt) - Medium spacing, text gaps |
| `sm` | `CGFloat` | Small spacing (8pt) - Small spacing, icon gaps |
| `xl` | `CGFloat` | Extra large spacing (24pt) - Section spacing |
| `xs` | `CGFloat` | Extra small spacing (4pt) - Tiny gaps, badge padding |
| `xxl` | `CGFloat` | Extra extra large spacing (32pt) - Large sections |
| `xxxl` | `CGFloat` | Extra extra extra large spacing (48pt) - Major sections |

---

## ColorPalette

**Kind:** `struct` | **Access:** `public`

**Conforms to:** `SendableMetatype`

### Declaration

```swift
struct ColorPalette
```

### Description

Represents a color palette for AppGram SDK views.

### Examples

**Example**

```swift
let palette = ColorPalette(
    primary: .blue,
    secondary: .gray,
    accent: .purple,
    background: .white,
    text: .black,
    cardBackground: .white,
    cardText: .black,
    border: .gray.opacity(0.2)
)
```

### Properties

| Name | Type | Description |
|------|------|-------------|
| `accent` | `Color` | The accent color for highlights. |
| `background` | `Color` | The main background color. |
| `border` | `Color` | The border color. |
| `cardBackground` | `Color` | The background color for cards. |
| `cardText` | `Color` | The text color for cards. |
| `error` | `Color` | The color for error states. |
| `neutral100` | `Color` | Light neutral background (100) |
| `neutral200` | `Color` | Subtle border color (200) - Most commonly used for borders |
| `neutral300` | `Color` | Medium border color (300) |
| `neutral400` | `Color` | Muted text color (400) |
| `neutral50` | `Color` | Lightest neutral background (50) |
| `neutral500` | `Color` | Secondary text color (500) |
| `neutral600` | `Color` | Primary text color (600) |
| `neutral700` | `Color` | Emphasized text color (700) |
| `neutral800` | `Color` | Dark background (800) |
| `neutral900` | `Color` | Darkest background (900) |
| `primary` | `Color` | The primary brand color. |
| `secondary` | `Color` | The secondary brand color. |
| `success` | `Color` | The color for success states. |
| `text` | `Color` | The primary text color. |
| `warning` | `Color` | The color for warning states. |
| `classic` | `ColorPalette` |  |
| `forest` | `ColorPalette` |  |
| `minimal` | `ColorPalette` |  |
| `modern` | `ColorPalette` |  |
| `modernDark` | `ColorPalette` |  |
| `neutral` | `ColorPalette` | Neutral preset - pure minimal design with neutral gray scale |
| `ocean` | `ColorPalette` |  |
| `slate` | `ColorPalette` | Slate preset - shadcn minimal aesthetic with slate gray tones |
| `sunset` | `ColorPalette` |  |

### Initializers

#### `init(primary:secondary:accent:background:text:cardBackground:cardText:border:success:warning:error:neutral50:neutral100:neutral200:neutral300:neutral400:neutral500:neutral600:neutral700:neutral800:neutral900:)`

```swift
init(primary: Color, secondary: Color, accent: Color, background: Color, text: Color, cardBackground: Color, cardText: Color, border: Color, success: Color = Color(hex: "#10b981"), warning: Color = Color(hex: "#f59e0b"), error: Color = Color(hex: "#ef4444"), neutral50: Color = Color(hex: "#fafafa"), neutral100: Color = Color(hex: "#f5f5f5"), neutral200: Color = Color(hex: "#e5e5e5"), neutral300: Color = Color(hex: "#d4d4d4"), neutral400: Color = Color(hex: "#a3a3a3"), neutral500: Color = Color(hex: "#737373"), neutral600: Color = Color(hex: "#525252"), neutral700: Color = Color(hex: "#404040"), neutral800: Color = Color(hex: "#262626"), neutral900: Color = Color(hex: "#171717"))
```

**Parameters:**

- `primary`: `Color`
- `secondary`: `Color`
- `accent`: `Color`
- `background`: `Color`
- `text`: `Color`
- `cardBackground`: `Color`
- `cardText`: `Color`
- `border`: `Color`
- `success`: `Color`
- `warning`: `Color`
- `error`: `Color`
- `neutral50`: `Color`
- `neutral100`: `Color`
- `neutral200`: `Color`
- `neutral300`: `Color`
- `neutral400`: `Color`
- `neutral500`: `Color`
- `neutral600`: `Color`
- `neutral700`: `Color`
- `neutral800`: `Color`

---

## AnnouncementViewModel

**Kind:** `class` | **Access:** `public`

### Declaration

```swift
@MainActor final class AnnouncementViewModel
```

### Description

View model for managing announcements display and tracking.

### Properties

| Name | Type | Description |
|------|------|-------------|
| `announcements` | `[Announcement` |  |
| `error` | `AppGramError` |  |
| `isLoading` | `Bool` |  |
| `shouldShowAnnouncements` | `Bool` |  |

### Initializers

#### `init(releasesService:orgSlug:projectSlug:maxAnnouncementsToShow:userDefaults:)`

```swift
@MainActor init(releasesService: ReleasesServiceProtocol, orgSlug: String, projectSlug: String, maxAnnouncementsToShow: Int = 3, userDefaults: UserDefaults = .standard)
```

**Parameters:**

- `releasesService`: `ReleasesServiceProtocol`
- `orgSlug`: `String`
- `projectSlug`: `String`
- `maxAnnouncementsToShow`: `Int`

Initializes the announcement view model.

### Methods

#### `clearSeenHistory()`

```swift
@MainActor func clearSeenHistory()
```

Clears all seen announcement history.

#### `fetchAnnouncements(includeSeen:)` `async`

```swift
@MainActor func fetchAnnouncements(includeSeen: Bool = false) async
```

Fetches new announcements from releases.

#### `markAnnouncementsSeen(_:)`

```swift
@MainActor func markAnnouncementsSeen(_ announcementIds: [String])
```

Marks feature announcements as seen.

#### `markCurrentAnnouncementsSeen()`

```swift
@MainActor func markCurrentAnnouncementsSeen()
```

Marks all current feature announcements as seen.

#### `shouldShowAnnouncementsAutomatically(minimumHoursSinceLastCheck:)`

```swift
@MainActor func shouldShowAnnouncementsAutomatically(minimumHoursSinceLastCheck: Int = 24) -> Bool
```

**Returns:** `Bool`

Checks if announcements should be shown automatically.

---

## HelpCenterView

**Kind:** `struct` | **Access:** `public`

### Declaration

```swift
@MainActor struct HelpCenterView
```

### Properties

| Name | Type | Description |
|------|------|-------------|
| `body` | `some View` |  |

### Initializers

#### `init(helpService:configuration:)`

```swift
@MainActor init(helpService: HelpServiceProtocol, configuration: HelpCenterConfiguration = .default)
```

**Parameters:**

- `helpService`: `HelpServiceProtocol`

---

## StatusUpdate

**Kind:** `struct` | **Access:** `public`

**Conforms to:** `SE`, `SendableMetatype`

### Declaration

```swift
struct StatusUpdate
```

### Description

Represents a status update or incident notification.

### Examples

**Example**

```swift
let update = StatusUpdate(
    id: "update123",
    title: "Scheduled Maintenance",
    description: "Maintenance window from 2-4 AM",
    statusType: .maintenance,
    state: .active,
    affectedServices: ["service1", "service2"],
    startedAt: Date(),
    resolvedAt: nil,
    createdAt: Date(),
    updatedAt: Date()
)
```

### Properties

| Name | Type | Description |
|------|------|-------------|
| `affectedServices` | `[String]?` | The list of service IDs affected by this update. |
| `createdAt` | `Date` | The date when the status update was created. |
| `description` | `String?` | A detailed description of the update or incident. |
| `id` | `String` | The unique identifier for the status update. |
| `resolvedAt` | `Date?` | The date when the incident or maintenance was resolved. |
| `startedAt` | `Date?` | The date when the incident or maintenance started. |
| `state` | `State` | Whether the update is currently active or has been resolved. |
| `statusType` | `StatusType` | The type of status (operational, maintenance, outage, etc.). |
| `title` | `String` | The title of the status update. |
| `updatedAt` | `Date` | The date when the status update was last updated. |

### Initializers

#### `init(from:)`

```swift
init(from decoder: any Decoder) throws
```

---

## SupportFormsResponse

**Kind:** `struct` | **Access:** `public`

**Conforms to:** `SendableMetatype`

### Declaration

```swift
struct SupportFormsResponse
```

### Properties

| Name | Type | Description |
|------|------|-------------|
| `supportForms` | `[String:SupportForm]` |  |

### Initializers

#### `init(from:)`

```swift
init(from decoder: any Decoder) throws
```

---

## Category

**Kind:** `struct` | **Access:** `public`

**Conforms to:** `SE`, `SendableMetatype`

### Declaration

```swift
struct Category
```

### Description

Represents a category for organizing feedback items.

### Examples

**Example**

```swift
let category = Category(
    id: "cat123",
    name: "Feature Requests",
    slug: "feature-requests",
    description: "Suggestions for new features",
    color: "#3B82F6"
)
```

### Properties

| Name | Type | Description |
|------|------|-------------|
| `color` | `String?` | An optional color code (hex format) for the category. |
| `createdAt` | `Date?` | The date when the category was created. |
| `description` | `String?` | An optional description of the category. |
| `id` | `String` | The unique identifier for the category. |
| `name` | `String` | The display name of the category. |
| `projectId` | `String?` | The project ID this category belongs to. |
| `slug` | `String` | The URL-friendly identifier for the category. |
| `updatedAt` | `Date?` | The date when the category was last updated. |

### Initializers

#### `init(from:)`

```swift
init(from decoder: any Decoder) throws
```

#### `init(id:name:slug:description:color:projectId:createdAt:updatedAt:)`

```swift
init(id: String, name: String, slug: String, description: String? = nil, color: String? = nil, projectId: String? = nil, createdAt: Date? = nil, updatedAt: Date? = nil)
```

**Parameters:**

- `id`: `String`
- `name`: `String`
- `slug`: `String`
- `description`: `String`
- `color`: `String`
- `projectId`: `String`
- `createdAt`: `Date`

---

## ContactFormView

**Kind:** `struct` | **Access:** `public`

### Declaration

```swift
@MainActor struct ContactFormView
```

### Properties

| Name | Type | Description |
|------|------|-------------|
| `body` | `some View` |  |

### Initializers

#### `init(formId:contactFormService:projectId:userContextProvider:useStandaloneEndpoint:)`

```swift
@MainActor init(formId: String, contactFormService: ContactFormServiceProtocol, projectId: String, userContextProvider: @escaping () -> UserContext?, useStandaloneEndpoint: Bool = false)
```

**Parameters:**

- `formId`: `String`
- `contactFormService`: `ContactFormServiceProtocol`
- `projectId`: `String`
- `userContextProvider`: `UserContext`

---

## RatingQuestionView

**Kind:** `struct` | **Access:** `public`

### Declaration

```swift
@MainActor struct RatingQuestionView
```

### Properties

| Name | Type | Description |
|------|------|-------------|
| `body` | `some View` |  |

### Initializers

#### `init(minRating:maxRating:rating:style:)`

```swift
@MainActor init(minRating: Int, maxRating: Int, rating: Binding<Int?>, style: SurveyStyle = .normal)
```

**Parameters:**

- `minRating`: `Int`
- `maxRating`: `Int`
- `rating`: `Int`

---

## SupportTicketDetailView

**Kind:** `struct` | **Access:** `public`

### Declaration

```swift
@MainActor struct SupportTicketDetailView
```

### Properties

| Name | Type | Description |
|------|------|-------------|
| `body` | `some View` |  |

### Initializers

#### `init(ticket:supportService:)`

```swift
@MainActor init(ticket: SupportTicket, supportService: SupportServiceProtocol)
```

**Parameters:**

- `ticket`: `SupportTicket`
- `supportService`: `SupportServiceProtocol`

---

## PublicHelpCollection

**Kind:** `struct` | **Access:** `public`

**Conforms to:** `SE`, `SendableMetatype`

### Declaration

```swift
struct PublicHelpCollection
```

### Description

A public help collection as returned by the API.

### Properties

| Name | Type | Description |
|------|------|-------------|
| `createdAt` | `Date?` | The date when the collection was created. |
| `description` | `String?` | An optional description of the collection. |
| `flows` | `[HelpFlow]` | The help flows in this collection. |
| `id` | `String` | The unique identifier for the collection. |
| `isLive` | `Bool` | Whether the collection is live and visible. |
| `name` | `String` | The display name of the collection. |
| `projectId` | `String` | The project ID this collection belongs to. |
| `updatedAt` | `Date?` | The date when the collection was last updated. |
| `version` | `String?` | An optional version identifier. |

### Initializers

#### `init(from:)`

```swift
init(from decoder: any Decoder) throws
```

---

## DeviceFingerprint

**Kind:** `class` | **Access:** `public`

**Conforms to:** `SendableMetatype`, `NSSecureCoding`

### Declaration

```swift
actor DeviceFingerprint
```

### Properties

| Name | Type | Description |
|------|------|-------------|
| `shared` | `DeviceFingerprint` |  |

### Methods

#### `generate()` `async`

```swift
func generate() async -> String
```

**Returns:** `String`

#### `reset()`

```swift
func reset()
```

---

## HTMLContentView

**Kind:** `struct` | **Access:** `public`

### Declaration

```swift
@MainActor struct HTMLContentView
```

### Description

A SwiftUI view that renders HTML content with proper theming

### Properties

| Name | Type | Description |
|------|------|-------------|
| `body` | `some View` |  |

### Initializers

#### `init(htmlContent:textColor:backgroundColor:)`

```swift
@MainActor init(htmlContent: String, textColor: Color? = nil, backgroundColor: Color? = nil)
```

**Parameters:**

- `htmlContent`: `String`
- `textColor`: `Color`

---

## AppGramTheme

**Kind:** `struct` | **Access:** `public`

**Conforms to:** `SendableMetatype`

### Declaration

```swift
struct AppGramTheme
```

### Description

Represents a theme configuration for AppGram SDK views.

### Examples

**Example**

```swift
let theme = AppGramTheme(
    colors: .modern,
    darkColors: .modernDark
)
AppGramSDK.shared.configure(projectId: "project123", theme: theme)
```

### Properties

| Name | Type | Description |
|------|------|-------------|
| `colors` | `ColorPalette` | The color palette for light mode. |
| `darkColors` | `ColorPalette?` | The optional color palette for dark mode. |
| `classic` | `AppGramTheme` |  |
| `default` | `AppGramTheme` |  |
| `forest` | `AppGramTheme` |  |
| `minimal` | `AppGramTheme` |  |
| `neutral` | `AppGramTheme` |  |
| `ocean` | `AppGramTheme` |  |
| `slate` | `AppGramTheme` |  |
| `sunset` | `AppGramTheme` |  |

### Initializers

#### `init(colors:darkColors:)`

```swift
init(colors: ColorPalette, darkColors: ColorPalette? = nil)
```

**Parameters:**

- `colors`: `ColorPalette`

### Methods

#### `resolvedColors(for:)`

```swift
func resolvedColors(for colorScheme: ColorScheme) -> ColorPalette
```

**Returns:** `ColorPalette`

---

## BlogPostCard

**Kind:** `struct` | **Access:** `public`

### Declaration

```swift
@MainActor struct BlogPostCard
```

### Description

A card view displaying a blog post preview.

### Properties

| Name | Type | Description |
|------|------|-------------|
| `body` | `some View` |  |

### Initializers

#### `init(post:onTap:)`

```swift
@MainActor init(post: BlogPost, onTap: (() -> Void)? = nil)
```

**Parameters:**

- `post`: `BlogPost`

---

## YesNoQuestionView

**Kind:** `struct` | **Access:** `public`

### Declaration

```swift
@MainActor struct YesNoQuestionView
```

### Properties

| Name | Type | Description |
|------|------|-------------|
| `body` | `some View` |  |

### Initializers

#### `init(style:onAnswer:)`

```swift
@MainActor init(style: SurveyStyle = .normal, onAnswer: @escaping (Bool) -> Void)
```

**Parameters:**

- `style`: `SurveyStyle`
- `onAnswer`: `Void`

---

## PageIndicatorConfiguration

**Kind:** `struct` | **Access:** `public`

### Declaration

```swift
struct PageIndicatorConfiguration
```

### Description

Configuration for page indicator appearance and behavior.

### Examples

**Example**

```swift
// Default styled indicators
let indicatorConfig = PageIndicatorConfiguration(
    activeColor: .blue,
    inactiveColor: .gray,
    size: 10
)

// Custom indicator view
let customConfig = PageIndicatorConfiguration(
    customView: { currentPage, totalPages in
        AnyView(Text("\(currentPage + 1) / \(totalPages)")
            .foregroundColor(.white))
    }
)
```

### Properties

| Name | Type | Description |
|------|------|-------------|
| `activeColor` | `Color?` | Active indicator color (for current page). |
| `bottomPadding` | `CGFloat?` | Padding at the bottom of indicators. |
| `customView` | `((Int,Int) ->AnyView)?` | Custom indicator view builder. Parameters: (currentPage: Int, totalPages: Int) -> AnyView |
| `inactiveColor` | `Color?` | Inactive indicator color (for other pages). |
| `isVisible` | `Bool` | Whether to show indicators at all. |
| `size` | `CGFloat?` | Size of each indicator dot. |
| `spacing` | `CGFloat?` | Spacing between indicator dots. |
| `default` | `PageIndicatorConfiguration` | Default configuration with white indicators. |
| `hidden` | `PageIndicatorConfiguration` | Configuration that hides indicators. |

### Initializers

#### `init(activeColor:inactiveColor:size:spacing:bottomPadding:customView:isVisible:)`

```swift
init(activeColor: Color? = .white, inactiveColor: Color? = Color.white.opacity(0.3), size: CGFloat? = 8, spacing: CGFloat? = 8, bottomPadding: CGFloat? = 20, customView: ((Int, Int) -> AnyView)? = nil, isVisible: Bool = true)
```

**Parameters:**

- `activeColor`: `Color`
- `inactiveColor`: `Color`
- `size`: `CGFloat`
- `spacing`: `CGFloat`
- `bottomPadding`: `CGFloat`
- `customView`: `AnyView`

Creates a page indicator configuration.

### Methods

#### `custom(_:)` `static`

```swift
static func custom(_ viewBuilder: @escaping (Int, Int) -> AnyView) -> PageIndicatorConfiguration
```

**Returns:** `AnyView`

Creates a configuration with a custom view.

#### `styled(activeColor:inactiveColor:size:spacing:)` `static`

```swift
static func styled(activeColor: Color = .white, inactiveColor: Color = Color.white.opacity(0.3), size: CGFloat = 8, spacing: CGFloat = 8) -> PageIndicatorConfiguration
```

**Parameters:**

- `activeColor`: `Color`
- `inactiveColor`: `Color`
- `size`: `CGFloat`

**Returns:** `PageIndicatorConfiguration`

Creates a configuration with custom colors.

---

## FormRadioFieldView

**Kind:** `struct` | **Access:** `public`

### Declaration

```swift
@MainActor struct FormRadioFieldView
```

### Properties

| Name | Type | Description |
|------|------|-------------|
| `body` | `some View` |  |

### Initializers

#### `init(field:value:error:onValidate:)`

```swift
@MainActor init(field: FormField, value: Binding<String>, error: String?, onValidate: @escaping () -> Void)
```

**Parameters:**

- `field`: `FormField`
- `value`: `String`
- `error`: `String`
- `onValidate`: `Void`

---

## MarkdownView

**Kind:** `struct` | **Access:** `public`

### Declaration

```swift
@MainActor struct MarkdownView
```

### Properties

| Name | Type | Description |
|------|------|-------------|
| `body` | `some View` |  |

### Initializers

#### `init(_:)`

```swift
@MainActor init(_ content: String)
```

**Parameters:**

- `_`: `String`

---

## FeedbackListView

**Kind:** `struct` | **Access:** `public`

### Declaration

```swift
@MainActor struct FeedbackListView
```

### Properties

| Name | Type | Description |
|------|------|-------------|
| `body` | `some View` |  |

### Initializers

#### `init(feedbackService:strings:)`

```swift
@MainActor init(feedbackService: FeedbackServiceProtocol, strings: FeedbackStrings = .default)
```

**Parameters:**

- `feedbackService`: `FeedbackServiceProtocol`

---


*This documentation was auto-generated from the SDK source.*
