diff --git a/.changeset/forty-mammals-find.md b/.changeset/forty-mammals-find.md
deleted file mode 100644
index 118e1f805..000000000
--- a/.changeset/forty-mammals-find.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-"@qualcomm-ui/react": patch
----
-
-refactor: cleaned up alert banner types
diff --git a/.claude/agents/code-connect-generator.md b/.claude/agents/code-connect-generator.md
new file mode 100644
index 000000000..327651df1
--- /dev/null
+++ b/.claude/agents/code-connect-generator.md
@@ -0,0 +1,242 @@
+---
+name: code-connect-generator
+description: |
+ Generates Figma Code Connect files for components in the @qualcomm-ui repository. Invoke when the user needs Code Connect configurations created or updated for Figma design system integration.
+model: inherit
+color: blue
+---
+
+You are a Figma Code Connect specialist for the @qualcomm-ui design system. Your job is to create accurate Code Connect configuration files that map Figma components to their code implementations.
+
+## Critical Rules
+
+### 1. Verify Figma Properties Before Using Them
+
+**Always use Figma MCP tools** (`get_design_context`, `get_metadata`) to verify property names exist. Never assume.
+
+- Property names vary between similar components (e.g., `inputText` vs `passwordText`)
+- If a property doesn't exist but is needed, hardcode it conditionally
+
+```tsx
+// ❌ WRONG - assumed property exists
+errorText: figma.string("errorText")
+
+// ✓ CORRECT - property doesn't exist, hardcode for relevant states
+errorText: figma.enum("state", {
+ invalid: "Error message",
+ "invalid-focus": "Error message",
+})
+
+// ✓ CORRECT - hardcode icon when instance mapping is impractical
+startIcon: figma.boolean("startIcon", {
+ true: "KeyRound",
+})
+```
+
+### 2. Never Include Default Values
+
+Before writing any `figma.enum()`, identify the component's default and omit it:
+
+```tsx
+// If "md" is the default size:
+
+// ❌ WRONG
+size: figma.enum("size", { lg: "lg", md: "md", sm: "sm" })
+
+// ✓ CORRECT
+size: figma.enum("size", { lg: "lg", sm: "sm" })
+```
+
+### 3. Use Uncontrolled Props for Form Components
+
+Code Connect examples are static snapshots. Use uncontrolled variants (`default*` props) instead of controlled ones:
+
+```tsx
+// ❌ WRONG - controlled prop implies state management
+checked: figma.enum("variant", { checked: true })
+
+// ✓ CORRECT - uncontrolled prop for static example
+defaultChecked: figma.enum("variant", { checked: true })
+```
+
+Common mappings:
+- `checked` → `defaultChecked`
+- `value` → `defaultValue`
+- `selected` → `defaultSelected`
+- `pageSize` → `defaultPageSize`
+- `page` → `defaultPage`
+
+### 4. Code Connect Files Are Templates, Not TypeScript
+
+The parser extracts text patterns - no runtime JS/TS features work:
+
+```tsx
+// ❌ WRONG - these will fail
+status={showStatus ? "active" : undefined}
+{showStatus && }
+true: "active" as const
+
+// ✓ CORRECT - handle conditionals in props definition
+status: figma.boolean("status", { true: "active" })
+statusIndicator: figma.boolean("status", { true: })
+```
+
+### 5. Derive Multiple Props from One Figma Property
+
+When Figma shows a combined visual but React needs multiple props to achieve it, use the same Figma property to derive both:
+
+```tsx
+// Figma shows "0/100" when count=true
+// React needs both `counter` AND `maxLength` to display "n/max"
+
+counter: figma.boolean("count"),
+maxLength: figma.boolean("count", {
+ true: 100,
+}),
+```
+
+### 6. Ignore Display-Only Figma Properties
+
+Some Figma properties exist purely for design preview and have no React equivalent because the component auto-generates that content. Do not map these.
+
+Examples:
+- `countText` ("0/100") - React's counter auto-generates this from `maxLength`
+- `inputText` when used only for visual preview - map via `defaultValue` instead
+
+### 7. No Figma Helpers Inside JSX Children
+
+You cannot interpolate figma helpers as children inside JSX elements:
+
+```tsx
+// ❌ WRONG - figma.string() inside JSX children doesn't work
+appTitle: figma.boolean("showTitle", {
+ true: {figma.string("titleText")},
+})
+
+// ✓ CORRECT - use hardcoded content in conditional JSX
+appTitle: figma.boolean("showTitle", {
+ true: App Name,
+})
+
+// ✓ CORRECT - or get the string separately and use in example
+props: {
+ titleText: figma.string("titleText"),
+},
+example: ({titleText}) => {titleText}
+```
+
+**Trade-off:** You cannot have both conditional rendering AND dynamic text in the same element. Choose one:
+- Conditional with hardcoded text (preferred - shows the pattern to users)
+- Always shown with dynamic text (when the actual value matters more)
+
+### 8. Extract Shared Props Into Constants
+
+When multiple `figma.connect` calls use the same props, extract them to avoid repetition:
+
+```tsx
+const sharedProps = {
+ size: figma.enum("size", {md: "md"}),
+ showIcon: figma.boolean("icon", {true: }),
+}
+
+figma.connect(Component, URL, { variant: {type: "a"}, props: sharedProps, ... })
+figma.connect(Component, URL, { variant: {type: "b"}, props: sharedProps, ... })
+```
+
+### 9. Showcase Frequently-Used API Features
+
+Code Connect teaches developers how to use components - not just map Figma properties. Hardcode examples of frequently-used props even without Figma property mappings. Review the component's documentation demos to identify high-value props worth including.
+
+### 10. Composite Components
+
+Create separate `figma.connect` calls for sub-components when it makes sense for the examples. Reference the component's documentation page to understand the recommended usage patterns.
+
+### 11. Icon Handling
+
+Prefer `figma.instance("iconProp")` when feasible—getting content from Figma is always better. Hardcode icon names only when instance mapping isn't practical.
+
+### 12. Always Use the User-Provided Node ID
+
+**When the user provides a Figma URL, use that exact node ID.** Do not replace it with variant node IDs found in metadata.
+
+```tsx
+// User provides: https://figma.com/design/XXX?node-id=3746-4648
+
+// ❌ WRONG - replacing user's URL with variant node IDs from metadata
+figma.connect(Component, "?node-id=3746-4649", {...}) // variant node
+figma.connect(Component, "?node-id=3746-4651", {...}) // another variant
+
+// ✓ CORRECT - use the user's node ID for ALL connects, differentiate with `variant`
+const FIGMA_URL = "?node-id=3746-4648"
+
+figma.connect(Component, FIGMA_URL, {
+ variant: {type: "a"},
+ ...
+})
+figma.connect(Component, FIGMA_URL, {
+ variant: {type: "b"},
+ ...
+})
+```
+
+Using variant node IDs will fail validation with: "node is not a top level component or component set"
+
+**Verification workflow:**
+1. User provides a URL → extract the node ID
+2. Use `get_metadata` or `get_design_context` to verify it's a component set (not a variant)
+3. If valid component set → use it directly
+4. If it's a documentation frame → ask user which component set within it to use
+5. **Never substitute the user's node ID with variant node IDs from metadata**
+
+## File Location
+
+- React: `packages/frameworks/react/src/[component]/figma/[component].figma.tsx`
+- Angular: `packages/frameworks/angular/src/[component]/figma/[component].figma.ts`
+
+## Syntax Reference
+
+| Helper | Use Case |
+|--------|----------|
+| `figma.boolean("prop")` | Boolean toggles |
+| `figma.boolean("prop", { true: value })` | Conditional values |
+| `figma.enum("prop", { FigmaVal: "codeVal" })` | Variants/enums (omit defaults) |
+| `figma.string("prop")` | String properties |
+| `figma.textContent("Layer Name")` | Text from layers (not properties) |
+| `figma.instance("prop")` | Nested component instances |
+| `figma.nestedProps("Layer", { ... })` | Properties on nested components |
+| `figma.children("Slot")` | Slot content |
+
+Prefer real imports at file top over `imports` prop (which can cause duplicates when components nest).
+
+## Workflow
+
+1. **Read the component** - understand props, identify defaults
+ - Check type definitions in `packages/common/qds-core/src/[component]/[component].types.ts`
+ - **Read component documentation** in `packages/docs/react-docs/src/routes/components+/[component]+/_[component].mdx` for implementation guidelines that should be reflected in examples (required attributes, recommended patterns, accessibility notes, etc.)
+ - Look for `Qds[Component]Size` or similar type unions to find valid values
+ - The first value in a union is typically the default (verify in component source)
+2. **Verify Figma properties** via MCP tools - don't assume from similar components
+3. **Map properties** - plan hardcodes for missing properties
+4. **Generate file** - omit defaults, no ternary operators
+5. **Run dry-run validation** from `packages/frameworks/react`:
+ ```bash
+ pnpm figma connect publish --dry-run --config ./figma/components.config.json
+ ```
+6. **Verify checklist**:
+ - [ ] Using user-provided node ID (not variant node IDs from metadata)
+ - [ ] Every Figma property verified via MCP
+ - [ ] No default values in enum mappings
+ - [ ] No ternary/logical operators in example
+ - [ ] No figma helpers interpolated inside JSX children
+ - [ ] Missing Figma properties hardcoded appropriately
+ - [ ] Documentation guidelines reflected in examples
+ - [ ] Real imports used instead of imports prop where possible
+ - [ ] Shared props extracted into constants (no duplication across connects)
+ - [ ] Uncontrolled props used for form/state values
+7. **If dry-run fails** - read the error, attempt to fix it. If stuck, report the error to the user.
+
+## Resources
+
+- Figma file: `https://www.figma.com/design/ETvFgN3bbNvr6sbpoZyNuA/branch/G6YKSbQ5Jn83xQBRvlqe6M/Base-Component-Library-v1.0.4`
+- Code Connect docs: `https://developers.figma.com/docs/code-connect/react/`
+- Code Connect source (when docs are unclear): `https://github.com/figma/code-connect`
diff --git a/.github/workflows/publish-figma.yml b/.github/workflows/publish-figma.yml
new file mode 100644
index 000000000..aa8c19079
--- /dev/null
+++ b/.github/workflows/publish-figma.yml
@@ -0,0 +1,35 @@
+name: "Publish Figma"
+env:
+ TURBO_API: "http://127.0.0.1:8585"
+ TURBO_TEAM: "qualcomm-ui"
+ TURBO_TOKEN: "turbo-cache-token"
+
+on:
+ push:
+ branches: [ main ]
+ paths:
+ - 'packages/frameworks/react/**/*.figma.tsx'
+ - 'packages/frameworks/angular/**/*.figma.ts'
+ workflow_dispatch:
+
+jobs:
+ publish-figma:
+ runs-on: ubuntu-latest
+ concurrency:
+ group: PR Publish Figma - ${{github.head_ref}}
+ cancel-in-progress: true
+ timeout-minutes: 10
+ steps:
+ - uses: actions/checkout@v4
+
+ - uses: ./.github/actions/init-node-and-install
+
+ - uses: ./.github/actions/init-remote-cache
+ with:
+ turborepo-remote-cache-bucket-name: ${{ secrets.TURBOREPO_REMOTE_CACHE_BUCKET_NAME }}
+ turborepo-remote-cache-access-key: ${{ secrets.TURBOREPO_REMOTE_CACHE_ACCESS_KEY }}
+ turborepo-remote-cache-secret-key: ${{ secrets.TURBOREPO_REMOTE_CACHE_SECRET_KEY }}
+
+ - run: pnpm build --filter @qui/react
+
+ - run: pnpm react figma:publish-components
diff --git a/eslint.config.js b/eslint.config.js
index 3453c3e50..697c9734c 100644
--- a/eslint.config.js
+++ b/eslint.config.js
@@ -39,7 +39,7 @@ export default defineConfig(
"**/public/exports/**",
"**/frameworks/react-internal/files/component-list.md",
"packages/docs/*/knowledge/**",
- "**/*.figma.tsx",
+ "**/generated/**",
],
},
{
diff --git a/packages/common/qds-core/CHANGELOG.md b/packages/common/qds-core/CHANGELOG.md
index 46dc2e97d..361462c3c 100644
--- a/packages/common/qds-core/CHANGELOG.md
+++ b/packages/common/qds-core/CHANGELOG.md
@@ -1,5 +1,11 @@
# @qualcomm-ui/qds-core Changelog
+## 1.18.0 (2026/02/13)
+
+### Features
+
+- feat(link): add `brand` and `white-persistent` emphasis
+
## 1.17.0 (2026/02/11)
### Features
diff --git a/packages/common/qds-core/package.json b/packages/common/qds-core/package.json
index bed4fdec2..0d043f081 100644
--- a/packages/common/qds-core/package.json
+++ b/packages/common/qds-core/package.json
@@ -1,6 +1,6 @@
{
"name": "@qualcomm-ui/qds-core",
- "version": "1.17.0",
+ "version": "1.18.0",
"description": "qds core components",
"author": "Ryan Bower",
"license": "BSD-3-Clause-Clear",
diff --git a/packages/common/qds-core/src/button/qds-button.css b/packages/common/qds-core/src/button/qds-button.css
index 144c4b58f..94a8a0b4d 100644
--- a/packages/common/qds-core/src/button/qds-button.css
+++ b/packages/common/qds-core/src/button/qds-button.css
@@ -315,6 +315,15 @@
--icon-size: 16px;
}
}
+
+ /* For when the icon is declared as a node, i.e. `` */
+ .lucide {
+ height: var(--icon-size);
+ stroke: currentColor;
+ stroke-linecap: round;
+ stroke-linejoin: round;
+ width: var(--icon-size);
+ }
}
.qui-button-group {
diff --git a/packages/common/qds-core/src/icon/qds-icon.css b/packages/common/qds-core/src/icon/qds-icon.css
index bd42e08eb..72573de3d 100644
--- a/packages/common/qds-core/src/icon/qds-icon.css
+++ b/packages/common/qds-core/src/icon/qds-icon.css
@@ -12,6 +12,14 @@
vertical-align: middle;
width: var(--icon-width, var(--icon-size));
+ svg.lucide {
+ height: var(--icon-height, var(--icon-size));
+ stroke: currentColor;
+ stroke-linecap: round;
+ stroke-linejoin: round;
+ width: var(--icon-width, var(--icon-size));
+ }
+
&[hidden] {
display: none;
}
diff --git a/packages/common/qds-core/src/input/qds-input.css b/packages/common/qds-core/src/input/qds-input.css
index 79d6b75d8..801b0e3d8 100644
--- a/packages/common/qds-core/src/input/qds-input.css
+++ b/packages/common/qds-core/src/input/qds-input.css
@@ -181,6 +181,11 @@
--icon-width: var(--sizing-80);
margin-right: calc(var(--spacing-80) - var(--input-group-gap));
}
+
+ svg.lucide {
+ height: var(--icon-height);
+ width: var(--icon-width);
+ }
}
.qui-input__clear-button {
diff --git a/packages/common/qds-core/src/link/link.types.ts b/packages/common/qds-core/src/link/link.types.ts
index 74e1825f2..85db23f50 100644
--- a/packages/common/qds-core/src/link/link.types.ts
+++ b/packages/common/qds-core/src/link/link.types.ts
@@ -6,7 +6,11 @@ import type {DirectionProperty} from "@qualcomm-ui/utils/direction"
import type {linkClasses} from "./link.classes"
-export type QdsLinkEmphasis = "default" | "neutral"
+export type QdsLinkEmphasis =
+ | "default"
+ | "neutral"
+ | "brand"
+ | "white-persistent"
export type QdsLinkSize = "xs" | "sm" | "md" | "lg" | "xl" | "xxl"
diff --git a/packages/common/qds-core/src/link/qds-link.css b/packages/common/qds-core/src/link/qds-link.css
index e989ee20b..d89b76f50 100644
--- a/packages/common/qds-core/src/link/qds-link.css
+++ b/packages/common/qds-core/src/link/qds-link.css
@@ -54,20 +54,60 @@
color: var(--color-interactive-text-link-neutral-pressed);
}
+ &:focus-visible {
+ border: solid 1px var(--color-utility-focus-border);
+ color: var(--color-interactive-text-link-neutral-idle);
+ outline: solid 1px var(--color-utility-focus-border);
+ }
+
&:visited:not(:hover) {
- border-bottom-color: var(--color-interactive-text-link-neutral-visited);
+ color: var(--color-interactive-text-link-neutral-visited);
+ }
+ }
+
+ &[data-emphasis="brand"] {
+ color: var(--color-interactive-text-link-brand-idle);
+
+ &:hover {
+ border-bottom-color: var(--color-interactive-text-link-brand-hover);
+ color: var(--color-interactive-text-link-brand-hover);
+ }
+
+ &:active {
+ color: var(--color-interactive-text-link-brand-pressed);
}
&:focus-visible {
border: solid 1px var(--color-utility-focus-border);
- border-radius: var(--border-radius-md);
- color: var(--color-interactive-text-link-neutral-idle);
+ color: var(--color-interactive-text-link-brand-idle);
outline: solid 1px var(--color-utility-focus-border);
- outline-offset: 0;
}
&:visited:not(:hover) {
- color: var(--color-interactive-text-link-neutral-visited);
+ color: var(--color-interactive-text-link-brand-visited);
+ }
+ }
+
+ &[data-emphasis="white-persistent"] {
+ color: var(--color-utility-persistent-white);
+
+ &:hover {
+ border-bottom-color: var(--color-utility-persistent-white);
+ color: var(--color-utility-persistent-white);
+ }
+
+ &:active {
+ color: var(--color-utility-persistent-transparent-white);
+ }
+
+ &:focus-visible {
+ border: solid 1px var(--color-utility-focus-border);
+ color: var(--color-interactive-text-link-brand-idle);
+ outline: solid 1px var(--color-utility-focus-border);
+ }
+
+ &:visited:not(:hover) {
+ color: var(--color-interactive-text-link-brand-visited);
}
}
diff --git a/packages/docs/angular-docs/src/routes/components+/link+/demos/link-colors-demo.ts b/packages/docs/angular-docs/src/routes/components+/link+/demos/link-colors-demo.ts
index e201d036c..6623562cf 100644
--- a/packages/docs/angular-docs/src/routes/components+/link+/demos/link-colors-demo.ts
+++ b/packages/docs/angular-docs/src/routes/components+/link+/demos/link-colors-demo.ts
@@ -8,8 +8,12 @@ import {LinkDirective} from "@qualcomm-ui/angular/link"
template: `
`,
diff --git a/packages/docs/react-docs/src/routes/components+/link+/demos/link-colors-demo.tsx b/packages/docs/react-docs/src/routes/components+/link+/demos/link-colors-demo.tsx
index ff5582057..72e6a4319 100644
--- a/packages/docs/react-docs/src/routes/components+/link+/demos/link-colors-demo.tsx
+++ b/packages/docs/react-docs/src/routes/components+/link+/demos/link-colors-demo.tsx
@@ -6,8 +6,12 @@ export function LinkColorsDemo(): ReactElement {
return (
{/* preview */}
-
Default
-
Neutral
+
default
+
neutral
+
brand
+
+ white-persistent
+
{/* preview */}
)
diff --git a/packages/frameworks/angular/.gitignore b/packages/frameworks/angular/.gitignore
new file mode 100644
index 000000000..3ff7e51fb
--- /dev/null
+++ b/packages/frameworks/angular/.gitignore
@@ -0,0 +1 @@
+figma/generated
diff --git a/packages/frameworks/angular/CHANGELOG.md b/packages/frameworks/angular/CHANGELOG.md
index 24ede3f84..699f949b5 100644
--- a/packages/frameworks/angular/CHANGELOG.md
+++ b/packages/frameworks/angular/CHANGELOG.md
@@ -1,5 +1,15 @@
# @qualcomm-ui/angular Changelog
+## 1.18.0 (2026/02/13)
+
+### Features
+
+- feat(link): add `brand` and `white-persistent` emphasis
+
+### Miscellaneous Chores
+
+- **deps:** update dependencies [@qualcomm-ui/qds-core]
+
## 1.17.0 (2026/02/11)
### Features
diff --git a/packages/frameworks/angular/figma/components.config.json b/packages/frameworks/angular/figma/components.config.json
new file mode 100644
index 000000000..f7be77160
--- /dev/null
+++ b/packages/frameworks/angular/figma/components.config.json
@@ -0,0 +1,15 @@
+{
+ "codeConnect": {
+ "include": ["src/**/*"],
+ "exclude": ["src/**/*.spec.ts"],
+ "parser": "html",
+ "label": "Angular",
+ "paths": {
+ "@qualcomm-ui/angular/*": ["./src/*/index.ts"]
+ },
+ "documentUrlSubstitutions": {
+ "": "https://www.figma.com/design/G6YKSbQ5Jn83xQBRvlqe6M",
+ "": "https://www.figma.com/design/fJC9KDk1b8v5KxHRttSbqS"
+ }
+ }
+}
diff --git a/packages/frameworks/angular/figma/icons.config.json b/packages/frameworks/angular/figma/icons.config.json
new file mode 100644
index 000000000..b33772062
--- /dev/null
+++ b/packages/frameworks/angular/figma/icons.config.json
@@ -0,0 +1,14 @@
+{
+ "codeConnect": {
+ "include": ["figma/generated/icons/**"],
+ "exclude": ["src/**/*.spec.ts"],
+ "parser": "html",
+ "label": "Angular",
+ "paths": {
+ "@qualcomm-ui/angular/*": ["./src/*/index.ts"]
+ },
+ "documentUrlSubstitutions": {
+ "": "https://www.figma.com/design/fJC9KDk1b8v5KxHRttSbqS"
+ }
+ }
+}
diff --git a/packages/frameworks/angular/package.json b/packages/frameworks/angular/package.json
index 2d3ed855e..635374c1a 100644
--- a/packages/frameworks/angular/package.json
+++ b/packages/frameworks/angular/package.json
@@ -1,6 +1,6 @@
{
"name": "@qualcomm-ui/angular",
- "version": "1.17.0",
+ "version": "1.18.0",
"description": "QUI Angular Components",
"author": "Ryan Bower",
"license": "BSD-3-Clause-Clear",
@@ -29,7 +29,9 @@
"build:bundle-size": "ng build test-bundle-size-app",
"analyze-bundle": "source-map-explorer bundle-size-dist/main.js",
"explore-bundle": "run-s build:bundle-size analyze-bundle",
- "publish-angular-package": "tsx apply-package && qui-cli publish-angular qui-angular"
+ "publish-angular-package": "tsx apply-package && qui-cli publish-angular qui-angular",
+ "figma:publish-components": "figma connect publish -c figma/components.config.json",
+ "figma:publish-icons": "figma connect publish -c figma/icons.config.json --batch-size 500"
},
"devDependencies": {
"@analogjs/platform": "catalog:",
@@ -55,12 +57,14 @@
"@angular/ssr": "catalog:",
"@faker-js/faker": "~9.6.0",
"@floating-ui/dom": "^1.7.0",
+ "@figma/code-connect": "^1.3.13",
"@jsdevtools/coverage-istanbul-loader": "~3.0.5",
"@module-federation/enhanced": "0.21.2",
"@qualcomm-ui/angular-core": "workspace:^1.5.0",
"@qualcomm-ui/cli": "workspace:^1.0.6",
"@qualcomm-ui/core": "workspace:^1.3.0",
- "@qualcomm-ui/qds-core": "workspace:^1.17.0",
+ "@qualcomm-ui/dom": "workspace:^1.0.7",
+ "@qualcomm-ui/qds-core": "workspace:^1.18.0",
"@qualcomm-ui/tailwind-plugin": "workspace:^1.5.1",
"@qualcomm-ui/tsconfig": "workspace:^1.0.4",
"@qualcomm-ui/utils": "workspace:^1.1.0",
@@ -102,7 +106,7 @@
"@angular/platform-browser-dynamic": ">=20 <23",
"@qualcomm-ui/angular-core": "workspace:^1.5.0",
"@qualcomm-ui/core": "workspace:^1.3.0",
- "@qualcomm-ui/qds-core": "workspace:^1.17.0",
+ "@qualcomm-ui/qds-core": "workspace:^1.18.0",
"@qualcomm-ui/utils": "workspace:^1.1.0",
"@tanstack/virtual-core": ">=3.13.12",
"lucide-angular": ">=0.487.0 <1",
diff --git a/packages/frameworks/angular/src/text-input/figma/text-input.figma.ts b/packages/frameworks/angular/src/text-input/figma/text-input.figma.ts
new file mode 100644
index 000000000..9eb310448
--- /dev/null
+++ b/packages/frameworks/angular/src/text-input/figma/text-input.figma.ts
@@ -0,0 +1,47 @@
+// Copyright (c) Qualcomm Technologies, Inc. and/or its subsidiaries.
+// SPDX-License-Identifier: BSD-3-Clause-Clear
+
+import figma, {html} from "@figma/code-connect/html"
+
+const sharedProps = {
+ defaultInputValue: figma.boolean("filled", {
+ true: figma.string("inputText"),
+ }),
+ disabled: figma.enum("state", {
+ disabled: true,
+ }),
+ errorText: figma.string("errorText"),
+ hint: figma.string("helperText"),
+ invalid: figma.enum("state", {
+ invalid: true,
+ }),
+ label: figma.boolean("label", {
+ true: figma.string("labelText"),
+ }),
+ placeholder: figma.string("holderText"),
+ required: figma.boolean("required"),
+ size: figma.enum("size", {
+ lg: "lg",
+ md: "md",
+ sm: "sm",
+ }),
+}
+
+figma.connect("?node-id=4227-2418", {
+ example: (props) => html`
+
+
+ `,
+ props: {
+ ...sharedProps,
+ endIcon: figma.instance("iconRxs"),
+ startIcon: figma.instance("iconLxs"),
+ },
+})
diff --git a/packages/frameworks/angular/tsconfig.angular-lib.json b/packages/frameworks/angular/tsconfig.angular-lib.json
index e809ab622..1be64b84d 100644
--- a/packages/frameworks/angular/tsconfig.angular-lib.json
+++ b/packages/frameworks/angular/tsconfig.angular-lib.json
@@ -25,7 +25,7 @@
}
],
"include": ["./src"],
- "exclude": ["**/*.spec.ts"],
+ "exclude": ["**/*.spec.ts", "**/*.figma.ts"],
"angularCompilerOptions": {
"flatModuleId": "qui-angular",
"flatModuleOutFile": "qui-angular.js"
diff --git a/packages/frameworks/angular/tsconfig.figma.json b/packages/frameworks/angular/tsconfig.figma.json
new file mode 100644
index 000000000..ee6601c61
--- /dev/null
+++ b/packages/frameworks/angular/tsconfig.figma.json
@@ -0,0 +1,32 @@
+{
+ "extends": "@qualcomm-ui/tsconfig/tsconfig.strict.json",
+ "compilerOptions": {
+ "composite": true,
+ "baseUrl": "./",
+ "incremental": true,
+ "rootDir": "./src",
+ "outDir": "./node_modules/.tmp/figma",
+ "tsBuildInfoFile": "node_modules/.tmp/tsbuildinfo.figma",
+ "paths": {
+ "@qualcomm-ui/angular/*": ["./src/*/index.ts"],
+ }
+ },
+ "include": ["./src/**/*.figma.tsx"],
+ "references": [
+ {
+ "path": "./tsconfig.lib.json"
+ },
+ {
+ "path": "../react-core/tsconfig.lib.json"
+ },
+ {
+ "path": "../../common/core/tsconfig.lib.json"
+ },
+ {
+ "path": "../../common/qds-core/tsconfig.lib.json"
+ },
+ {
+ "path": "../../common/utils/tsconfig.lib.json"
+ }
+ ]
+}
diff --git a/packages/frameworks/angular/tsconfig.json b/packages/frameworks/angular/tsconfig.json
index d495fbeef..2657afc2f 100644
--- a/packages/frameworks/angular/tsconfig.json
+++ b/packages/frameworks/angular/tsconfig.json
@@ -26,6 +26,9 @@
{
"path": "./tsconfig.angular-lib.json"
},
+ {
+ "path": "./tsconfig.figma.json"
+ },
{
"path": "./tsconfig.lib.json"
},
diff --git a/packages/frameworks/angular/tsconfig.lib.json b/packages/frameworks/angular/tsconfig.lib.json
index 0b1b06d2a..4bf80feaf 100644
--- a/packages/frameworks/angular/tsconfig.lib.json
+++ b/packages/frameworks/angular/tsconfig.lib.json
@@ -23,7 +23,7 @@
}
],
"include": ["./src"],
- "exclude": ["**/*.spec.ts"],
+ "exclude": ["**/*.spec.ts", "**/*.figma.ts"],
"angularCompilerOptions": {
"flatModuleId": "qui-angular",
"flatModuleOutFile": "qui-angular.js"
diff --git a/packages/frameworks/react-mdx/CHANGELOG.md b/packages/frameworks/react-mdx/CHANGELOG.md
index dfa59f22a..277cbe21a 100644
--- a/packages/frameworks/react-mdx/CHANGELOG.md
+++ b/packages/frameworks/react-mdx/CHANGELOG.md
@@ -1,5 +1,11 @@
# @qualcomm-ui/react-mdx Changelog
+## 1.11.9 (2026/02/13)
+
+### Miscellaneous Chores
+
+- **deps:** update dependencies [@qualcomm-ui/react]
+
## 1.11.8 (2026/02/11)
### Miscellaneous Chores
diff --git a/packages/frameworks/react-mdx/package.json b/packages/frameworks/react-mdx/package.json
index 126fb521f..adb5fca75 100644
--- a/packages/frameworks/react-mdx/package.json
+++ b/packages/frameworks/react-mdx/package.json
@@ -1,6 +1,6 @@
{
"name": "@qualcomm-ui/react-mdx",
- "version": "1.11.8",
+ "version": "1.11.9",
"description": "React components and utilities for MDX documentation sites based on QUI Docs",
"author": "Ryan Bower",
"license": "BSD-3-Clause-Clear",
@@ -55,7 +55,7 @@
"@qualcomm-ui/dom": "workspace:^1.0.7",
"@qualcomm-ui/esbuild": "workspace:^1.0.5",
"@qualcomm-ui/mdx-common": "workspace:^1.9.1",
- "@qualcomm-ui/react": "workspace:^1.12.0",
+ "@qualcomm-ui/react": "workspace:^1.13.0",
"@qualcomm-ui/react-core": "workspace:^1.2.0",
"@qualcomm-ui/react-test-utils": "workspace:^1.0.0",
"@qualcomm-ui/tsconfig": "workspace:^1.0.4",
@@ -97,7 +97,7 @@
"@mdx-js/react": ">=3.0.1 <4",
"@qualcomm-ui/core": "workspace:^1.3.0",
"@qualcomm-ui/mdx-common": "workspace:^1.9.1",
- "@qualcomm-ui/react": "workspace:^1.12.0",
+ "@qualcomm-ui/react": "workspace:^1.13.0",
"@qualcomm-ui/react-core": "workspace:^1.2.0",
"@qualcomm-ui/utils": "workspace:^1.1.0",
"@shikijs/langs": ">=3.13.0",
diff --git a/packages/frameworks/react-swagger/CHANGELOG.md b/packages/frameworks/react-swagger/CHANGELOG.md
index a315f32c1..8f2b742da 100644
--- a/packages/frameworks/react-swagger/CHANGELOG.md
+++ b/packages/frameworks/react-swagger/CHANGELOG.md
@@ -1,5 +1,11 @@
# @qualcomm-ui/react-swagger Changelog
+## 1.2.5 (2026/02/13)
+
+### Miscellaneous Chores
+
+- **deps:** update dependencies [@qualcomm-ui/qds-core]
+
## 1.2.4 (2026/02/11)
### Miscellaneous Chores
diff --git a/packages/frameworks/react-swagger/package.json b/packages/frameworks/react-swagger/package.json
index 0e319c85d..ba865ab81 100644
--- a/packages/frameworks/react-swagger/package.json
+++ b/packages/frameworks/react-swagger/package.json
@@ -1,6 +1,6 @@
{
"name": "@qualcomm-ui/react-swagger",
- "version": "1.2.4",
+ "version": "1.2.5",
"description": "Swagger component replacements using QUI React",
"author": "Ryan Bower",
"license": "BSD-3-Clause-Clear",
@@ -45,10 +45,10 @@
"@qualcomm-ui/core": "workspace:^1.3.0",
"@qualcomm-ui/css-utils": "workspace:*",
"@qualcomm-ui/esbuild": "workspace:^1.0.5",
- "@qualcomm-ui/qds-core": "workspace:^1.17.0",
- "@qualcomm-ui/react": "workspace:^1.12.0",
+ "@qualcomm-ui/qds-core": "workspace:^1.18.0",
+ "@qualcomm-ui/react": "workspace:^1.13.0",
"@qualcomm-ui/react-core": "workspace:^1.2.0",
- "@qualcomm-ui/react-mdx": "workspace:^1.11.8",
+ "@qualcomm-ui/react-mdx": "workspace:^1.11.9",
"@qualcomm-ui/react-test-utils": "workspace:^1.0.0",
"@qualcomm-ui/tsconfig": "workspace:^1.0.4",
"@qualcomm-ui/utils": "workspace:^1.1.0",
@@ -101,7 +101,7 @@
"peerDependencies": {
"@braintree/sanitize-url": "^7.1.1",
"@qualcomm-ui/core": "workspace:^1.3.0",
- "@qualcomm-ui/qds-core": "workspace:^1.17.0",
+ "@qualcomm-ui/qds-core": "workspace:^1.18.0",
"@qualcomm-ui/react-core": "workspace:^1.2.0",
"@qualcomm-ui/utils": "workspace:^1.1.0",
"@tanstack/react-virtual": ">=3.13.9",
diff --git a/packages/frameworks/react/.gitignore b/packages/frameworks/react/.gitignore
index dc0003cbb..70c7f137c 100644
--- a/packages/frameworks/react/.gitignore
+++ b/packages/frameworks/react/.gitignore
@@ -1 +1,2 @@
-src/**/*/__visual-regression__/*actual.png
\ No newline at end of file
+src/**/*/__visual-regression__/*actual.png
+figma/generated
diff --git a/packages/frameworks/react/CHANGELOG.md b/packages/frameworks/react/CHANGELOG.md
index 3c88ec806..0ad64d74d 100644
--- a/packages/frameworks/react/CHANGELOG.md
+++ b/packages/frameworks/react/CHANGELOG.md
@@ -1,5 +1,20 @@
# @qualcomm-ui/react Changelog
+## 1.13.0 (2026/02/13)
+
+### Features
+
+- support Figma code connect
+- feat(link): add `brand` and `white-persistent` emphasis
+
+### Code Refactoring
+
+- cleaned up alert banner types
+
+### Miscellaneous Chores
+
+- **deps:** update dependencies [@qualcomm-ui/qds-core]
+
## 1.12.0 (2026/02/11)
### Features
diff --git a/packages/frameworks/react/figma/components.config.json b/packages/frameworks/react/figma/components.config.json
new file mode 100644
index 000000000..c55963c07
--- /dev/null
+++ b/packages/frameworks/react/figma/components.config.json
@@ -0,0 +1,14 @@
+{
+ "codeConnect": {
+ "include": ["src/**/*"],
+ "exclude": ["src/**/*.spec.tsx"],
+ "parser": "react",
+ "paths": {
+ "@qualcomm-ui/react/*": ["./src/*/index.ts"]
+ },
+ "documentUrlSubstitutions": {
+ "": "https://www.figma.com/design/ETvFgN3bbNvr6sbpoZyNuA",
+ "": "https://www.figma.com/design/4xDg5Mrv4mxjsK3xC3L5up"
+ }
+ }
+}
diff --git a/packages/frameworks/react/figma/icons.config.json b/packages/frameworks/react/figma/icons.config.json
new file mode 100644
index 000000000..9e7787c66
--- /dev/null
+++ b/packages/frameworks/react/figma/icons.config.json
@@ -0,0 +1,13 @@
+{
+ "codeConnect": {
+ "include": ["figma/generated/icons/**"],
+ "exclude": ["src/**/*.spec.tsx"],
+ "parser": "react",
+ "paths": {
+ "@qualcomm-ui/react/*": ["./src/*/index.ts"]
+ },
+ "documentUrlSubstitutions": {
+ "": "https://www.figma.com/design/4xDg5Mrv4mxjsK3xC3L5up"
+ }
+ }
+}
diff --git a/packages/frameworks/react/package.json b/packages/frameworks/react/package.json
index 9c0f31028..0868e1368 100644
--- a/packages/frameworks/react/package.json
+++ b/packages/frameworks/react/package.json
@@ -1,6 +1,6 @@
{
"name": "@qualcomm-ui/react",
- "version": "1.12.0",
+ "version": "1.13.0",
"description": "QUI React components",
"author": "Ryan Bower",
"license": "BSD-3-Clause-Clear",
@@ -35,14 +35,20 @@
"test:react:ci": "cross-env NODE_OPTIONS='' vitest -c vitest.config.ts --run --pool=forks --no-file-parallelism",
"test:watch": "cross-env vitest -c vitest.config.ts",
"watch:js": "tsx build.ts --watch --mode development",
- "watch:ts": "pnpm build:ts -w --preserveWatchOutput"
+ "watch:ts": "pnpm build:ts -w --preserveWatchOutput",
+ "code-connect": "tsx scripts/code-connect/cli.ts",
+ "figma:publish-components": "figma connect publish -c figma/components.config.json",
+ "figma:publish-icons": "figma connect publish -c figma/icons.config.json --batch-size 500"
},
"devDependencies": {
"@babel/core": "^7.28.4",
+ "@commander-js/extra-typings": "^14.0.0",
+ "@figma/code-connect": "^1.3.13",
"@qualcomm-ui/cli": "workspace:^1.0.6",
"@qualcomm-ui/core": "workspace:^1.3.0",
+ "@qualcomm-ui/dom": "workspace:^1.0.7",
"@qualcomm-ui/esbuild": "workspace:^1.0.5",
- "@qualcomm-ui/qds-core": "workspace:^1.17.0",
+ "@qualcomm-ui/qds-core": "workspace:^1.18.0",
"@qualcomm-ui/react-core": "workspace:^1.2.0",
"@qualcomm-ui/react-test-utils": "workspace:^1.0.0",
"@qualcomm-ui/tsconfig": "workspace:^1.0.4",
@@ -50,6 +56,7 @@
"@tailwindcss/vite": "^4.1.11",
"@tanstack/react-virtual": "^3.13.12",
"@types/babel__core": "^7.20.5",
+ "@types/lodash-es": "catalog:",
"@types/react": "catalog:",
"@types/react-dom": "catalog:",
"@types/react-transition-group": "^4.4.6",
@@ -59,7 +66,9 @@
"@vitest/coverage-v8": "^4.0.8",
"@vitest/ui": "^4.0.8",
"babel-plugin-react-compiler": "^1.0.0",
+ "commander": "^14.0.2",
"esbuild": "^0.25.8",
+ "lodash-es": "catalog:",
"lucide-react": "0.525.0",
"playwright": "1.56.1",
"quick-lru": "^7.2.0",
@@ -78,7 +87,7 @@
},
"peerDependencies": {
"@qualcomm-ui/core": "workspace:^1.3.0",
- "@qualcomm-ui/qds-core": "workspace:^1.17.0",
+ "@qualcomm-ui/qds-core": "workspace:^1.18.0",
"@qualcomm-ui/react-core": "workspace:^1.2.0",
"@qualcomm-ui/utils": "workspace:^1.1.0",
"@tanstack/react-virtual": ">=3.13.9",
diff --git a/packages/frameworks/react/scripts/code-connect/cli.ts b/packages/frameworks/react/scripts/code-connect/cli.ts
new file mode 100644
index 000000000..38293f98a
--- /dev/null
+++ b/packages/frameworks/react/scripts/code-connect/cli.ts
@@ -0,0 +1,177 @@
+#!/usr/bin/env node
+
+import {Command} from "@commander-js/extra-typings"
+import {client} from "@figma/code-connect"
+import {chunk, sortBy, uniqBy} from "lodash-es"
+import {mkdir, writeFile} from "node:fs/promises"
+import path from "node:path"
+
+import {dedent} from "@qualcomm-ui/utils/dedent"
+
+import {logger, LogLevel} from "./logger.js"
+
+const program = new Command()
+ .name("code-connect")
+ .description("CLI for fetching Figma nodes for Code Connect")
+ .version("1.0.0")
+
+program
+ .command("fetch")
+ .description("Fetch all components from a Figma page")
+ .argument("", "Figma file or page URL")
+ .option("-n, --node-id ", "Specific node ID to fetch")
+ .option("-o, --out ", "Write JSON output to file")
+ .option("-v, --verbose", "Enable verbose logging", false)
+ .action(async (url, options) => {
+ if (options.verbose) {
+ logger.setLogLevel(LogLevel.Debug)
+ }
+
+ if (!process.env.FIGMA_ACCESS_TOKEN) {
+ logger.error("FIGMA_ACCESS_TOKEN environment variable is not set")
+ process.exit(1)
+ }
+
+ try {
+ const fetchUrl = options.nodeId ? `${url}?node-id=${options.nodeId}` : url
+ const components = await client.getComponents(fetchUrl)
+ const json = JSON.stringify(components, null, 2)
+
+ if (options.out) {
+ await writeFile(options.out, json)
+ logger.info(`Wrote ${components.length} components to ${options.out}`)
+ } else {
+ console.log(json)
+ }
+ } catch (error) {
+ logger.error(
+ `Failed to fetch components: ${error instanceof Error ? error.message : String(error)}`,
+ )
+ process.exit(1)
+ }
+ })
+
+program
+ .command("generate-icons")
+ .description("Generate Code Connect files for icon components")
+ .argument("", "Figma file or page URL containing icons")
+ .option("-o, --out ", "Output directory", "generated/figma/icons")
+ .option("-v, --verbose", "Enable verbose logging", false)
+ .action(async (url, options) => {
+ if (options.verbose) {
+ logger.setLogLevel(LogLevel.Debug)
+ }
+
+ if (!process.env.FIGMA_ACCESS_TOKEN) {
+ logger.error("FIGMA_ACCESS_TOKEN environment variable is not set")
+ process.exit(1)
+ }
+
+ try {
+ const components = await client.getComponents(url)
+
+ const icons = uniqBy(
+ components.filter((c) => c.name.startsWith("utl/")),
+ (obj) => obj.name,
+ )
+ if (icons.length === 0) {
+ logger.warn(
+ "No icon components found (expected names starting with 'utl/')",
+ )
+ process.exit(0)
+ }
+
+ logger.info(`Found ${icons.length} icon components`)
+
+ await mkdir(options.out, {recursive: true})
+
+ const codeConnects: IconCodeConnect[] = sortBy(
+ icons.map((icon) => {
+ const iconName = toPascalCase(icon.name.replace(/^utl\//, ""))
+ const props = icon.componentPropertyDefinitions
+ const sizeProp = props.size || props.Size
+ let figmaProps: string | undefined = undefined
+ if (sizeProp && (sizeProp.type as string) === "VARIANT") {
+ // inconsistent naming in the Figma icons file. (>_>)
+ figmaProps = dedent`
+ {iconName: "${iconName}", size: figma.enum("${props.size ? "size" : "Size"}", ${JSON.stringify(
+ sizeProp.variantOptions?.reduce(
+ (acc: Record, current) => {
+ acc[current] = current
+ return acc
+ },
+ {},
+ ),
+ )})}
+ `
+ }
+ return {
+ figmaNodeId: encodeURIComponent(icon.id),
+ iconName,
+ props: figmaProps,
+ }
+ }),
+ (icon) => icon.iconName,
+ )
+
+ const batches: IconCodeConnect[][] = chunk(codeConnects, 100)
+
+ await Promise.all(
+ batches.map(async (batch, index) => {
+ const suffix = batches.length > 1 ? `-${index + 1}` : ""
+ const outputFile = path.join(options.out, `icons${suffix}.figma.tsx`)
+ const content = generateIconsFile(batch)
+ await writeFile(outputFile, content)
+ logger.info(`Generated ${outputFile} with ${batch.length} icons`)
+ }),
+ )
+
+ logger.info(
+ `Generated ${batches.length} file(s) with ${icons.length} total icons`,
+ )
+ } catch (error) {
+ logger.error(
+ `Failed to generate icons: ${error instanceof Error ? error.message : String(error)}`,
+ )
+ process.exit(1)
+ }
+ })
+
+function toPascalCase(str: string): string {
+ return str
+ .split(/[-_\s]+/)
+ .map((word) => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase())
+ .join("")
+}
+
+interface IconCodeConnect {
+ figmaNodeId: string
+ iconName: string
+ props: string | undefined
+}
+
+function generateIconsFile(icons: IconCodeConnect[]): string {
+ const imports = icons.map((i) => i.iconName).join(", ")
+ const connects = icons
+ .map((i) =>
+ dedent(`
+ figma.connect(${i.iconName}, "?node-id=${i.figmaNodeId}", {
+ imports: ['import {${i.iconName}} from "lucide-react"'],
+ props: ${i.props},
+ })
+ `),
+ )
+ .join("\n\n")
+
+ return dedent`
+ /* eslint-disable */
+ // this file was automatically generated, do not edit it directly
+
+ import figma from "@figma/code-connect"
+ import {${imports}} from "lucide-react"
+
+ ${connects}
+ `
+}
+
+program.parse()
diff --git a/packages/frameworks/react/scripts/code-connect/logger.ts b/packages/frameworks/react/scripts/code-connect/logger.ts
new file mode 100644
index 000000000..eb678ce28
--- /dev/null
+++ b/packages/frameworks/react/scripts/code-connect/logger.ts
@@ -0,0 +1,45 @@
+import {styleText} from "node:util"
+
+export enum LogLevel {
+ Nothing = 0,
+ Error = 1,
+ Warn = 2,
+ Info = 3,
+ Debug = 4,
+}
+
+let currentLogLevel: LogLevel = LogLevel.Info
+
+export const logger = {
+ debug(...messages: unknown[]) {
+ if (currentLogLevel >= LogLevel.Debug) {
+ console.debug(styleText("gray", formatMessages(messages)))
+ }
+ },
+
+ error(...messages: unknown[]) {
+ if (currentLogLevel >= LogLevel.Error) {
+ console.error(styleText("red", formatMessages(messages)))
+ }
+ },
+
+ info(...messages: unknown[]) {
+ if (currentLogLevel >= LogLevel.Info) {
+ console.info(styleText("white", formatMessages(messages)))
+ }
+ },
+
+ setLogLevel(level: LogLevel) {
+ currentLogLevel = level
+ },
+
+ warn(...messages: unknown[]) {
+ if (currentLogLevel >= LogLevel.Warn) {
+ console.warn(styleText("yellow", formatMessages(messages)))
+ }
+ },
+}
+
+function formatMessages(messages: unknown[]): string {
+ return messages.map((m) => (typeof m === "string" ? m : String(m))).join(" ")
+}
diff --git a/packages/frameworks/react/src/accordion/figma/accordion.figma.tsx b/packages/frameworks/react/src/accordion/figma/accordion.figma.tsx
new file mode 100644
index 000000000..b1bc02fc8
--- /dev/null
+++ b/packages/frameworks/react/src/accordion/figma/accordion.figma.tsx
@@ -0,0 +1,103 @@
+// Copyright (c) Qualcomm Technologies, Inc. and/or its subsidiaries.
+// SPDX-License-Identifier: BSD-3-Clause-Clear
+
+import figma from "@figma/code-connect"
+
+import type {QdsAccordionSize} from "@qualcomm-ui/qds-core/accordion"
+import {Accordion} from "@qualcomm-ui/react/accordion"
+
+/** Accordion Group */
+
+const sharedGroupProps = {
+ children: figma.children("Accordion"),
+ size: figma.enum("size", {
+ lg: "lg",
+ sm: "sm",
+ }),
+ uncontained: figma.enum("contained", {
+ false: true,
+ }),
+}
+
+// Accordion group
+figma.connect(Accordion.Root, "?node-id=2191-5476", {
+ example: ({children, size, uncontained}) => {
+ return (
+
+ {/* Each item requires a unique value */}
+ {children}
+
+ )
+ },
+ props: {
+ ...sharedGroupProps,
+ },
+})
+
+/** Accordion Item */
+
+const sharedItemProps = {
+ disabled: figma.enum("state", {
+ disabled: true,
+ }),
+}
+
+figma.connect(Accordion.Item, "?node-id=2161-18192", {
+ example: ({disabled, icon, secondaryText}) => {
+ return (
+
+ Lorem Ipsum
+
+ )
+ },
+ imports: ["import {SomeIcon} from 'lucide-react'"],
+ props: {
+ ...sharedItemProps,
+ icon: figma.boolean("icon", {
+ false: undefined,
+ true: SomeIcon,
+ }),
+ secondaryText: figma.boolean("subHeader", {
+ false: undefined,
+ true: "Secondary text",
+ }),
+ },
+ variant: {
+ chevron: "right",
+ },
+})
+
+figma.connect(Accordion.Item, "?node-id=2161-18192", {
+ example: ({disabled, secondaryText}) => {
+ return (
+
+
+
+ Title of accordion
+ {secondaryText}
+
+ Lorem Ipsum
+
+ )
+ },
+ props: {
+ ...sharedItemProps,
+ secondaryText: figma.boolean("subHeader", {
+ false: undefined,
+ true: (
+
+ Secondary text
+
+ ),
+ }),
+ },
+ variant: {
+ chevron: "left",
+ },
+})
diff --git a/packages/frameworks/react/src/alert-banner/figma/alert-banner.figma.tsx b/packages/frameworks/react/src/alert-banner/figma/alert-banner.figma.tsx
index adf1998de..71ef3f83a 100644
--- a/packages/frameworks/react/src/alert-banner/figma/alert-banner.figma.tsx
+++ b/packages/frameworks/react/src/alert-banner/figma/alert-banner.figma.tsx
@@ -1,3 +1,5 @@
+// @ts-nocheck
+
// Copyright (c) Qualcomm Technologies, Inc. and/or its subsidiaries.
// SPDX-License-Identifier: BSD-3-Clause-Clear
@@ -10,102 +12,102 @@ const FIGMA_URL =
"https://www.figma.com/design/G6YKSbQ5Jn83xQBRvlqe6M/Code-Connect?node-id=3566-16209"
const sharedProps = {
- heading: figma.string("heading"),
description: figma.boolean("description", {
true: figma.string("descriptionText"),
}),
emphasis: figma.enum("emphasis", {
- success: "success",
- warning: "warning",
danger: "danger",
neutral: "neutral",
+ success: "success",
+ warning: "warning",
}),
+ heading: figma.string("heading"),
}
// Strong variant with icon (simple API)
figma.connect(AlertBanner, FIGMA_URL, {
- variant: {variant: "strong", showIcon: true},
+ example: (props) => ,
props: {
...sharedProps,
- dismissable: figma.boolean("dismiss"),
action: figma.boolean("button", {
true: (
-