diff --git a/.cursor/rules/figma-rules.mdc b/.cursor/rules/figma-rules.mdc
new file mode 100644
index 00000000000..880a0203d9e
--- /dev/null
+++ b/.cursor/rules/figma-rules.mdc
@@ -0,0 +1,165 @@
+---
+description: Figma Dev Mode MCP rules
+alwaysApply: true
+---
+
+# Figma Dev Mode MCP Rules
+
+You are an expert developer working with the Codecademy Gamut design system and Figma Dev Mode MCP integration.
+
+When generating code from Figma designs, follow these rules:
+
+## MANDATORY Pre-Generation Steps
+
+**BEFORE generating ANY code from Figma, you MUST:**
+
+1. **Inspect the Figma layer hierarchy**:
+
+ - Call `get_metadata` WITH the nodeId to get parent component info
+ - Call `get_metadata` WITHOUT nodeId (empty string) to attempt to get CHILD layers
+ - **IMPORTANT**: Current limitation - `get_metadata` may not return nested child layer names (icons, nested components, etc.)
+ - **If child layer names are not available from tooling:**
+ - Analyze the screenshot and make your best guess about which icons/nested components are used
+ - Look for visual clues (user icon, gear icon, etc.) and match them to likely Gamut icon names
+ - Search the codebase to verify the icon exists (e.g., check for `PersonIcon`, `GearIcon`, etc. in `/packages/gamut-icons/src`)
+ - Generate the code using your best guess
+ - **AFTER generating the code**, ask the user to confirm the icons are correct
+ - Example: "I've generated the code using PersonIcon and GearIcon based on what I see in the screenshot. Can you confirm these are the correct icons from the Figma layers?"
+ - Map icon layer names to components in the codebase (e.g., "Regular/Interface/PersonIcon" → `PersonIcon`, "Mini/MiniCheckCircleIcon" → `MiniCheckCircleIcon`)
+
+2. **Read token files** (use read_file tool on ALL of these):
+
+ - `/packages/gamut-styles/src/variables/spacing.ts`
+ - `/packages/gamut-styles/src/variables/colors.ts`
+ - `/packages/gamut-styles/src/variables/typography.ts`
+ - `/packages/gamut-styles/src/variables/borderRadii.ts`
+
+3. **Search for existing components** (use codebase_search):
+
+ - Check if similar component exists in `/packages/gamut/src`
+ - If exists, extend it instead of creating new one
+
+4. **Understand the design system patterns**:
+ - Read example components like Badge, Tag, or Button
+ - Follow variance, system props, and styledOptions patterns
+
+## Asset Management
+
+- The Figma Dev Mode MCP Server provides an assets endpoint which can serve image and SVG assets
+- **IMPORTANT**: do NOT use or create placeholders if a localhost source is provided
+
+## Component Usage
+
+- **IMPORTANT**: Always use components from `/packages` whenever possible
+- Check if the Figma component name matches a Gamut component name and use that component
+- **IMPORTANT**: All patterns should come from `/packages/gamut-patterns` - use the design's metadata to match the Figma component name to the pattern component
+- **IMPORTANT**: All illustrations should come from `/packages/gamut-illustrations` - use the design's metadata to match the Figma component name to the illustration component
+- **IMPORTANT**: All icons should come from `/packages/gamut-icons`:
+ - Try to get icon layer names from Figma metadata
+ - If layer names are not available, make your best guess based on the screenshot and verify the icon exists in the codebase
+ - Generate the code with your best guess, then confirm with the user after
+ - Map icon layer names to Gamut components (e.g., "Regular/Interface/PersonIcon" → `PersonIcon` from `@codecademy/gamut-icons`)
+
+## Styling Guidelines - STRICT RULES
+
+### ❌ NEVER Do This:
+
+```tsx
+// NEVER use hardcoded pixel values
+height: 24,
+width: '64px',
+fontSize: 14,
+
+// NEVER use hardcoded hex colors
+color: '#ffffff',
+backgroundColor: '#000000',
+
+// NEVER use CSS properties not in system props
+backdropFilter: 'blur(1px)',
+
+// NEVER use inline styles
+style={{ fontSize: 14 }}
+```
+
+### ✅ ALWAYS Do This:
+
+```tsx
+// ALWAYS use spacing tokens (4, 8, 12, 16, 24, 32, 40, 48, 64, 96)
+height: 24, // from spacing.ts
+width: 64, // from spacing.ts
+
+// ALWAYS use fontSize tokens (14, 16, 18, 20, 22, 26, 34, 44, 64)
+fontSize: 14, // from typography.ts
+
+// ALWAYS use borderRadii tokens (none, sm, md, lg, xl, full)
+borderRadius: 'full', // from borderRadii.ts
+
+// ALWAYS use semantic color tokens
+bg: 'background',
+color: 'text',
+borderColor: 'border',
+
+// ALWAYS use system props via system.css or styled components
+system.css({
+ bg: 'black',
+ color: 'white',
+ borderRadius: 'full',
+})
+```
+
+### Token Mapping Rules:
+
+1. **Spacing/Sizing**: Map Figma values to closest token from `spacing.ts`
+
+ - 4px, 8px, 12px, 16px, 24px, 32px, 40px, 48px, 64px, 96px
+
+2. **Colors**: Use semantic tokens OR core colors from `colors.ts`
+
+ - Semantic: `background`, `text`, `border`, `text-secondary`, etc.
+ - Core: `navy`, `white`, `black`, `blue`, `green`, `red`, `yellow`, etc.
+ - For Background component only: use color names (navy, white, etc.)
+
+3. **Border Radius**: Use tokens from `borderRadii.ts`
+
+ - none (0px), sm (2px), md (4px), lg (8px), xl (16px), full (999px)
+
+4. **Typography**: Use tokens from `typography.ts`
+
+ - fontFamily: `accent`, `base`, `monospace`, `system`
+ - fontSize: 14, 16, 18, 20, 22, 26, 34, 44, 64
+ - fontWeight: 400, 700 or `base`, `title`
+ - lineHeight: `base` (1.5), `title` (1.2), `spacedTitle` (1.3)
+
+5. **If no exact match**: Document in code comment why custom value needed
+
+### Emotion & CSS-in-JS Patterns:
+
+- **IMPORTANT**: Do not use inline styles
+- Use `styled` from `@emotion/styled`
+- Use `system.css()` for style objects
+- Use `styledOptions` for styled component options
+- Compose system props with `variance.compose()`
+
+## Accessibility & Best Practices
+
+- **IMPORTANT**: Follow WCAG requirements for accessibility
+- Always follow best practices from `/packages/styleguide/src/lib/Meta/Best Practices.mdx`
+
+## Implementation
+
+- Use the CodeConnect implementation when available
+- Generate clean, maintainable React code using TypeScript
+- Follow the existing Gamut patterns and conventions
+
+## Post-Generation Validation
+
+After generating code, verify:
+
+- [ ] No hardcoded hex colors (`#` in color values)
+- [ ] No hardcoded pixel strings (`'24px'` format)
+- [ ] All spacing values match tokens from spacing.ts
+- [ ] All colors use semantic tokens or theme colors
+- [ ] All border radius uses borderRadii tokens
+- [ ] Component follows Gamut patterns (variance, system props, styledOptions)
+- [ ] No inline styles
+- [ ] Uses emotion styled components
diff --git a/.eslintignore b/.eslintignore
index 9152f931279..2b0150ad6de 100644
--- a/.eslintignore
+++ b/.eslintignore
@@ -8,4 +8,6 @@ docs
**/tmp
packages/gamut-icons/src/icons
packages/gamut-patterns/src/patterns
+**/code-connect/**
+packages/code-connect
.nx
diff --git a/.eslintrc.js b/.eslintrc.js
index 326e2bdff4c..3ace90f7b93 100644
--- a/.eslintrc.js
+++ b/.eslintrc.js
@@ -8,6 +8,8 @@ module.exports = {
plugins: ['eslint-plugin-gamut'],
+ ignorePatterns: ['packages/code-connect/**/*'],
+
rules: {
'gamut/prefer-themed': 'error',
'gamut/no-css-standalone': 'error',
diff --git a/.github/copilot-instructions.md b/.github/copilot-instructions.md
new file mode 100644
index 00000000000..e69de29bb2d
diff --git a/.github/instructions/figma.instructions.md b/.github/instructions/figma.instructions.md
new file mode 100644
index 00000000000..d316f6a15c7
--- /dev/null
+++ b/.github/instructions/figma.instructions.md
@@ -0,0 +1,189 @@
+---
+applyTo: '**'
+priority: high
+---
+
+# Figma Dev Mode MCP Rules
+
+You are an expert developer working with the Codecademy Gamut design system and Figma Dev Mode MCP integration.
+
+When generating code from Figma designs, follow these rules:
+
+## WORKFLOW TRIGGER - CRITICAL
+
+**When you see ANY of these patterns:**
+
+- Figma URL mentioned (figma.com/design/...)
+- nodeId provided
+- "generate from figma" or similar requests
+- MCP Figma server is being used
+
+## MANDATORY Pre-Generation Steps - MUST BE COMPLETED IN ORDER
+
+**Step 1: Figma Inspection (REQUIRED)**
+
+- [ ] Call `get_metadata` WITH nodeId
+- [ ] Call `get_metadata` WITHOUT nodeId
+- **IMPORTANT**: Current limitation - `get_metadata` may not return nested child layer names (icons, nested components, etc.)
+ - **If child layer names are not available from tooling:**
+ - Analyze the screenshot and make your best guess about which icons/nested components are used
+ - Look for visual clues (user icon, gear icon, etc.) and match them to likely Gamut icon names
+ - Search the codebase to verify the icon exists (e.g., check for `PersonIcon`, `GearIcon`, etc. in `/packages/gamut-icons/src`)
+ - Generate the code using your best guess
+ - **AFTER generating the code**, ask the user to confirm the icons are correct
+ - Example: "I've generated the code using PersonIcon and GearIcon based on what I see in the screenshot. Can you confirm these are the correct icons from the Figma layers?"
+ - Map icon layer names to components in the codebase (e.g., "Regular/Interface/PersonIcon" → `PersonIcon`, "Mini/MiniCheckCircleIcon" → `MiniCheckCircleIcon`)
+- [ ] Call `get_image` to get screenshot FOR CONFIRMATION ONLY
+- [ ] **Validate that screenshot matches metadata understanding**
+
+**Step 1.5: Metadata Analysis (NEW - REQUIRED)**
+
+- [ ] **PRIMARY SOURCE**: Use Figma metadata to determine:
+ - Component name and type
+ - Layer structure and nested components
+ - Any CodeConnect implementations mentioned
+- [ ] **SECONDARY SOURCE**: Use screenshot only to:
+ - Confirm visual styling details
+ - Identify icons if not available in metadata
+ - Validate layout and spacing
+- [ ] **If metadata says "Badge" but screenshot looks different, trust the metadata**
+
+**Step 2: Token Analysis (REQUIRED)**
+
+- [ ] Read `/packages/gamut-styles/src/variables/spacing.ts`
+- [ ] Read `/packages/gamut-styles/src/variables/colors.ts`
+- [ ] Read `/packages/gamut-styles/src/variables/typography.ts`
+- [ ] Read `/packages/gamut-styles/src/variables/borderRadii.ts`
+
+**Step 3: Component Research (REQUIRED)**
+
+- [ ] Search for existing components in `/packages/gamut/src`
+- [ ] Read existing component if found
+- [ ] Determine if extending existing vs creating new
+
+**Step 4: Generate Code**
+
+- [ ] Use existing components when possible
+- [ ] Follow token mapping rules strictly
+- [ ] Validate against post-generation checklist
+
+## Asset Management
+
+- The Figma Dev Mode MCP Server provides an assets endpoint which can serve image and SVG assets
+- **IMPORTANT**: do NOT use or create placeholders if a localhost source is provided
+
+## Component Usage
+
+- **IMPORTANT**: Always use components from `/packages` whenever possible
+- Check if the Figma component name matches a Gamut component name and use that component
+- **IMPORTANT**: All patterns should come from `/packages/gamut-patterns` - use the design's metadata to match the Figma component name to the pattern component
+- **IMPORTANT**: All illustrations should come from `/packages/gamut-illustrations` - use the design's metadata to match the Figma component name to the illustration component
+- **IMPORTANT**: All icons should come from `/packages/gamut-icons`:
+ - Try to get icon layer names from Figma metadata
+ - If layer names are not available, make your best guess based on the screenshot and verify the icon exists in the codebase
+ - Generate the code with your best guess, then confirm with the user after
+ - Map icon layer names to Gamut components (e.g., "Regular/Interface/PersonIcon" → `PersonIcon` from `@codecademy/gamut-icons`)
+
+## Styling Guidelines - STRICT RULES
+
+### ❌ NEVER Do This:
+
+```tsx
+// NEVER use hardcoded pixel values
+height: 24,
+width: '64px',
+fontSize: 14,
+
+// NEVER use hardcoded hex colors
+color: '#ffffff',
+backgroundColor: '#000000',
+
+// NEVER use CSS properties not in system props
+backdropFilter: 'blur(1px)',
+
+// NEVER use inline styles
+style={{ fontSize: 14 }}
+```
+
+### ✅ ALWAYS Do This:
+
+```tsx
+// ALWAYS use spacing tokens (4, 8, 12, 16, 24, 32, 40, 48, 64, 96)
+height: 24, // from spacing.ts
+width: 64, // from spacing.ts
+
+// ALWAYS use fontSize tokens (14, 16, 18, 20, 22, 26, 34, 44, 64)
+fontSize: 14, // from typography.ts
+
+// ALWAYS use borderRadii tokens (none, sm, md, lg, xl, full)
+borderRadius: 'full', // from borderRadii.ts
+
+// ALWAYS use semantic color tokens
+bg: 'background',
+color: 'text',
+borderColor: 'border',
+
+// ALWAYS use system props via system.css or styled components
+system.css({
+ bg: 'black',
+ color: 'white',
+ borderRadius: 'full',
+})
+```
+
+### Token Mapping Rules:
+
+1. **Spacing/Sizing**: Map Figma values to closest token from `spacing.ts`
+
+ - 4px, 8px, 12px, 16px, 24px, 32px, 40px, 48px, 64px, 96px
+
+2. **Colors**: Use semantic tokens OR core colors from `colors.ts`
+
+ - Semantic: `background`, `text`, `border`, `text-secondary`, etc.
+ - Core: `navy`, `white`, `black`, `blue`, `green`, `red`, `yellow`, etc.
+ - For Background component only: use color names (navy, white, etc.)
+
+3. **Border Radius**: Use tokens from `borderRadii.ts`
+
+ - none (0px), sm (2px), md (4px), lg (8px), xl (16px), full (999px)
+
+4. **Typography**: Use tokens from `typography.ts`
+
+ - fontFamily: `accent`, `base`, `monospace`, `system`
+ - fontSize: 14, 16, 18, 20, 22, 26, 34, 44, 64
+ - fontWeight: 400, 700 or `base`, `title`
+ - lineHeight: `base` (1.5), `title` (1.2), `spacedTitle` (1.3)
+
+5. **If no exact match**: Document in code comment why custom value needed
+
+### Emotion & CSS-in-JS Patterns:
+
+- **IMPORTANT**: Do not use inline styles
+- Use `styled` from `@emotion/styled`
+- Use `system.css()` for style objects
+- Use `styledOptions` for styled component options
+- Compose system props with `variance.compose()`
+
+## Accessibility & Best Practices
+
+- **IMPORTANT**: Follow WCAG requirements for accessibility
+- Always follow best practices from `/packages/styleguide/src/lib/Meta/Best Practices.mdx`
+
+## Implementation
+
+- Use the CodeConnect implementation when available
+- Generate clean, maintainable React code using TypeScript
+- Follow the existing Gamut patterns and conventions
+
+## Post-Generation Validation
+
+After generating code, verify:
+
+- [ ] No hardcoded hex colors (`#` in color values)
+- [ ] No hardcoded pixel strings (`'24px'` format)
+- [ ] All spacing values match tokens from spacing.ts
+- [ ] All colors use semantic tokens or theme colors
+- [ ] All border radius uses borderRadii tokens
+- [ ] Component follows Gamut patterns (variance, system props, styledOptions)
+- [ ] No inline styles
+- [ ] Uses emotion styled components
diff --git a/.prettierignore b/.prettierignore
index 291938f37e6..af4f080d196 100644
--- a/.prettierignore
+++ b/.prettierignore
@@ -5,6 +5,7 @@ node_modules
packages/gamut-icons/src/icons
packages/gamut-styles/**/*.d.ts
packages/styleguide/stories/Core/Atoms/Markdown/*.md
+packages/code-connect/**/*
/.nx/cache
/.nx/workspace-data
diff --git a/figma.config.json b/figma.config.json
new file mode 100644
index 00000000000..aa3e3439256
--- /dev/null
+++ b/figma.config.json
@@ -0,0 +1,7 @@
+{
+ "codeConnect": {
+ "include": ["packages/code-connect/**/*.figma.{tsx,jsx}"],
+ "label": "React",
+ "interactiveSetupFigmaFileUrl": "https://www.figma.com/design/ReGfRNillGABAj5SlITalN/%F0%9F%93%90-Gamut?node-id=23-5&p=f&m=dev"
+ }
+}
diff --git a/packages/code-connect/Atoms/Anchor.figma.tsx b/packages/code-connect/Atoms/Anchor.figma.tsx
new file mode 100644
index 00000000000..9cff9bae583
--- /dev/null
+++ b/packages/code-connect/Atoms/Anchor.figma.tsx
@@ -0,0 +1,35 @@
+import React from 'react';
+import { Anchor } from '@codecademy/gamut';
+import figma from '@figma/code-connect';
+
+/**
+ * -- This file was auto-generated by Code Connect --
+ * `props` includes a mapping from Figma properties and variants to
+ * suggested values. You should update this to match the props of your
+ * code component, and update the `example` function to return the
+ * code example you'd like to see in Figma
+ */
+
+figma.connect(
+ Anchor,
+ 'https://www.figma.com/design/ReGfRNillGABAj5SlITalN/%F0%9F%93%90-Gamut?node-id=19220%3A21856',
+ {
+ props: {
+ children: figma.string('✏️ label'),
+ icon: figma.boolean('👁 leading icon', {
+ true: figma.instance('↳ leading icon'),
+ false: figma.boolean('👁 trailing icon', {
+ true: figma.instance('↳ trailing icon'),
+ false: undefined,
+ }),
+ }),
+ variant: figma.enum('variant', {
+ Inline: 'inline',
+ Interface: 'interface',
+ Standard: 'standard',
+ 'Standard-secondary': 'standard-secondary',
+ }),
+ },
+ example: ({ children, ...props }) => {children},
+ }
+);
diff --git a/packages/code-connect/Atoms/Badge.figma.tsx b/packages/code-connect/Atoms/Badge.figma.tsx
new file mode 100644
index 00000000000..94800ac0f40
--- /dev/null
+++ b/packages/code-connect/Atoms/Badge.figma.tsx
@@ -0,0 +1,36 @@
+import React from 'react';
+import { Badge } from '@codecademy/gamut';
+import figma from '@figma/code-connect';
+
+/**
+ * -- This file was auto-generated by Code Connect --
+ * `props` includes a mapping from Figma properties and variants to
+ * suggested values. You should update this to match the props of your
+ * code component, and update the `example` function to return the
+ * code example you'd like to see in Figma
+ */
+
+figma.connect(
+ Badge,
+ 'https://www.figma.com/design/ReGfRNillGABAj5SlITalN/%F0%9F%93%90-Gamut?node-id=8200%3A8349',
+ {
+ props: {
+ children: figma.string('✏️ label'),
+ icon: figma.instance('↳ icon'),
+ variant: figma.enum('variant', {
+ primary: 'primary',
+ secondary: 'secondary',
+ tertiary: 'tertiary',
+ tertiaryFill: 'tertiaryFill',
+ accent: 'accent',
+ }),
+ size: figma.enum('size', {
+ base: 'base',
+ sm: 'sm',
+ }),
+ },
+ example: ({ children, ...props }: any) => (
+ {children}
+ ),
+ }
+);
diff --git a/packages/code-connect/Atoms/Buttons/CTAButton.figma.tsx b/packages/code-connect/Atoms/Buttons/CTAButton.figma.tsx
new file mode 100644
index 00000000000..f1d1208d72c
--- /dev/null
+++ b/packages/code-connect/Atoms/Buttons/CTAButton.figma.tsx
@@ -0,0 +1,31 @@
+import React from 'react';
+import { CTAButton } from '@codecademy/gamut';
+import figma from '@figma/code-connect';
+
+/**
+ * -- This file was auto-generated by Code Connect --
+ * `props` includes a mapping from Figma properties and variants to
+ * suggested values. You should update this to match the props of your
+ * code component, and update the `example` function to return the
+ * code example you'd like to see in Figma
+ */
+
+figma.connect(
+ CTAButton,
+ 'https://www.figma.com/design/ReGfRNillGABAj5SlITalN/%F0%9F%93%90-Gamut?node-id=1615%3A1914',
+ {
+ props: {
+ children: figma.string('✏️ label'),
+ icon: figma.boolean('👁 leading icon', {
+ true: figma.instance('↳ leading icon'),
+ false: figma.boolean('👁 trailing icon', {
+ true: figma.instance('↳ trailing icon'),
+ false: undefined,
+ }),
+ }),
+ },
+ example: ({ children, ...props }) => (
+ {children}
+ ),
+ }
+);
diff --git a/packages/code-connect/Atoms/Buttons/FillButton.figma.tsx b/packages/code-connect/Atoms/Buttons/FillButton.figma.tsx
new file mode 100644
index 00000000000..84f22e13cfd
--- /dev/null
+++ b/packages/code-connect/Atoms/Buttons/FillButton.figma.tsx
@@ -0,0 +1,41 @@
+import React from 'react';
+import { FillButton } from '@codecademy/gamut';
+import figma from '@figma/code-connect';
+
+/**
+ * -- This file was auto-generated by Code Connect --
+ * `props` includes a mapping from Figma properties and variants to
+ * suggested values. You should update this to match the props of your
+ * code component, and update the `example` function to return the
+ * code example you'd like to see in Figma
+ */
+
+figma.connect(
+ FillButton,
+ 'https://www.figma.com/design/ReGfRNillGABAj5SlITalN/%F0%9F%93%90-Gamut?node-id=1106%3A7',
+ {
+ props: {
+ icon: figma.boolean('👁 leading icon', {
+ true: figma.instance('↳ leading icon'),
+ false: figma.boolean('👁 trailing icon', {
+ true: figma.instance('↳ trailing icon'),
+ false: undefined,
+ }),
+ }),
+ children: figma.string('✏️ label'),
+ variant: figma.enum('variant', {
+ primary: 'primary',
+ secondary: 'secondary',
+ danger: 'danger',
+ }),
+ size: figma.enum('size', {
+ normal: 'normal',
+ small: 'small',
+ large: 'large',
+ }),
+ },
+ example: ({ children, ...props }) => (
+ {children}
+ ),
+ }
+);
diff --git a/packages/code-connect/Atoms/Buttons/IconButton.figma.tsx b/packages/code-connect/Atoms/Buttons/IconButton.figma.tsx
new file mode 100644
index 00000000000..65898b34504
--- /dev/null
+++ b/packages/code-connect/Atoms/Buttons/IconButton.figma.tsx
@@ -0,0 +1,30 @@
+import React from 'react';
+import { IconButton } from '@codecademy/gamut';
+import figma from '@figma/code-connect';
+
+/**
+ * -- This file was auto-generated by Code Connect --
+ * `props` includes a mapping from Figma properties and variants to
+ * suggested values. You should update this to match the props of your
+ * code component, and update the `example` function to return the
+ * code example you'd like to see in Figma
+ */
+
+figma.connect(
+ IconButton,
+ 'https://www.figma.com/design/ReGfRNillGABAj5SlITalN/%F0%9F%93%90-Gamut?node-id=1106%3A90',
+ {
+ props: {
+ icon: figma.instance('icon'),
+ size: figma.enum('size', {
+ normal: 'normal',
+ small: 'small',
+ large: 'large',
+ }),
+ toolTipInfo: figma.nestedProps('tooltip', {
+ tip: figma.textContent('✏️ tooltip'),
+ }),
+ },
+ example: (props) => ,
+ }
+);
diff --git a/packages/code-connect/Atoms/Buttons/StrokeButton.figma.tsx b/packages/code-connect/Atoms/Buttons/StrokeButton.figma.tsx
new file mode 100644
index 00000000000..0d637bc317b
--- /dev/null
+++ b/packages/code-connect/Atoms/Buttons/StrokeButton.figma.tsx
@@ -0,0 +1,41 @@
+import React from 'react';
+import { StrokeButton } from '@codecademy/gamut';
+import figma from '@figma/code-connect';
+
+/**
+ * -- This file was auto-generated by Code Connect --
+ * `props` includes a mapping from Figma properties and variants to
+ * suggested values. You should update this to match the props of your
+ * code component, and update the `example` function to return the
+ * code example you'd like to see in Figma
+ */
+
+figma.connect(
+ StrokeButton,
+ 'https://www.figma.com/design/ReGfRNillGABAj5SlITalN/%F0%9F%93%90-Gamut?node-id=1106%3A48',
+ {
+ props: {
+ children: figma.string('✏️ label'),
+ icon: figma.boolean('👁 leading icon', {
+ true: figma.instance('↳ leading icon'),
+ false: figma.boolean('👁 trailing icon', {
+ true: figma.instance('↳ trailing icon'),
+ false: undefined,
+ }),
+ }),
+ variant: figma.enum('variant', {
+ primary: 'primary',
+ secondary: 'secondary',
+ danger: 'danger',
+ }),
+ size: figma.enum('size', {
+ normal: 'normal',
+ small: 'small',
+ large: 'large',
+ }),
+ },
+ example: ({ children, ...props }) => (
+ {children}
+ ),
+ }
+);
diff --git a/packages/code-connect/Atoms/Buttons/TextButton.figma.tsx b/packages/code-connect/Atoms/Buttons/TextButton.figma.tsx
new file mode 100644
index 00000000000..9bdc3a7e077
--- /dev/null
+++ b/packages/code-connect/Atoms/Buttons/TextButton.figma.tsx
@@ -0,0 +1,36 @@
+import React from 'react';
+import { TextButton } from '@codecademy/gamut';
+import figma from '@figma/code-connect';
+
+/**
+ * -- This file was auto-generated by Code Connect --
+ * `props` includes a mapping from Figma properties and variants to
+ * suggested values. You should update this to match the props of your
+ * code component, and update the `example` function to return the
+ * code example you'd like to see in Figma
+ */
+
+figma.connect(
+ TextButton,
+ 'https://www.figma.com/design/ReGfRNillGABAj5SlITalN/%F0%9F%93%90-Gamut?node-id=1106%3A69',
+ {
+ props: {
+ children: figma.string('✏️ label'),
+ icon: figma.boolean('👁 leading icon', {
+ true: figma.instance('↳ leading icon'),
+ false: figma.boolean('👁 trailing icon', {
+ true: figma.instance('↳ trailing icon'),
+ false: undefined,
+ }),
+ }),
+ size: figma.enum('size', {
+ small: 'small',
+ normal: 'normal',
+ large: 'large',
+ }),
+ },
+ example: ({ children, ...props }) => (
+ {children}
+ ),
+ }
+);
diff --git a/packages/code-connect/Atoms/Card.figma.tsx b/packages/code-connect/Atoms/Card.figma.tsx
new file mode 100644
index 00000000000..a574e45ff0f
--- /dev/null
+++ b/packages/code-connect/Atoms/Card.figma.tsx
@@ -0,0 +1,39 @@
+import React from 'react';
+import { Card } from '@codecademy/gamut';
+import figma from '@figma/code-connect';
+
+/**
+ * -- This file was auto-generated by Code Connect --
+ * `props` includes a mapping from Figma properties and variants to
+ * suggested values. You should update this to match the props of your
+ * code component, and update the `example` function to return the
+ * code example you'd like to see in Figma
+ */
+
+figma.connect(
+ Card,
+ 'https://www.figma.com/design/ReGfRNillGABAj5SlITalN/%F0%9F%93%90-Gamut?node-id=20111%3A63391',
+ {
+ props: {
+ variant: figma.enum('variant', {
+ Default: 'default',
+ White: 'white',
+ Yellow: 'yellow',
+ Beige: 'beige',
+ Navy: 'navy',
+ Hyper: 'hyper',
+ }),
+ shadow: figma.enum('shadow', {
+ 'pattern-right': 'patternRight',
+ 'pattern-left': 'patternLeft',
+ outline: 'outline',
+ none: 'none',
+ }),
+ isInteractive: figma.boolean('isInteractive'),
+ children: figma.children('.Card Content'),
+ },
+ example: ({ children, ...props }) => (
+ {children}
+ ),
+ }
+);
diff --git a/packages/code-connect/Atoms/Drawer.figma.tsx b/packages/code-connect/Atoms/Drawer.figma.tsx
new file mode 100644
index 00000000000..94f66523b75
--- /dev/null
+++ b/packages/code-connect/Atoms/Drawer.figma.tsx
@@ -0,0 +1,29 @@
+import React from 'react';
+import { Drawer } from '@codecademy/gamut';
+import figma from '@figma/code-connect';
+
+/**
+ * -- This file was auto-generated by Code Connect --
+ * `props` includes a mapping from Figma properties and variants to
+ * suggested values. You should update this to match the props of your
+ * code component, and update the `example` function to return the
+ * code example you'd like to see in Figma
+ */
+
+figma.connect(
+ Drawer,
+ 'https://www.figma.com/design/ReGfRNillGABAj5SlITalN/%F0%9F%93%90-Gamut?node-id=115820-91241',
+ {
+ props: {
+ alignContentContainer: figma.enum('alignContentContainer', {
+ left: 'left',
+ right: 'right',
+ }),
+ expanded: true,
+ children: figma.textContent('text'),
+ },
+ example: ({ children, ...props }) => (
+ {children}
+ ),
+ }
+);
diff --git a/packages/code-connect/Atoms/FeatureShimmer.figma.tsx b/packages/code-connect/Atoms/FeatureShimmer.figma.tsx
new file mode 100644
index 00000000000..192c8768a1e
--- /dev/null
+++ b/packages/code-connect/Atoms/FeatureShimmer.figma.tsx
@@ -0,0 +1,22 @@
+import React from 'react';
+import { FeatureShimmer } from '@codecademy/gamut';
+import figma from '@figma/code-connect';
+
+/**
+ * -- This file was auto-generated by Code Connect --
+ * `props` includes a mapping from Figma properties and variants to
+ * suggested values. You should update this to match the props of your
+ * code component, and update the `example` function to return the
+ * code example you'd like to see in Figma
+ */
+
+figma.connect(
+ FeatureShimmer,
+ 'https://www.figma.com/design/ReGfRNillGABAj5SlITalN/%F0%9F%93%90-Gamut?node-id=61568%3A44253',
+ {
+ props: {
+ children: '{children}',
+ },
+ example: (props) => {props.children},
+ }
+);
diff --git a/packages/code-connect/Atoms/FormGroup.figma.tsx b/packages/code-connect/Atoms/FormGroup.figma.tsx
new file mode 100644
index 00000000000..0ea9584300f
--- /dev/null
+++ b/packages/code-connect/Atoms/FormGroup.figma.tsx
@@ -0,0 +1,60 @@
+import React from 'react';
+import { FormGroup } from '@codecademy/gamut';
+import figma from '@figma/code-connect';
+
+/**
+ * -- This file was auto-generated by Code Connect --
+ * `props` includes a mapping from Figma properties and variants to
+ * suggested values. You should update this to match the props of your
+ * code component, and update the `example` function to return the
+ * code example you'd like to see in Figma
+ */
+
+figma.connect(
+ FormGroup,
+ 'https://www.figma.com/design/ReGfRNillGABAj5SlITalN/%F0%9F%93%90-Gamut?node-id=47031%3A18018',
+ {
+ props: {
+ label: figma.string('✏️ label'),
+ infoTip: figma.boolean('infoTip'),
+ required: figma.boolean('required'),
+ labelSize: figma.enum('size', {
+ small: 'small',
+ large: 'large',
+ }),
+ infoTipData: figma.nestedProps('infotip', {
+ emphasis: figma.enum('emphasis', { low: 'low', high: 'high' }),
+ disabled: figma.enum('state', {
+ default: false,
+ hover: false,
+ active: false,
+ focus: false,
+ disabled: true,
+ }),
+ }),
+ description: figma.boolean('description', {
+ true: figma.textContent('description'),
+ }),
+ toolTipInfo: figma.nestedProps('.infotip-alignment', {
+ alignment: figma.enum('alignment', {
+ 'top-left': 'top-left',
+ 'top-right': 'top-right',
+ 'bottom-left': 'bottom-left',
+ 'bottom-right': 'bottom-right',
+ }),
+ info: figma.textContent('✏️ tip'),
+ }),
+ },
+ example: (props) => (
+
+ ),
+ }
+);
diff --git a/packages/code-connect/Atoms/FormInputs/Checkbox.figma.tsx b/packages/code-connect/Atoms/FormInputs/Checkbox.figma.tsx
new file mode 100644
index 00000000000..1be7cb6c9f5
--- /dev/null
+++ b/packages/code-connect/Atoms/FormInputs/Checkbox.figma.tsx
@@ -0,0 +1,35 @@
+import React from 'react';
+import { Checkbox } from '@codecademy/gamut';
+import figma from '@figma/code-connect';
+
+/**
+ * -- This file was auto-generated by Code Connect --
+ * `props` includes a mapping from Figma properties and variants to
+ * suggested values. You should update this to match the props of your
+ * code component, and update the `example` function to return the
+ * code example you'd like to see in Figma
+ */
+
+figma.connect(
+ Checkbox,
+ 'https://www.figma.com/design/ReGfRNillGABAj5SlITalN/%F0%9F%93%90-Gamut?node-id=1199%3A270',
+ {
+ props: {
+ label: figma.string('✏️ label'),
+ checked: figma.enum('checked', {
+ true: 'true',
+ false: 'false',
+ Indeterminate: 'false',
+ }),
+ indeterminate: figma.enum('checked', {
+ true: 'false',
+ false: 'false',
+ Indeterminate: 'true',
+ }),
+ ariaLabel: figma.string('✏️ label'),
+ },
+ example: ({ ariaLabel, ...props }) => (
+
+ ),
+ }
+);
diff --git a/packages/code-connect/Atoms/FormInputs/Input.figma.tsx b/packages/code-connect/Atoms/FormInputs/Input.figma.tsx
new file mode 100644
index 00000000000..af178e9c102
--- /dev/null
+++ b/packages/code-connect/Atoms/FormInputs/Input.figma.tsx
@@ -0,0 +1,124 @@
+import React from 'react';
+import { Input } from '@codecademy/gamut';
+import figma from '@figma/code-connect';
+
+/**
+ * -- This file was auto-generated by Code Connect --
+ * `props` includes a mapping from Figma properties and variants to
+ * suggested values. You should update this to match the props of your
+ * code component, and update the `example` function to return the
+ * code example you'd like to see in Figma
+ */
+
+figma.connect(
+ Input,
+ 'https://www.figma.com/design/ReGfRNillGABAj5SlITalN/%F0%9F%93%90-Gamut?node-id=1189%3A590',
+ {
+ props: {
+ type: figma.enum('type', {
+ text: 'text',
+ number: 'number',
+ file: 'file',
+ }),
+ size: figma.enum('size', {
+ base: 'base',
+ small: 'small',
+ }),
+ error: figma.enum('state', {
+ error: true,
+ 'error + hover': true,
+ 'error + focus': true,
+ 'filled + error': true,
+ 'filled + error + hover': true,
+ 'filled + error + focus': true,
+ }),
+ valid: figma.enum('state', {
+ valid: true,
+ 'valid + hover': true,
+ 'valid + focus': true,
+ 'filled + valid': true,
+ 'filled + valid + focus': true,
+ 'filled + valid + hover': true,
+ }),
+ disabled: figma.enum('state', {
+ disabled: true,
+ 'filled + disabled': true,
+ }),
+ placeholder: figma.boolean('placeholder', {
+ true: figma.enum('state', {
+ enabled: figma.enum('type', {
+ text: figma.textContent('placeholder'),
+ number: figma.textContent('placeholder'),
+ }),
+ hover: figma.enum('type', {
+ text: figma.textContent('placeholder'),
+ number: figma.textContent('placeholder'),
+ }),
+ focus: figma.enum('type', {
+ text: figma.textContent('placeholder'),
+ number: figma.textContent('placeholder'),
+ }),
+ error: figma.enum('type', {
+ text: figma.textContent('placeholder'),
+ number: figma.textContent('placeholder'),
+ }),
+ 'error + hover': figma.enum('type', {
+ text: figma.textContent('placeholder'),
+ number: figma.textContent('placeholder'),
+ }),
+ 'error + focus': figma.enum('type', {
+ text: figma.textContent('placeholder'),
+ number: figma.textContent('placeholder'),
+ }),
+ disabled: figma.enum('type', {
+ text: figma.textContent('placeholder'),
+ number: figma.textContent('placeholder'),
+ }),
+ }),
+ }),
+ defaultValue: figma.enum('state', {
+ filled: figma.enum('type', {
+ text: figma.string('input'),
+ number: figma.string('number'),
+ }),
+ 'filled + hover': figma.enum('type', {
+ text: figma.string('input'),
+ number: figma.string('number'),
+ }),
+ 'filled + focus': figma.enum('type', {
+ text: figma.string('input'),
+ number: figma.string('number'),
+ }),
+ 'filled + valid': figma.enum('type', {
+ text: figma.string('input'),
+ number: figma.string('number'),
+ }),
+ 'filled + valid + hover': figma.enum('type', {
+ text: figma.string('input'),
+ number: figma.string('number'),
+ }),
+ 'filled + valid + focus': figma.enum('type', {
+ text: figma.string('input'),
+ number: figma.string('number'),
+ }),
+ 'filled + error': figma.enum('type', {
+ text: figma.string('input'),
+ number: figma.string('number'),
+ }),
+ 'filled + error + hover': figma.enum('type', {
+ text: figma.string('input'),
+ number: figma.string('number'),
+ }),
+ 'filled + error + focus': figma.enum('type', {
+ text: figma.string('input'),
+ number: figma.string('number'),
+ }),
+ 'filled + disabled': figma.enum('type', {
+ text: figma.string('input'),
+ number: figma.string('number'),
+ }),
+ }),
+ },
+ example: (props) => ,
+ }
+);
diff --git a/packages/code-connect/Atoms/FormInputs/Radio.figma.tsx b/packages/code-connect/Atoms/FormInputs/Radio.figma.tsx
new file mode 100644
index 00000000000..49e1609899d
--- /dev/null
+++ b/packages/code-connect/Atoms/FormInputs/Radio.figma.tsx
@@ -0,0 +1,64 @@
+import React from 'react';
+import { Radio } from '@codecademy/gamut';
+import figma from '@figma/code-connect';
+
+/**
+ * -- This file was auto-generated by Code Connect --
+ * `props` includes a mapping from Figma properties and variants to
+ * suggested values. You should update this to match the props of your
+ * code component, and update the `example` function to return the
+ * code example you'd like to see in Figma
+ */
+
+figma.connect(
+ Radio,
+ 'https://www.figma.com/design/ReGfRNillGABAj5SlITalN/%F0%9F%93%90-Gamut?node-id=1191%3A1622',
+ {
+ props: {
+ label: figma.string('✏️ label'),
+ checked: figma.boolean('selected'),
+ disabled: figma.enum('state', {
+ enabled: false,
+ hover: false,
+ active: false,
+ focus: false,
+ error: false,
+ disabled: true,
+ }),
+ error: figma.enum('state', {
+ enabled: false,
+ hover: false,
+ active: false,
+ focus: false,
+ error: true,
+ disabled: false,
+ }),
+ hasInfotip: figma.boolean('infoTip', {
+ true: true,
+ false: false,
+ }),
+ hasEmphasis: figma.nestedProps('infotip', {
+ emphasis: figma.enum('emphasis', { low: 'low', high: 'high' }),
+ }),
+ toolTipInfo: figma.nestedProps('.infotip-alignment', {
+ alignment: figma.enum('alignment', {
+ 'top-left': 'top-left',
+ 'top-right': 'top-right',
+ 'bottom-left': 'bottom-left',
+ 'bottom-right': 'bottom-right',
+ }),
+ info: figma.string('✏️ info tip'),
+ }),
+ },
+ example: (props) => (
+
+ ),
+ }
+);
diff --git a/packages/code-connect/Atoms/FormInputs/Select.figma.tsx b/packages/code-connect/Atoms/FormInputs/Select.figma.tsx
new file mode 100644
index 00000000000..b0923781cec
--- /dev/null
+++ b/packages/code-connect/Atoms/FormInputs/Select.figma.tsx
@@ -0,0 +1,51 @@
+import React from 'react';
+import { Select } from '@codecademy/gamut';
+import figma from '@figma/code-connect';
+
+/**
+ * -- This file was auto-generated by Code Connect --
+ * `props` includes a mapping from Figma properties and variants to
+ * suggested values. You should update this to match the props of your
+ * code component, and update the `example` function to return the
+ * code example you'd like to see in Figma
+ */
+
+figma.connect(
+ Select,
+ 'https://www.figma.com/design/ReGfRNillGABAj5SlITalN/%F0%9F%93%90-Gamut?node-id=70050%3A14802',
+ {
+ props: {
+ sizeVariant: figma.enum('sizeVariant', {
+ base: 'base',
+ small: 'small',
+ }),
+ disabled: figma.enum('state', {
+ Enabled: false,
+ Hover: false,
+ Focus: false,
+ Active: false,
+ Filled: false,
+ 'Filled + Hover': false,
+ 'Filled + Focus': false,
+ 'Filled + Active': false,
+ Error: false,
+ Disabled: true,
+ }),
+ error: figma.enum('state', {
+ Enabled: false,
+ Hover: false,
+ Focus: false,
+ Active: false,
+ Filled: false,
+ 'Filled + Hover': false,
+ 'Filled + Focus': false,
+ 'Filled + Active': false,
+ Error: true,
+ Disabled: false,
+ }),
+ options: figma.children('*'),
+ defaultValue: figma.string('selection'),
+ },
+ example: (props) => ,
+ }
+);
diff --git a/packages/code-connect/Atoms/FormInputs/SelectDropdown.figma.tsx b/packages/code-connect/Atoms/FormInputs/SelectDropdown.figma.tsx
new file mode 100644
index 00000000000..1e0fbb1e34e
--- /dev/null
+++ b/packages/code-connect/Atoms/FormInputs/SelectDropdown.figma.tsx
@@ -0,0 +1,45 @@
+import React from 'react';
+import { SelectDropdown } from '@codecademy/gamut';
+import figma from '@figma/code-connect';
+
+/**
+ * -- This file was auto-generated by Code Connect --
+ * `props` includes a mapping from your code props to Figma properties.
+ * You should check this is correct, and update the `example` function
+ * to return the code example you'd like to see in Figma
+ */
+
+figma.connect(
+ SelectDropdown,
+ 'https://www.figma.com/design/ReGfRNillGABAj5SlITalN/%F0%9F%93%90-Gamut?node-id=1487%3A1657',
+ {
+ props: {
+ disabled: figma.enum('state', {
+ Disabled: true,
+ }),
+ error: figma.enum('state', {
+ Error: true,
+ }),
+ size: figma.enum('size', {
+ small: 'small',
+ medium: 'medium',
+ }),
+ options: figma.children('option-*'),
+ placeholder: figma.enum('state', {
+ Enabled: figma.textContent('placeholder'),
+ Hover: figma.textContent('placeholder'),
+ Focus: figma.textContent('placeholder'),
+ Active: figma.textContent('placeholder'),
+ }),
+ defaultValue: figma.enum('state', {
+ Filled: figma.textContent('selection'),
+ 'Filled + Hover': figma.textContent('selection'),
+ 'Filled + Focus': figma.textContent('selection'),
+ 'Filled + Active': figma.textContent('selection'),
+ Error: figma.textContent('selection'),
+ Disabled: figma.textContent('selection'),
+ }),
+ },
+ example: (props) => ,
+ }
+);
diff --git a/packages/code-connect/Atoms/FormInputs/TextArea.figma.tsx b/packages/code-connect/Atoms/FormInputs/TextArea.figma.tsx
new file mode 100644
index 00000000000..4545ce17bfe
--- /dev/null
+++ b/packages/code-connect/Atoms/FormInputs/TextArea.figma.tsx
@@ -0,0 +1,57 @@
+import React from 'react';
+import { TextArea } from '@codecademy/gamut';
+import figma from '@figma/code-connect';
+
+/**
+ * -- This file was auto-generated by Code Connect --
+ * `props` includes a mapping from Figma properties and variants to
+ * suggested values. You should update this to match the props of your
+ * code component, and update the `example` function to return the
+ * code example you'd like to see in Figma
+ */
+
+figma.connect(
+ TextArea,
+ 'https://www.figma.com/design/ReGfRNillGABAj5SlITalN/%F0%9F%93%90-Gamut?node-id=1484%3A141',
+ {
+ props: {
+ disabled: figma.enum('state', {
+ Enabled: false,
+ Inactive: false,
+ Hover: false,
+ Focus: false,
+ Error: false,
+ Disabled: true,
+ }),
+ error: figma.enum('state', {
+ Enabled: false,
+ Inactive: false,
+ Hover: false,
+ Focus: false,
+ Error: true,
+ Disabled: false,
+ }),
+ defaultValue: figma.enum('state', {
+ filled: figma.textContent('input'),
+ 'filled + hover': figma.textContent('input'),
+ 'filled + focus': figma.textContent('input'),
+ error: figma.textContent('input'),
+ 'error + focus': figma.textContent('input'),
+ }),
+ placeholder: figma.enum('state', {
+ enabled: figma.textContent('placeholder'),
+ hover: figma.textContent('placeholder'),
+ focus: figma.textContent('placeholder'),
+ disabled: figma.textContent('placeholder'),
+ }),
+ rows: figma.enum('rows', {
+ '2': 2,
+ '3': 3,
+ '4': 4,
+ '5': 5,
+ '6': 6,
+ }),
+ },
+ example: (props) => ,
+ }
+);
diff --git a/packages/code-connect/Atoms/Loaders/Shimmer.figma.tsx b/packages/code-connect/Atoms/Loaders/Shimmer.figma.tsx
new file mode 100644
index 00000000000..5094347d360
--- /dev/null
+++ b/packages/code-connect/Atoms/Loaders/Shimmer.figma.tsx
@@ -0,0 +1,20 @@
+import React from 'react';
+import { Shimmer } from '@codecademy/gamut';
+import figma from '@figma/code-connect';
+
+/**
+ * -- This file was auto-generated by Code Connect --
+ * None of your props could be automatically mapped to Figma properties.
+ * You should update the `props` object to include a mapping from your
+ * code props to Figma properties, and update the `example` function to
+ * return the code example you'd like to see in Figma
+ */
+
+figma.connect(
+ Shimmer,
+ 'https://www.figma.com/design/ReGfRNillGABAj5SlITalN/%F0%9F%93%90-Gamut?node-id=7498-5884&m=dev',
+ {
+ props: {},
+ example: (props) => ,
+ }
+);
diff --git a/packages/code-connect/Atoms/Loaders/Spinner.figma.tsx b/packages/code-connect/Atoms/Loaders/Spinner.figma.tsx
new file mode 100644
index 00000000000..1f2de50eb01
--- /dev/null
+++ b/packages/code-connect/Atoms/Loaders/Spinner.figma.tsx
@@ -0,0 +1,20 @@
+import React from 'react';
+import { Spinner } from '@codecademy/gamut';
+import figma from '@figma/code-connect';
+
+/**
+ * -- This file was auto-generated by Code Connect --
+ * None of your props could be automatically mapped to Figma properties.
+ * You should update the `props` object to include a mapping from your
+ * code props to Figma properties, and update the `example` function to
+ * return the code example you'd like to see in Figma
+ */
+
+figma.connect(
+ Spinner,
+ 'https://www.figma.com/design/ReGfRNillGABAj5SlITalN/%F0%9F%93%90-Gamut?node-id=2141%3A3902',
+ {
+ props: {},
+ example: (props) => ,
+ }
+);
diff --git a/packages/code-connect/Atoms/ProgressBar.figma.tsx b/packages/code-connect/Atoms/ProgressBar.figma.tsx
new file mode 100644
index 00000000000..53a61cd191b
--- /dev/null
+++ b/packages/code-connect/Atoms/ProgressBar.figma.tsx
@@ -0,0 +1,47 @@
+import React from 'react';
+import { ProgressBar } from '@codecademy/gamut';
+import figma from '@figma/code-connect';
+
+/**
+ * -- This file was auto-generated by Code Connect --
+ * None of your props could be automatically mapped to Figma properties.
+ * You should update the `props` object to include a mapping from your
+ * code props to Figma properties, and update the `example` function to
+ * return the code example you'd like to see in Figma
+ */
+
+figma.connect(
+ ProgressBar,
+ 'https://www.figma.com/design/ReGfRNillGABAj5SlITalN/%F0%9F%93%90-Gamut?node-id=18640%3A20613',
+ {
+ props: {
+ variant: figma.enum('variant', {
+ default: 'default',
+ yellow: 'yellow',
+ blue: 'blue',
+ }),
+ size: figma.enum('size', {
+ Small: 'small',
+ Medium: 'medium',
+ Large: 'large',
+ XL: 'xl',
+ }),
+ percent: figma.enum('percent', {
+ '0%': 0,
+ '25%': 25,
+ '50%': 50,
+ '75%': 75,
+ '100%': 100,
+ }),
+ flat: figma.enum('flat', {
+ 'flat-top': 'flat-top',
+ 'flat-bottom': 'flat-bottom',
+ }),
+ pattern: figma.boolean('pattern', {
+ true: figma.children('.pattern-background'),
+ false: undefined,
+ }),
+ },
+ example: (props) => ,
+ }
+);
diff --git a/packages/code-connect/Atoms/RadialProgress.figma.tsx b/packages/code-connect/Atoms/RadialProgress.figma.tsx
new file mode 100644
index 00000000000..69cf9776c69
--- /dev/null
+++ b/packages/code-connect/Atoms/RadialProgress.figma.tsx
@@ -0,0 +1,60 @@
+import React from 'react';
+import { RadialProgress } from '@codecademy/gamut';
+import figma from '@figma/code-connect';
+
+/**
+ * -- This file was auto-generated by Code Connect --
+ * `props` includes a mapping from your code props to Figma properties.
+ * You should check this is correct, and update the `example` function
+ * to return the code example you'd like to see in Figma
+ */
+
+figma.connect(
+ RadialProgress,
+ 'https://www.figma.com/design/ReGfRNillGABAj5SlITalN/%F0%9F%93%90-Gamut?node-id=19788%3A33606',
+ {
+ props: {
+ strokeLinecap: figma.enum('strokeLinecap', {
+ round: 'round',
+ butt: 'butt',
+ square: 'square',
+ }),
+ baseColor: figma.enum('color', {
+ text: 'text',
+ 'yellow-500': 'yellow-500',
+ }),
+ value: figma.enum('value', {
+ '0%': 0,
+ '10%': 10,
+ '20%': 20,
+ '30%': 30,
+ '40%': 40,
+ '50%': 50,
+ '60%': 60,
+ '70%': 70,
+ '80%': 80,
+ '90%': 90,
+ '100%': 100,
+ }),
+ children: figma.boolean('children', {
+ true: figma.enum('value', {
+ '0%': 0,
+ '10%': 10,
+ '20%': 20,
+ '30%': 30,
+ '40%': 40,
+ '50%': 50,
+ '60%': 60,
+ '70%': 70,
+ '80%': 80,
+ '90%': 90,
+ '100%': 100,
+ }),
+ false: undefined,
+ }),
+ },
+ example: ({ children, ...props }) => (
+ {children}
+ ),
+ }
+);
diff --git a/packages/code-connect/Atoms/SkipToContent.figma.tsx b/packages/code-connect/Atoms/SkipToContent.figma.tsx
new file mode 100644
index 00000000000..493e9ef5394
--- /dev/null
+++ b/packages/code-connect/Atoms/SkipToContent.figma.tsx
@@ -0,0 +1,22 @@
+import React from 'react';
+import { SkipToContent } from '@codecademy/gamut';
+import figma from '@figma/code-connect';
+
+/**
+ * -- This file was auto-generated by Code Connect --
+ * None of your props could be automatically mapped to Figma properties.
+ * You should update the `props` object to include a mapping from your
+ * code props to Figma properties, and update the `example` function to
+ * return the code example you'd like to see in Figma
+ */
+
+figma.connect(
+ SkipToContent,
+ 'https://www.figma.com/design/ReGfRNillGABAj5SlITalN/%F0%9F%93%90-Gamut?node-id=18679%3A19731',
+ {
+ props: {
+ contentId: 'id-of-where-to-skip-to',
+ },
+ example: (props) => ,
+ }
+);
diff --git a/packages/code-connect/Atoms/Tag/TagNavigation.figma.tsx b/packages/code-connect/Atoms/Tag/TagNavigation.figma.tsx
new file mode 100644
index 00000000000..bd9a7a265eb
--- /dev/null
+++ b/packages/code-connect/Atoms/Tag/TagNavigation.figma.tsx
@@ -0,0 +1,31 @@
+import React from 'react';
+import { Tag } from '@codecademy/gamut';
+import figma from '@figma/code-connect';
+
+/**
+ * -- This file was auto-generated by Code Connect --
+ * `props` includes a mapping from Figma properties and variants to
+ * suggested values. You should update this to match the props of your
+ * code component, and update the `example` function to return the
+ * code example you'd like to see in Figma
+ */
+
+figma.connect(
+ Tag,
+ 'https://www.figma.com/design/ReGfRNillGABAj5SlITalN/%F0%9F%93%90-Gamut?node-id=62903-98779',
+ {
+ props: {
+ children: figma.string('label'),
+ icon: figma.boolean('leading icon', {
+ true: figma.instance('↳ leading icon'),
+ false: undefined,
+ }),
+ variant: 'navigation',
+ size: figma.enum('size', {
+ default: 'default',
+ large: 'large',
+ }),
+ },
+ example: ({ children, ...props }) => {children},
+ }
+);
diff --git a/packages/code-connect/Atoms/Tag/TagReadOnly.figma.tsx b/packages/code-connect/Atoms/Tag/TagReadOnly.figma.tsx
new file mode 100644
index 00000000000..12726feea7f
--- /dev/null
+++ b/packages/code-connect/Atoms/Tag/TagReadOnly.figma.tsx
@@ -0,0 +1,31 @@
+import React from 'react';
+import { Tag } from '@codecademy/gamut';
+import figma from '@figma/code-connect';
+
+/**
+ * -- This file was auto-generated by Code Connect --
+ * `props` includes a mapping from Figma properties and variants to
+ * suggested values. You should update this to match the props of your
+ * code component, and update the `example` function to return the
+ * code example you'd like to see in Figma
+ */
+
+figma.connect(
+ Tag,
+ 'https://www.figma.com/design/ReGfRNillGABAj5SlITalN/%F0%9F%93%90-Gamut?node-id=62975-85581',
+ {
+ props: {
+ children: figma.string('label'),
+ icon: figma.boolean('leading icon', {
+ true: figma.instance('↳ leading icon'),
+ false: undefined,
+ }),
+ variant: 'readOnly',
+ size: figma.enum('size', {
+ default: 'default',
+ large: 'large',
+ }),
+ },
+ example: ({ children, ...props }) => {children},
+ }
+);
diff --git a/packages/code-connect/Atoms/Tag/TagSelection.figma.tsx b/packages/code-connect/Atoms/Tag/TagSelection.figma.tsx
new file mode 100644
index 00000000000..8b1c7918970
--- /dev/null
+++ b/packages/code-connect/Atoms/Tag/TagSelection.figma.tsx
@@ -0,0 +1,31 @@
+import React from 'react';
+import { Tag } from '@codecademy/gamut';
+import figma from '@figma/code-connect';
+
+/**
+ * -- This file was auto-generated by Code Connect --
+ * `props` includes a mapping from Figma properties and variants to
+ * suggested values. You should update this to match the props of your
+ * code component, and update the `example` function to return the
+ * code example you'd like to see in Figma
+ */
+
+figma.connect(
+ Tag,
+ 'https://www.figma.com/design/ReGfRNillGABAj5SlITalN/%F0%9F%93%90-Gamut?node-id=50740-63246',
+ {
+ props: {
+ children: figma.string('label'),
+ icon: figma.boolean('leading icon', {
+ true: figma.instance('↳ leading icon'),
+ false: undefined,
+ }),
+ variant: 'selection',
+ size: figma.enum('size', {
+ default: 'default',
+ large: 'large',
+ }),
+ },
+ example: ({ children, ...props }) => {children},
+ }
+);
diff --git a/packages/code-connect/Atoms/Tag/TagSuggestion.figma.tsx b/packages/code-connect/Atoms/Tag/TagSuggestion.figma.tsx
new file mode 100644
index 00000000000..f3ebe0abf6f
--- /dev/null
+++ b/packages/code-connect/Atoms/Tag/TagSuggestion.figma.tsx
@@ -0,0 +1,31 @@
+import React from 'react';
+import { Tag } from '@codecademy/gamut';
+import figma from '@figma/code-connect';
+
+/**
+ * -- This file was auto-generated by Code Connect --
+ * `props` includes a mapping from Figma properties and variants to
+ * suggested values. You should update this to match the props of your
+ * code component, and update the `example` function to return the
+ * code example you'd like to see in Figma
+ */
+
+figma.connect(
+ Tag,
+ 'https://www.figma.com/design/ReGfRNillGABAj5SlITalN/%F0%9F%93%90-Gamut?node-id=62903-98892',
+ {
+ props: {
+ children: figma.string('label'),
+ icon: figma.boolean('leading icon', {
+ true: figma.instance('↳ leading icon'),
+ false: undefined,
+ }),
+ variant: 'suggestion',
+ size: figma.enum('size', {
+ default: 'default',
+ large: 'large',
+ }),
+ },
+ example: ({ children, ...props }) => {children},
+ }
+);
diff --git a/packages/code-connect/Atoms/Toggle.figma.tsx b/packages/code-connect/Atoms/Toggle.figma.tsx
new file mode 100644
index 00000000000..39678991d74
--- /dev/null
+++ b/packages/code-connect/Atoms/Toggle.figma.tsx
@@ -0,0 +1,27 @@
+import React from 'react';
+import { Toggle } from '@codecademy/gamut';
+import figma from '@figma/code-connect';
+
+/**
+ * -- This file was auto-generated by Code Connect --
+ * `props` includes a mapping from Figma properties and variants to
+ * suggested values. You should update this to match the props of your
+ * code component, and update the `example` function to return the
+ * code example you'd like to see in Figma
+ */
+
+figma.connect(
+ Toggle,
+ 'https://www.figma.com/design/ReGfRNillGABAj5SlITalN/%F0%9F%93%90-Gamut?node-id=11329%3A18970',
+ {
+ props: {
+ size: figma.enum('size', {
+ Medium: 'medium',
+ Small: 'small',
+ }),
+ checked: figma.boolean('checked'),
+ disabled: figma.boolean('disabled'),
+ },
+ example: (props) => ,
+ }
+);
diff --git a/packages/code-connect/Molecules/Alert.figma.tsx b/packages/code-connect/Molecules/Alert.figma.tsx
new file mode 100644
index 00000000000..cbc89336211
--- /dev/null
+++ b/packages/code-connect/Molecules/Alert.figma.tsx
@@ -0,0 +1,48 @@
+import React from 'react';
+import { Alert } from '@codecademy/gamut';
+import figma from '@figma/code-connect';
+
+/**
+ * -- This file was auto-generated by Code Connect --
+ * `props` includes a mapping from Figma properties and variants to
+ * suggested values. You should update this to match the props of your
+ * code component, and update the `example` function to return the
+ * code example you'd like to see in Figma
+ */
+
+figma.connect(
+ Alert,
+ 'https://www.figma.com/design/ReGfRNillGABAj5SlITalN/%F0%9F%93%90-Gamut?node-id=27627-31065',
+ {
+ props: {
+ type: figma.enum('type', {
+ general: 'info',
+ success: 'success',
+ error: 'error',
+ subtle: 'subtle',
+ warning: 'warning',
+ feature: 'feature',
+ }),
+ onClose: figma.boolean('dismissible', {
+ true: () => {
+ // Dismiss logic goes here
+ },
+ false: undefined,
+ }),
+ cta: figma.boolean('CTA', {
+ true: 'Learn more',
+ false: undefined,
+ }),
+ children: figma.textContent('text'),
+ placement: figma.enum('placement', {
+ inline: 'inline',
+ floating: 'floating',
+ }),
+ },
+ example: ({ children, ...props }) => (
+
+ {children}
+
+ ),
+ }
+);
diff --git a/packages/code-connect/Molecules/Breadcrumbs.figma.tsx b/packages/code-connect/Molecules/Breadcrumbs.figma.tsx
new file mode 100644
index 00000000000..2dae64a15df
--- /dev/null
+++ b/packages/code-connect/Molecules/Breadcrumbs.figma.tsx
@@ -0,0 +1,163 @@
+import React from 'react';
+import { Breadcrumbs } from '@codecademy/gamut';
+import figma from '@figma/code-connect';
+
+/**
+ * -- This file was auto-generated by Code Connect --
+ * `props` includes a mapping from Figma properties and variants to
+ * suggested values. You should update this to match the props of your
+ * code component, and update the `example` function to return the
+ * code example you'd like to see in Figma
+ */
+
+figma.connect(
+ Breadcrumbs,
+ 'https://www.figma.com/design/ReGfRNillGABAj5SlITalN/%F0%9F%93%90-Gamut?node-id=54229%3A24977',
+ {
+ props: {
+ crumbs: figma.boolean('crumb-1', {
+ true: figma.boolean('crumb-2', {
+ true: figma.boolean('crumb-3', {
+ true: [
+ {
+ href: '/homepage',
+ title: 'Home',
+ },
+ {
+ href: '/crumb-1',
+ title: 'There',
+ },
+ {
+ href: '/crumb-2',
+ title: 'There',
+ },
+ {
+ href: '/crumb-3',
+ title: 'There',
+ },
+ {
+ href: '/current-page',
+ title: 'Here',
+ },
+ ],
+ false: [
+ {
+ href: '/homepage',
+ title: 'Home',
+ },
+ {
+ href: '/crumb-1',
+ title: 'There',
+ },
+ {
+ href: '/crumb-2',
+ title: 'There',
+ },
+ {
+ href: '/current-page',
+ title: 'Here',
+ },
+ ],
+ }),
+ false: figma.boolean('crumb-3', {
+ true: [
+ {
+ href: '/homepage',
+ title: 'Home',
+ },
+ {
+ href: '/crumb-1',
+ title: 'There',
+ },
+ {
+ href: '/crumb-3',
+ title: 'There',
+ },
+ {
+ href: '/current-page',
+ title: 'Here',
+ },
+ ],
+ false: [
+ {
+ href: '/homepage',
+ title: 'Home',
+ },
+ {
+ href: '/crumb-1',
+ title: 'There',
+ },
+ {
+ href: '/current-page',
+ title: 'Here',
+ },
+ ],
+ }),
+ }),
+ false: figma.boolean('crumb-2', {
+ true: figma.boolean('crumb-3', {
+ true: [
+ {
+ href: '/homepage',
+ title: 'Home',
+ },
+ {
+ href: '/crumb-2',
+ title: 'There',
+ },
+ {
+ href: '/crumb-3',
+ title: 'There',
+ },
+ {
+ href: '/current-page',
+ title: 'Here',
+ },
+ ],
+ false: [
+ {
+ href: '/homepage',
+ title: 'Home',
+ },
+ {
+ href: '/crumb-2',
+ title: 'There',
+ },
+ {
+ href: '/current-page',
+ title: 'Here',
+ },
+ ],
+ }),
+ false: figma.boolean('crumb-3', {
+ true: [
+ {
+ href: '/homepage',
+ title: 'Home',
+ },
+ {
+ href: '/crumb-3',
+ title: 'There',
+ },
+ {
+ href: '/current-page',
+ title: 'Here',
+ },
+ ],
+ false: [
+ {
+ href: '/homepage',
+ title: 'Home',
+ },
+ {
+ href: '/current-page',
+ title: 'Here',
+ },
+ ],
+ }),
+ }),
+ }),
+ },
+ example: (props) => ,
+ }
+);
diff --git a/packages/code-connect/Molecules/Coachmark.figma.tsx b/packages/code-connect/Molecules/Coachmark.figma.tsx
new file mode 100644
index 00000000000..f7e9e96061c
--- /dev/null
+++ b/packages/code-connect/Molecules/Coachmark.figma.tsx
@@ -0,0 +1,54 @@
+import React from 'react';
+import { Box, Coachmark, Text, TextButton, FlexBox } from '@codecademy/gamut';
+import figma from '@figma/code-connect';
+
+/**
+ * -- This file was auto-generated by Code Connect --
+ * None of your props could be automatically mapped to Figma properties.
+ * You should update the `props` object to include a mapping from your
+ * code props to Figma properties, and update the `example` function to
+ * return the code example you'd like to see in Figma
+ */
+
+figma.connect(
+ Coachmark,
+ 'https://www.figma.com/design/ReGfRNillGABAj5SlITalN/%F0%9F%93%90-Gamut?node-id=19366-27764',
+ {
+ props: {
+ beak: figma.enum('beak', {
+ right: 'right',
+ left: 'left',
+ }),
+ position: figma.enum('position', {
+ below: 'below',
+ above: 'above',
+ }),
+ renderPopover:
+
+ New feature
+
+
+ Information about the new feature can go here. Here’s an extra sentence if you really need it.
+
+
+ {}}>
+ Button text
+
+
+ ,
+ children: Coachmark wraps around this component,
+ },
+ example: ({ children, beak, position, ...props }) => (
+
+ {children}
+
+ ),
+ }
+);
diff --git a/packages/code-connect/Molecules/Disclosure.figma.tsx b/packages/code-connect/Molecules/Disclosure.figma.tsx
new file mode 100644
index 00000000000..0b91798e5fe
--- /dev/null
+++ b/packages/code-connect/Molecules/Disclosure.figma.tsx
@@ -0,0 +1,72 @@
+import React from 'react';
+import { Disclosure } from '@codecademy/gamut';
+import figma from '@figma/code-connect';
+
+/**
+ * -- This file was auto-generated by Code Connect --
+ * `props` includes a mapping from Figma properties and variants to
+ * suggested values. You should update this to match the props of your
+ * code component, and update the `example` function to return the
+ * code example you'd like to see in Figma
+ */
+
+figma.connect(
+ Disclosure,
+ 'https://www.figma.com/design/ReGfRNillGABAj5SlITalN/%F0%9F%93%90-Gamut?node-id=43343%3A19299',
+ {
+ props: {
+ variant: figma.enum('variant', {
+ default: 'default',
+ subtle: 'subtle',
+ transparent: 'transparent',
+ }),
+ hasBorder: figma.boolean('hasBorder'),
+ spacing: figma.enum('spacing', {
+ normal: 'normal',
+ condensed: 'condensed',
+ compact: 'compact',
+ }),
+ headingInfo: figma.nestedProps('.disclosureButton', {
+ overline: figma.boolean('overline', {
+ true: figma.textContent('overline'),
+ false: undefined,
+ }),
+ subheading: figma.boolean('subheader', {
+ true: figma.textContent('subtitle'),
+ false: undefined,
+ }),
+ heading: figma.textContent('heading'),
+ }),
+ body: figma.children('.disclosureBody'),
+ isExpanded: figma.boolean('isExpanded'),
+ panelInfo: figma.nestedProps('.disclosureBody', {
+ hasPanelBg: figma.boolean('body-bg'),
+ ctaText: figma.boolean('cta', {
+ true: 'Button Text',
+ }),
+ }),
+ },
+ example: ({
+ headingInfo,
+ body,
+ variant,
+ hasBorder,
+ spacing,
+ isExpanded,
+ panelInfo,
+ }) => (
+
+ ),
+ }
+);
diff --git a/packages/code-connect/Molecules/Flyout.figma.tsx b/packages/code-connect/Molecules/Flyout.figma.tsx
new file mode 100644
index 00000000000..ce34a1c1949
--- /dev/null
+++ b/packages/code-connect/Molecules/Flyout.figma.tsx
@@ -0,0 +1,41 @@
+import React from 'react';
+import { Flyout } from '@codecademy/gamut';
+import figma from '@figma/code-connect';
+
+/**
+ * -- This file was auto-generated by Code Connect --
+ * `props` includes a mapping from your code props to Figma properties.
+ * You should check this is correct, and update the `example` function
+ * to return the code example you'd like to see in Figma
+ */
+
+figma.connect(
+ Flyout,
+ 'https://www.figma.com/design/ReGfRNillGABAj5SlITalN/%F0%9F%93%90-Gamut?node-id=6329%3A5647',
+ {
+ props: {
+ openFrom: figma.enum('openFrom', {
+ left: 'left',
+ right: 'right',
+ }),
+ drawerInfo: figma.nestedProps('Drawer', {
+ title: figma.textContent('Title'),
+ children: figma.textContent('text'),
+ }),
+ closeLabel: 'Close',
+ bg: 'background',
+ },
+ example: ({ drawerInfo, openFrom, closeLabel, bg }) => (
+
+ {drawerInfo.children}
+
+ ),
+ }
+);
diff --git a/packages/code-connect/Molecules/Menu/Menu.figma.tsx b/packages/code-connect/Molecules/Menu/Menu.figma.tsx
new file mode 100644
index 00000000000..ae804cc5f40
--- /dev/null
+++ b/packages/code-connect/Molecules/Menu/Menu.figma.tsx
@@ -0,0 +1,30 @@
+import React from 'react';
+import { Menu } from '@codecademy/gamut';
+import figma from '@figma/code-connect';
+
+/**
+ * -- This file was auto-generated by Code Connect --
+ * `props` includes a mapping from Figma properties and variants to
+ * suggested values. You should update this to match the props of your
+ * code component, and update the `example` function to return the
+ * code example you'd like to see in Figma
+ */
+
+figma.connect(
+ Menu,
+ 'https://www.figma.com/design/ReGfRNillGABAj5SlITalN/%F0%9F%93%90-Gamut?node-id=1971%3A2562',
+ {
+ props: {
+ variant: figma.enum('Variant', {
+ popover: 'popover',
+ fixed: 'fixed',
+ }),
+ spacing: figma.enum('Spacing', {
+ normal: 'normal',
+ condensed: 'condensed',
+ }),
+ children: figma.children('*'),
+ },
+ example: ({ children, ...props }) =>
,
+ }
+);
diff --git a/packages/code-connect/Molecules/Menu/MenuItemFixed.figma.tsx b/packages/code-connect/Molecules/Menu/MenuItemFixed.figma.tsx
new file mode 100644
index 00000000000..ef33b5f2079
--- /dev/null
+++ b/packages/code-connect/Molecules/Menu/MenuItemFixed.figma.tsx
@@ -0,0 +1,27 @@
+import React from 'react';
+import { MenuItem } from '@codecademy/gamut';
+import figma from '@figma/code-connect';
+
+/**
+ * -- This file was auto-generated by Code Connect --
+ * `props` includes a mapping from Figma properties and variants to
+ * suggested values. You should update this to match the props of your
+ * code component, and update the `example` function to return the
+ * code example you'd like to see in Figma
+ */
+
+figma.connect(
+ MenuItem,
+ 'https://www.figma.com/design/ReGfRNillGABAj5SlITalN/%F0%9F%93%90-Gamut?node-id=1971-2476',
+ {
+ props: {
+ active: figma.boolean('active'),
+ icon: figma.boolean('leading-icon', {
+ true: figma.instance('↳ icon'),
+ false: undefined,
+ }),
+ label: figma.string('label'),
+ },
+ example: ({ label, ...props }) => ,
+ }
+);
diff --git a/packages/code-connect/Molecules/Menu/MenuItemPopover.figma.tsx b/packages/code-connect/Molecules/Menu/MenuItemPopover.figma.tsx
new file mode 100644
index 00000000000..2a99b7a7d1c
--- /dev/null
+++ b/packages/code-connect/Molecules/Menu/MenuItemPopover.figma.tsx
@@ -0,0 +1,27 @@
+import React from 'react';
+import { MenuItem } from '@codecademy/gamut';
+import figma from '@figma/code-connect';
+
+/**
+ * -- This file was auto-generated by Code Connect --
+ * `props` includes a mapping from Figma properties and variants to
+ * suggested values. You should update this to match the props of your
+ * code component, and update the `example` function to return the
+ * code example you'd like to see in Figma
+ */
+
+figma.connect(
+ MenuItem,
+ 'https://www.figma.com/design/ReGfRNillGABAj5SlITalN/%F0%9F%93%90-Gamut?node-id=1971-2489',
+ {
+ props: {
+ active: figma.boolean('active'),
+ icon: figma.boolean('leading-icon', {
+ true: figma.instance('↳ icon'),
+ false: undefined,
+ }),
+ label: figma.string('label'),
+ },
+ example: ({ label, ...props }) => ,
+ }
+);
diff --git a/packages/code-connect/Molecules/Menu/MenuSeparator.figma.tsx b/packages/code-connect/Molecules/Menu/MenuSeparator.figma.tsx
new file mode 100644
index 00000000000..729ec0b741f
--- /dev/null
+++ b/packages/code-connect/Molecules/Menu/MenuSeparator.figma.tsx
@@ -0,0 +1,19 @@
+import React from 'react';
+import { MenuSeparator } from '@codecademy/gamut';
+import figma from '@figma/code-connect';
+
+/**
+ * -- This file was auto-generated by Code Connect --
+ * `props` includes a mapping from Figma properties and variants to
+ * suggested values. You should update this to match the props of your
+ * code component, and update the `example` function to return the
+ * code example you'd like to see in Figma
+ */
+
+figma.connect(
+ MenuSeparator,
+ 'https://www.figma.com/design/ReGfRNillGABAj5SlITalN/%F0%9F%93%90-Gamut?node-id=65117%3A20356',
+ {
+ example: () => ,
+ }
+);
diff --git a/packages/code-connect/Molecules/Models/Dialog.figma.tsx b/packages/code-connect/Molecules/Models/Dialog.figma.tsx
new file mode 100644
index 00000000000..d62cba79b89
--- /dev/null
+++ b/packages/code-connect/Molecules/Models/Dialog.figma.tsx
@@ -0,0 +1,48 @@
+import React from 'react';
+import { Dialog } from '@codecademy/gamut';
+import figma from '@figma/code-connect';
+
+/**
+ * -- This file was auto-generated by Code Connect --
+ * `props` includes a mapping from Figma properties and variants to
+ * suggested values. You should update this to match the props of your
+ * code component, and update the `example` function to return the
+ * code example you'd like to see in Figma
+ */
+
+figma.connect(
+ Dialog,
+ 'https://www.figma.com/design/ReGfRNillGABAj5SlITalN/%F0%9F%93%90-Gamut?node-id=19781%3A31027',
+ {
+ props: {
+ image: figma.boolean('Image', {
+ true: figma.children('.image'),
+ false: undefined,
+ }),
+ children: figma.textContent('✏️ description'),
+ size: figma.enum('size', {
+ small: 'small',
+ medium: 'medium',
+ large: 'large',
+ fluid: 'fluid',
+ }),
+ variant: figma.enum('variant', {
+ primary: 'primary',
+ danger: 'danger',
+ }),
+ title: figma.textContent('✏️ title'),
+ isOpen: true,
+ confirmCta: 'Primary action',
+ cancelCta: 'Cancel',
+ },
+ example: ({ children, confirmCta, cancelCta, ...props }) => (
+
+ ),
+ }
+);
diff --git a/packages/code-connect/Molecules/Models/Modal.figma.tsx b/packages/code-connect/Molecules/Models/Modal.figma.tsx
new file mode 100644
index 00000000000..77a814680f9
--- /dev/null
+++ b/packages/code-connect/Molecules/Models/Modal.figma.tsx
@@ -0,0 +1,48 @@
+import React from 'react';
+import { Modal } from '@codecademy/gamut';
+import figma from '@figma/code-connect';
+
+/**
+ * -- This file was auto-generated by Code Connect --
+ * `props` includes a mapping from Figma properties and variants to
+ * suggested values. You should update this to match the props of your
+ * code component, and update the `example` function to return the
+ * code example you'd like to see in Figma
+ */
+
+figma.connect(
+ Modal,
+ 'https://www.figma.com/design/ReGfRNillGABAj5SlITalN/%F0%9F%93%90-Gamut?node-id=19560%3A29540',
+ {
+ props: {
+ modalProps: figma.nestedProps('Dialog', {
+ image: figma.boolean('Image', {
+ true: figma.children('.image'),
+ false: undefined,
+ }),
+ children: figma.textContent('✏️ description'),
+ size: figma.enum('size', {
+ small: 'small',
+ medium: 'medium',
+ large: 'large',
+ fluid: 'fluid',
+ }),
+ variant: figma.enum('variant', {
+ primary: 'primary',
+ danger: 'danger',
+ }),
+ title: figma.textContent('✏️ title'),
+ }),
+ },
+ example: ({ modalProps }) => (
+
+ {modalProps.children}
+
+ ),
+ }
+);
diff --git a/packages/code-connect/Molecules/Pagination.figma.tsx b/packages/code-connect/Molecules/Pagination.figma.tsx
new file mode 100644
index 00000000000..e4b714e4687
--- /dev/null
+++ b/packages/code-connect/Molecules/Pagination.figma.tsx
@@ -0,0 +1,29 @@
+import React from 'react';
+import { Pagination } from '@codecademy/gamut';
+import figma from '@figma/code-connect';
+
+/**
+ * -- This file was auto-generated by Code Connect --
+ * `props` includes a mapping from Figma properties and variants to
+ * suggested values. You should update this to match the props of your
+ * code component, and update the `example` function to return the
+ * code example you'd like to see in Figma
+ */
+
+figma.connect(
+ Pagination,
+ 'https://www.figma.com/design/ReGfRNillGABAj5SlITalN/%F0%9F%93%90-Gamut?node-id=8629%3A9005',
+ {
+ props: {
+ style: figma.enum('style', {
+ text: 'text',
+ stroke: 'stroke',
+ }),
+ type: figma.enum('type', {
+ basic: 'basic',
+ includeSkipToButtons: 'includeskiptobuttons',
+ }),
+ },
+ example: (props) => ,
+ }
+);
diff --git a/packages/code-connect/Molecules/Popover.figma.tsx b/packages/code-connect/Molecules/Popover.figma.tsx
new file mode 100644
index 00000000000..e511394fde8
--- /dev/null
+++ b/packages/code-connect/Molecules/Popover.figma.tsx
@@ -0,0 +1,48 @@
+import React from 'react';
+import { Popover } from '@codecademy/gamut';
+import figma from '@figma/code-connect';
+
+/**
+ * -- This file was auto-generated by Code Connect --
+ * `props` includes a mapping from Figma properties and variants to
+ * suggested values. You should update this to match the props of your
+ * code component, and update the `example` function to return the
+ * code example you'd like to see in Figma
+ */
+
+figma.connect(
+ Popover,
+ 'https://www.figma.com/design/ReGfRNillGABAj5SlITalN/%F0%9F%93%90-Gamut?node-id=106812-57101',
+ {
+ props: {
+ beak: figma.boolean('beak'),
+ position: figma.boolean('beak', {
+ true: figma.enum('position', {
+ above: 'above',
+ below: 'below',
+ 'center-right': 'center',
+ 'center-left': 'center',
+ }),
+ }),
+ align: figma.boolean('beak', {
+ true: figma.enum('beakPosition', {
+ left: 'left',
+ right: 'right',
+ center: figma.enum('position', {
+ above: 'center',
+ below: 'center',
+ 'center-left': 'left',
+ 'center-right': 'right',
+ }),
+ }),
+ }),
+ widthRestricted: figma.boolean('widthRestricted'),
+ pattern: figma.children('Pattern Fills'),
+ children: figma.textContent('text'),
+ isOpen: true,
+ },
+ example: ({ children, ...props }) => (
+ {children}
+ ),
+ }
+);
diff --git a/packages/code-connect/Molecules/Tabs/Tab.figma.tsx b/packages/code-connect/Molecules/Tabs/Tab.figma.tsx
new file mode 100644
index 00000000000..d76daeb3e5c
--- /dev/null
+++ b/packages/code-connect/Molecules/Tabs/Tab.figma.tsx
@@ -0,0 +1,42 @@
+import React from 'react';
+import { Tab } from '@codecademy/gamut';
+import figma from '@figma/code-connect';
+
+/**
+ * -- This file was auto-generated by Code Connect --
+ * `props` includes a mapping from Figma properties and variants to
+ * suggested values. You should update this to match the props of your
+ * code component, and update the `example` function to return the
+ * code example you'd like to see in Figma
+ */
+
+figma.connect(
+ Tab,
+ 'https://www.figma.com/design/ReGfRNillGABAj5SlITalN/%F0%9F%93%90-Gamut?node-id=8516%3A7309',
+ {
+ props: {
+ badge: figma.boolean('badge', {
+ true: 'Badge',
+ false: undefined,
+ }),
+ children: figma.string('label'),
+ disabled: figma.enum('state', {
+ Default: undefined,
+ Selected: undefined,
+ Disabled: true,
+ }),
+ selected: figma.enum('state', {
+ Default: undefined,
+ Disabled: undefined,
+ Selected: true,
+ }),
+ hover: figma.boolean('hover'),
+ },
+ example: ({ children, badge, ...props }) => (
+
+ {children}
+ {badge}
+
+ ),
+ }
+);
diff --git a/packages/code-connect/Molecules/Tabs/Tabs.figma.tsx b/packages/code-connect/Molecules/Tabs/Tabs.figma.tsx
new file mode 100644
index 00000000000..b6da461a97a
--- /dev/null
+++ b/packages/code-connect/Molecules/Tabs/Tabs.figma.tsx
@@ -0,0 +1,26 @@
+import React from 'react';
+import { TabList, Tabs } from '@codecademy/gamut';
+import figma from '@figma/code-connect';
+
+/**
+ * -- This file was auto-generated by Code Connect --
+ * `props` includes a mapping from Figma properties and variants to
+ * suggested values. You should update this to match the props of your
+ * code component, and update the `example` function to return the
+ * code example you'd like to see in Figma
+ */
+
+figma.connect(
+ Tabs,
+ 'https://www.figma.com/design/ReGfRNillGABAj5SlITalN/%F0%9F%93%90-Gamut?node-id=8516%3A7564',
+ {
+ props: {
+ children: figma.children('↳ tab-*'),
+ },
+ example: ({ children, ...props }) => (
+
+ {children}
+
+ ),
+ }
+);
diff --git a/packages/code-connect/Molecules/Tips/InfoTip.figma.tsx b/packages/code-connect/Molecules/Tips/InfoTip.figma.tsx
new file mode 100644
index 00000000000..b744c9edb9d
--- /dev/null
+++ b/packages/code-connect/Molecules/Tips/InfoTip.figma.tsx
@@ -0,0 +1,39 @@
+import React from 'react';
+import { InfoTip } from '@codecademy/gamut';
+import figma from '@figma/code-connect';
+
+/**
+ * -- This file was auto-generated by Code Connect --
+ * `props` includes a mapping from your code props to Figma properties.
+ * You should check this is correct, and update the `example` function
+ * to return the code example you'd like to see in Figma
+ */
+
+figma.connect(
+ InfoTip,
+ 'https://www.figma.com/design/ReGfRNillGABAj5SlITalN/%F0%9F%93%90-Gamut?node-id=36743%3A20136',
+ {
+ props: {
+ emphasis: figma.enum('emphasis', {
+ low: 'low',
+ high: 'high',
+ }),
+ toolTipInfo: figma.nestedProps('.infotip-alignment', {
+ alignment: figma.enum('alignment', {
+ 'top-left': 'top-left',
+ 'top-right': 'top-right',
+ 'bottom-left': 'bottom-left',
+ 'bottom-right': 'bottom-right',
+ }),
+ info: figma.textContent('✏️ tip'),
+ }),
+ },
+ example: (props) => (
+
+ ),
+ }
+);
diff --git a/packages/code-connect/Molecules/Tips/PreviewTip.figma.tsx b/packages/code-connect/Molecules/Tips/PreviewTip.figma.tsx
new file mode 100644
index 00000000000..e9364b0a647
--- /dev/null
+++ b/packages/code-connect/Molecules/Tips/PreviewTip.figma.tsx
@@ -0,0 +1,42 @@
+import React from 'react';
+import { PreviewTip } from '@codecademy/gamut';
+import figma from '@figma/code-connect';
+
+/**
+ * -- This file was auto-generated by Code Connect --
+ * `props` includes a mapping from your code props to Figma properties.
+ * You should check this is correct, and update the `example` function
+ * to return the code example you'd like to see in Figma
+ */
+
+figma.connect(
+ PreviewTip,
+ 'https://www.figma.com/design/ReGfRNillGABAj5SlITalN/%F0%9F%93%90-Gamut?node-id=49333-38735&m=dev',
+ {
+ props: {
+ previewTipProps: figma.nestedProps('.previewtip-alignment-anchor', {
+ alignment: figma.enum('alignment', {
+ 'bottom-left': 'bottom-left',
+ 'bottom-right': 'bottom-right',
+ 'top-left': 'top-left',
+ 'top-right': 'top-right',
+ }),
+ overline: figma.boolean('overline', {
+ true: figma.string('✏️ overline'),
+ false: undefined,
+ }),
+ linkDescription: figma.textContent('✏️ snippet'),
+ children: figma.textContent('✏️ label'),
+ }),
+ },
+ example: ({ previewTipProps }) => (
+
+ {previewTipProps.children}
+
+ ),
+ }
+);
diff --git a/packages/code-connect/Molecules/Tips/ToolTip.figma.tsx b/packages/code-connect/Molecules/Tips/ToolTip.figma.tsx
new file mode 100644
index 00000000000..9481feed1b7
--- /dev/null
+++ b/packages/code-connect/Molecules/Tips/ToolTip.figma.tsx
@@ -0,0 +1,30 @@
+import React from 'react';
+import { ToolTip } from '@codecademy/gamut';
+import figma from '@figma/code-connect';
+
+/**
+ * -- This file was auto-generated by Code Connect --
+ * `props` includes a mapping from your code props to Figma properties.
+ * You should check this is correct, and update the `example` function
+ * to return the code example you'd like to see in Figma
+ */
+
+figma.connect(
+ ToolTip,
+ 'https://www.figma.com/design/ReGfRNillGABAj5SlITalN/%F0%9F%93%90-Gamut?node-id=41215%3A28041',
+ {
+ props: {
+ alignment: figma.enum('alignment', {
+ 'bottom-center': 'bottom-center',
+ 'left-center': 'left-center',
+ 'right-center': 'right-center',
+ 'top-center': 'top-center',
+ }),
+ info: figma.string('✏️ tooltip'),
+ children: '{children}',
+ },
+ example: ({ children, ...props }) => (
+ {children}
+ ),
+ }
+);
diff --git a/packages/code-connect/Molecules/Toasts/Toast.figma.tsx b/packages/code-connect/Molecules/Toasts/Toast.figma.tsx
new file mode 100644
index 00000000000..9cc6dd3c920
--- /dev/null
+++ b/packages/code-connect/Molecules/Toasts/Toast.figma.tsx
@@ -0,0 +1,39 @@
+import React from 'react';
+import { Toast } from '@codecademy/gamut';
+import figma from '@figma/code-connect';
+
+/**
+ * -- This file was auto-generated by Code Connect --
+ * `props` includes a mapping from your code props to Figma properties.
+ * You should check this is correct, and update the `example` function
+ * to return the code example you'd like to see in Figma
+ */
+
+figma.connect(
+ Toast,
+ 'https://www.figma.com/design/ReGfRNillGABAj5SlITalN/%F0%9F%93%90-Gamut?node-id=1115%3A195',
+ {
+ props: {
+ title: figma.boolean('Title', {
+ true: figma.textContent('Title'),
+ false: undefined,
+ }),
+ iconProps: figma.nestedProps('📐 Content', {
+ icon: figma.boolean('Image', {
+ true: 'test',
+ false: 'false',
+ }),
+ }),
+ icon: figma.boolean('Image', {
+ true: figma.children('*'),
+ false: undefined,
+ }),
+ children: figma.string('description'),
+ },
+ example: ({ children, iconProps, ...props }) => (
+
+ {children}
+
+ ),
+ }
+);
diff --git a/packages/code-connect/Molecules/Toasts/Toaster.figma.tsx b/packages/code-connect/Molecules/Toasts/Toaster.figma.tsx
new file mode 100644
index 00000000000..357a322ae65
--- /dev/null
+++ b/packages/code-connect/Molecules/Toasts/Toaster.figma.tsx
@@ -0,0 +1,275 @@
+import React from 'react';
+import { Toaster } from '@codecademy/gamut';
+import { Bee } from '@codecademy/gamut-illustrations';
+import figma from '@figma/code-connect';
+
+/**
+ * -- This file was auto-generated by Code Connect --
+ * None of your props could be automatically mapped to Figma properties.
+ * You should update the `props` object to include a mapping from your
+ * code props to Figma properties, and update the `example` function to
+ * return the code example you'd like to see in Figma
+ */
+
+figma.connect(
+ Toaster,
+ 'https://www.figma.com/design/ReGfRNillGABAj5SlITalN/%F0%9F%93%90-Gamut?node-id=19674%3A29150',
+ {
+ props: {
+ toasts: figma.boolean('Toast #1', {
+ true: figma.boolean('Toast #2', {
+ true: figma.boolean('Toast #3', {
+ true: figma.boolean('Toast #4', {
+ true: [
+ {
+ id: 'toast1',
+ children:
+ 'Keep Body Text within Toasts to a maximum of 3 lines of text.',
+ title: 'Title with Optional Icon',
+ icon: ,
+ },
+ {
+ id: 'toast2',
+ children:
+ 'Keep Body Text within Toasts to a maximum of 3 lines of text.',
+ icon: ,
+ },
+ {
+ id: 'toast3',
+ children:
+ 'Keep Body Text within Toasts to a maximum of 3 lines of text.',
+ title: 'Title with Optional Icon',
+ },
+ {
+ id: 'toast4',
+ children:
+ 'Keep Body Text within Toasts to a maximum of 3 lines of text.',
+ },
+ ],
+ false: [
+ {
+ id: 'toast1',
+ children:
+ 'Keep Body Text within Toasts to a maximum of 3 lines of text.',
+ title: 'Title with Optional Icon',
+ icon: ,
+ },
+ {
+ id: 'toast2',
+ children:
+ 'Keep Body Text within Toasts to a maximum of 3 lines of text.',
+ icon: ,
+ },
+ {
+ id: 'toast3',
+ children:
+ 'Keep Body Text within Toasts to a maximum of 3 lines of text.',
+ title: 'Title with Optional Icon',
+ },
+ ],
+ }),
+ false: figma.boolean('Toast #4', {
+ true: [
+ {
+ id: 'toast1',
+ children:
+ 'Keep Body Text within Toasts to a maximum of 3 lines of text.',
+ title: 'Title with Optional Icon',
+ icon: ,
+ },
+ {
+ id: 'toast2',
+ children:
+ 'Keep Body Text within Toasts to a maximum of 3 lines of text.',
+ icon: ,
+ },
+ {
+ id: 'toast4',
+ children:
+ 'Keep Body Text within Toasts to a maximum of 3 lines of text.',
+ },
+ ],
+ false: [
+ {
+ id: 'toast1',
+ children:
+ 'Keep Body Text within Toasts to a maximum of 3 lines of text.',
+ title: 'Title with Optional Icon',
+ icon: ,
+ },
+ {
+ id: 'toast2',
+ children:
+ 'Keep Body Text within Toasts to a maximum of 3 lines of text.',
+ icon: ,
+ },
+ ],
+ }),
+ }),
+ false: figma.boolean('Toast #3', {
+ true: figma.boolean('Toast #4', {
+ true: [
+ {
+ id: 'toast1',
+ children:
+ 'Keep Body Text within Toasts to a maximum of 3 lines of text.',
+ title: 'Title with Optional Icon',
+ icon: ,
+ },
+ {
+ id: 'toast3',
+ children:
+ 'Keep Body Text within Toasts to a maximum of 3 lines of text.',
+ title: 'Title with Optional Icon',
+ },
+ {
+ id: 'toast4',
+ children:
+ 'Keep Body Text within Toasts to a maximum of 3 lines of text.',
+ },
+ ],
+ false: [
+ {
+ id: 'toast1',
+ children:
+ 'Keep Body Text within Toasts to a maximum of 3 lines of text.',
+ title: 'Title with Optional Icon',
+ icon: ,
+ },
+ {
+ id: 'toast3',
+ children:
+ 'Keep Body Text within Toasts to a maximum of 3 lines of text.',
+ title: 'Title with Optional Icon',
+ },
+ ],
+ }),
+ false: figma.boolean('Toast #4', {
+ true: [
+ {
+ id: 'toast1',
+ children:
+ 'Keep Body Text within Toasts to a maximum of 3 lines of text.',
+ title: 'Title with Optional Icon',
+ icon: ,
+ },
+ {
+ id: 'toast4',
+ children:
+ 'Keep Body Text within Toasts to a maximum of 3 lines of text.',
+ },
+ ],
+ false: [
+ {
+ id: 'toast1',
+ children:
+ 'Keep Body Text within Toasts to a maximum of 3 lines of text.',
+ title: 'Title with Optional Icon',
+ icon: ,
+ },
+ ],
+ }),
+ }),
+ }),
+ false: figma.boolean('Toast #2', {
+ true: figma.boolean('Toast #3', {
+ true: figma.boolean('Toast #4', {
+ true: [
+ {
+ id: 'toast2',
+ children:
+ 'Keep Body Text within Toasts to a maximum of 3 lines of text.',
+ icon: ,
+ },
+ {
+ id: 'toast3',
+ children:
+ 'Keep Body Text within Toasts to a maximum of 3 lines of text.',
+ title: 'Title with Optional Icon',
+ },
+ {
+ id: 'toast4',
+ children:
+ 'Keep Body Text within Toasts to a maximum of 3 lines of text.',
+ },
+ ],
+ false: [
+ {
+ id: 'toast2',
+ children:
+ 'Keep Body Text within Toasts to a maximum of 3 lines of text.',
+ icon: ,
+ },
+ {
+ id: 'toast3',
+ children:
+ 'Keep Body Text within Toasts to a maximum of 3 lines of text.',
+ title: 'Title with Optional Icon',
+ },
+ ],
+ }),
+ false: figma.boolean('Toast #4', {
+ true: [
+ {
+ id: 'toast2',
+ children:
+ 'Keep Body Text within Toasts to a maximum of 3 lines of text.',
+ icon: ,
+ },
+ {
+ id: 'toast4',
+ children:
+ 'Keep Body Text within Toasts to a maximum of 3 lines of text.',
+ },
+ ],
+ false: [
+ {
+ id: 'toast2',
+ children:
+ 'Keep Body Text within Toasts to a maximum of 3 lines of text.',
+ icon: ,
+ },
+ ],
+ }),
+ }),
+ false: figma.boolean('Toast #3', {
+ true: figma.boolean('Toast #4', {
+ true: [
+ {
+ id: 'toast3',
+ children:
+ 'Keep Body Text within Toasts to a maximum of 3 lines of text.',
+ title: 'Title with Optional Icon',
+ },
+ {
+ id: 'toast4',
+ children:
+ 'Keep Body Text within Toasts to a maximum of 3 lines of text.',
+ },
+ ],
+ false: [
+ {
+ id: 'toast3',
+ children:
+ 'Keep Body Text within Toasts to a maximum of 3 lines of text.',
+ title: 'Title with Optional Icon',
+ },
+ ],
+ }),
+ false: figma.boolean('Toast #4', {
+ true: [
+ {
+ id: 'toast4',
+ children:
+ 'Keep Body Text within Toasts to a maximum of 3 lines of text.',
+ },
+ ],
+ false: [],
+ }),
+ }),
+ }),
+ }),
+ },
+ example: (props) => ,
+ }
+);
diff --git a/packages/code-connect/Molecules/Video.figma.tsx b/packages/code-connect/Molecules/Video.figma.tsx
new file mode 100644
index 00000000000..70cbc52079f
--- /dev/null
+++ b/packages/code-connect/Molecules/Video.figma.tsx
@@ -0,0 +1,22 @@
+import React from 'react';
+import { Video } from '@codecademy/gamut';
+import figma from '@figma/code-connect';
+
+/**
+ * -- This file was auto-generated by Code Connect --
+ * None of your props could be automatically mapped to Figma properties.
+ * You should update the `props` object to include a mapping from your
+ * code props to Figma properties, and update the `example` function to
+ * return the code example you'd like to see in Figma
+ */
+
+figma.connect(
+ Video,
+ 'https://www.figma.com/design/ReGfRNillGABAj5SlITalN/%F0%9F%93%90-Gamut?node-id=73447%3A73063',
+ {
+ props: {
+ videoUrl: 'https://www.example.com/video.mp4',
+ },
+ example: (props) => ,
+ }
+);
diff --git a/packages/code-connect/Organisms/DataTable/DataTableBasic.figma.tsx b/packages/code-connect/Organisms/DataTable/DataTableBasic.figma.tsx
new file mode 100644
index 00000000000..3f413f77848
--- /dev/null
+++ b/packages/code-connect/Organisms/DataTable/DataTableBasic.figma.tsx
@@ -0,0 +1,57 @@
+import React from 'react';
+import { DataTable } from '@codecademy/gamut';
+import figma from '@figma/code-connect';
+
+/**
+ * -- This file was auto-generated by Code Connect --
+ * `props` includes a mapping from Figma properties and variants to
+ * suggested values. You should update this to match the props of your
+ * code component, and update the `example` function to return the
+ * code example you'd like to see in Figma
+ */
+
+figma.connect(
+ DataTable,
+ 'https://www.figma.com/design/ReGfRNillGABAj5SlITalN/%F0%9F%93%90-Gamut?node-id=9922-48146',
+ {
+ props: {
+ size: figma.enum('Size', {
+ Normal: 'normal',
+ Condensed: 'condensed',
+ }),
+ columns: [
+ {
+ key: 'name',
+ header: 'Name',
+ size: 'xl',
+ sortable: true,
+ },
+ {
+ key: 'row1',
+ header: 'Row #',
+ size: 'sm',
+ sortable: true,
+ },
+ {
+ key: 'row2',
+ header: 'Row #',
+ size: 'sm',
+ sortable: true,
+ },
+ ],
+ rows: [
+ { name: 'Text Content', row1: '1', row2: '1' },
+ { name: 'Text Content', row1: '2', row2: '2' },
+ { name: 'Text Content', row1: '3', row2: '3' },
+ { name: 'Text Content', row1: '4', row2: '4' },
+ { name: 'Text Content', row1: '5', row2: '5' },
+ { name: 'Text Content', row1: '6', row2: '6' },
+ { name: 'Text Content', row1: '7', row2: '7' },
+ { name: 'Text Content', row1: '8', row2: '8' },
+ { name: 'Text Content', row1: '9', row2: '9' },
+ { name: 'Text Content', row1: '10', row2: '10' },
+ ],
+ },
+ example: (props) => ,
+ }
+);
diff --git a/packages/code-connect/Organisms/GridForm.figma.tsx b/packages/code-connect/Organisms/GridForm.figma.tsx
new file mode 100644
index 00000000000..16596e2754a
--- /dev/null
+++ b/packages/code-connect/Organisms/GridForm.figma.tsx
@@ -0,0 +1,138 @@
+import React from 'react';
+import { GridForm } from '@codecademy/gamut';
+import figma from '@figma/code-connect';
+
+/**
+ * -- This file was auto-generated by Code Connect --
+ * None of your props could be automatically mapped to Figma properties.
+ * You should update the `props` object to include a mapping from your
+ * code props to Figma properties, and update the `example` function to
+ * return the code example you'd like to see in Figma
+ */
+
+figma.connect(
+ GridForm,
+ 'https://www.figma.com/design/ReGfRNillGABAj5SlITalN/%F0%9F%93%90-Gamut?node-id=1689%3A4007',
+ {
+ props: {
+ fields: figma.enum('Template', {
+ Starter: [
+ {
+ label: 'Form element label',
+ name: 'form-element-label',
+ size: 12,
+ type: 'text',
+ validation: { required: true },
+ },
+ {
+ label: 'Form element label',
+ name: 'form-element-label-2',
+ size: 6,
+ type: 'text',
+ validation: { required: true },
+ },
+ {
+ label: 'Form element label',
+ name: 'form-element-label-3',
+ size: 6,
+ type: 'text',
+ validation: { required: true },
+ },
+ {
+ description: 'Label',
+ name: 'form-checkbox',
+ size: 6,
+ type: 'checkbox',
+ },
+ {
+ label: 'Radio Group',
+ name: 'form-radio-group',
+ size: 6,
+ type: 'radio-group',
+ options: [
+ {
+ label: 'Label',
+ value: 'label-1',
+ },
+ {
+ label: 'Label',
+ value: 'label-2',
+ },
+ ],
+ },
+ ],
+ Sections: [
+ {
+ title: 'Section Header',
+ layout: 'left',
+ variant: 'title-md',
+ fields: [
+ {
+ label: 'Form element label',
+ name: 'form-element-label',
+ size: 9,
+ type: 'text',
+ validation: { required: true },
+ },
+ {
+ label: 'Form element label',
+ name: 'form-element-label-2',
+ size: 9,
+ type: 'file',
+ validation: { required: true },
+ },
+ ],
+ },
+ {
+ title: 'Section Header',
+ layout: 'left',
+ variant: 'title-md',
+ fields: [
+ {
+ label: 'Form element label',
+ name: 'form-element-label',
+ size: 9,
+ type: 'textarea',
+ validation: { required: true },
+ rows: 5,
+ },
+ ],
+ },
+ ],
+ 'Inline Submit': [
+ {
+ label: 'Form element label',
+ name: 'form-element-label',
+ size: 8,
+ type: 'text',
+ },
+ ],
+ }),
+ submit: figma.enum('Template', {
+ Starter: {
+ contents: 'Submit form',
+ position: 'left',
+ size: 12,
+ },
+ Sections: {
+ contents: 'Submit form',
+ position: 'right',
+ size: 12,
+ type: 'cta',
+ },
+ 'Inline Submit': {
+ contents: 'Submit Form',
+ size: 4,
+ position: 'right',
+ },
+ }),
+ cancel: figma.enum('Template', {
+ Sections: {
+ children: 'Cancel',
+ onClick: () => {},
+ },
+ }),
+ },
+ example: (props) => ,
+ }
+);
diff --git a/packages/code-connect/Organisms/List/List.figma.tsx b/packages/code-connect/Organisms/List/List.figma.tsx
new file mode 100644
index 00000000000..1515d53c3ee
--- /dev/null
+++ b/packages/code-connect/Organisms/List/List.figma.tsx
@@ -0,0 +1,32 @@
+import React from 'react';
+import { List } from '@codecademy/gamut';
+import figma from '@figma/code-connect';
+
+/**
+ * -- This file was auto-generated by Code Connect --
+ * None of your props could be automatically mapped to Figma properties.
+ * You should update the `props` object to include a mapping from your
+ * code props to Figma properties, and update the `example` function to
+ * return the code example you'd like to see in Figma
+ */
+
+figma.connect(
+ List,
+ 'https://www.figma.com/design/ReGfRNillGABAj5SlITalN/%F0%9F%93%90-Gamut?node-id=7080-4860',
+ {
+ props: {
+ variant: figma.enum('variant', {
+ Base: 'default',
+ Card: 'card',
+ Table: 'table',
+ Block: 'block',
+ }),
+ spacing: figma.enum('size', {
+ Normal: 'normal',
+ Condensed: 'condensed',
+ }),
+ children: figma.children('*'),
+ },
+ example: ({ children, ...props }) => {children},
+ }
+);
diff --git a/packages/code-connect/Organisms/List/ListRow.figma.tsx b/packages/code-connect/Organisms/List/ListRow.figma.tsx
new file mode 100644
index 00000000000..24b08bac13e
--- /dev/null
+++ b/packages/code-connect/Organisms/List/ListRow.figma.tsx
@@ -0,0 +1,65 @@
+import {
+ Box,
+ FillButton,
+ ListCol,
+ ListRow,
+ Rotation,
+ TextButton,
+} from '@codecademy/gamut';
+import { ArrowChevronDownIcon } from '@codecademy/gamut-icons';
+import figma from '@figma/code-connect';
+
+/**
+ * -- This file was auto-generated by Code Connect --
+ * None of your props could be automatically mapped to Figma properties.
+ * You should update the `props` object to include a mapping from your
+ * code props to Figma properties, and update the `example` function to
+ * return the code example you'd like to see in Figma
+ */
+
+figma.connect(
+ ListRow,
+ 'https://www.figma.com/design/ReGfRNillGABAj5SlITalN/%F0%9F%93%90-Gamut?node-id=7080-4776',
+ {
+ props: {
+ isExpanded: figma.boolean('↳ Expanded'),
+ renderExpanded: figma.boolean('Expandable', {
+ true: () => Expandable Content Here,
+ false: undefined,
+ }),
+ controlSection: figma.boolean('Expandable', {
+ true: figma.boolean('↳ Expanded', {
+ true: (
+
+
+
+
+
+ ),
+ false: (
+
+
+
+
+
+ ),
+ }),
+ false: (
+
+ Controls
+ Controls
+
+ ),
+ }),
+ },
+ example: ({ isExpanded, renderExpanded, controlSection }) => (
+
+ Title
+ Item 1
+ Item 2
+ Item 3
+ {controlSection}
+
+ ),
+ }
+);
diff --git a/packages/code-connect/_BenchmarkExamples/FigmaLandingExample.tsx b/packages/code-connect/_BenchmarkExamples/FigmaLandingExample.tsx
new file mode 100644
index 00000000000..1f6e9decfac
--- /dev/null
+++ b/packages/code-connect/_BenchmarkExamples/FigmaLandingExample.tsx
@@ -0,0 +1,171 @@
+import {
+ Badge,
+ Box,
+ Checkbox,
+ FillButton,
+ FlexBox,
+ GridBox,
+ IconButton,
+ Input,
+ Menu,
+ MenuItem,
+ Radio,
+ Text,
+} from '@codecademy/gamut';
+import { MiniAddIcon } from '@codecademy/gamut-icons';
+import * as React from 'react';
+
+// Made during Hackathon
+// Modal unknown
+export const FigmaLandingExample: React.FC = () => (
+
+ {/* Hero Section */}
+
+
+
+ New
+
+
+ From canvas to code—automagically.
+
+
+ You can now inspect a Figma file and get back real, usable code thanks
+ to MCP.
+
+
+ {/* You can add a Box here for the pattern fill background if you want */}
+
+
+ {/* How it works Section */}
+
+
+ How it works
+
+
+ {/* Step 1 */}
+
+
+ 1. Design with real components
+
+
+ Use components from your design system directly in Figma. Each one
+ is mapped to a real implementation in code—no need to fake it.
+
+
+
+
+ replace with a screenshot
+
+
+ {/* Step 2 */}
+
+
+ 2. Inspect in Dev Mode
+
+
+ With the MCP server running, Figma Dev Mode shows the actual
+ component name, available props, and design tokens used (like
+ spacing, color, and typography).
+
+
+
+
+ replace with a screenshot
+
+
+ {/* Step 3 */}
+
+
+ 3. Copy usable code
+
+
+ Developers get production-ready code they can copy straight from the
+ design—no guessing, no redlining, no translation.
+
+
+
+
+ replace with a screenshot
+
+
+
+
+
+ {/* Inspectable Components Section */}
+
+
+ Inspectable components
+
+
+ Each of these elements below are real Gamut components. Open Dev Mode to
+ view props, tokens, and usable code.
+
+
+ Button text
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+);
+
+export default FigmaLandingExample;
diff --git a/packages/code-connect/_BenchmarkExamples/FigmaMcpLandingPage.tsx b/packages/code-connect/_BenchmarkExamples/FigmaMcpLandingPage.tsx
new file mode 100644
index 00000000000..063aec0aa5b
--- /dev/null
+++ b/packages/code-connect/_BenchmarkExamples/FigmaMcpLandingPage.tsx
@@ -0,0 +1,219 @@
+import {
+ Badge,
+ Box,
+ Checkbox,
+ FillButton,
+ FlexBox,
+ FormGroup,
+ GridBox,
+ IconButton,
+ Input,
+ Menu,
+ MenuItem,
+ Radio,
+ RadioGroup,
+ Text,
+} from '@codecademy/gamut';
+import { SearchIcon } from '@codecademy/gamut-icons';
+
+// Made after adding Atoms into Code Connect
+// Using Claude Sonnet 4
+export const FigmaMcpLandingPage = () => {
+ return (
+
+ {/* Hero Section */}
+
+
+
+ New
+
+ From canvas to code—automagically.
+
+
+ You can now inspect a Figma file and get back real, usable code
+ thanks to MCP.
+
+
+
+ {/* Pattern overlay */}
+
+
+
+ {/* How it Works Section */}
+
+
+ How it works
+
+
+ {/* Step 1 */}
+
+
+
+ 1. Design with real components
+
+
+ Use components from your design system directly in Figma. Each one
+ is mapped to a real implementation in code—no need to fake it.
+
+
+
+
+ replace with a screenshot
+
+
+
+
+ {/* Pattern divider */}
+
+
+ {/* Step 2 */}
+
+
+
+ replace with a screenshot
+
+
+
+
+ 2. Inspect in Dev Mode
+
+
+ With the MCP server running, Figma Dev Mode shows the actual
+ component name, available props, and design tokens used (like
+ spacing, color, and typography).
+
+
+
+
+ {/* Pattern divider */}
+
+
+ {/* Step 3 */}
+
+
+
+ 3. Copy usable code
+
+
+ Developers get production-ready code they can copy straight from
+ the design—no guessing, no redlining, no translation.
+
+
+
+
+ replace with a screenshot
+
+
+
+
+
+ {/* Inspectable Components Section */}
+
+
+
+ Inspectable components
+
+
+ Each of these elements below are real Gamut components. Open Dev
+ Mode to view props, tokens, and usable code.
+
+
+
+
+ {/* Fill Button */}
+ Button text
+
+ {/* Icon Button */}
+
+
+ {/* Menu */}
+
+
+
+
+ {/* Input */}
+
+
+
+
+ {/* Checkboxes */}
+
+
+
+
+
+
+ {/* Radio buttons */}
+
+
+
+
+
+
+
+
+ );
+};
diff --git a/packages/code-connect/_BenchmarkExamples/McpLandingPageExample.tsx b/packages/code-connect/_BenchmarkExamples/McpLandingPageExample.tsx
new file mode 100644
index 00000000000..b45721e760f
--- /dev/null
+++ b/packages/code-connect/_BenchmarkExamples/McpLandingPageExample.tsx
@@ -0,0 +1,247 @@
+import {
+ Badge,
+ Box,
+ Checkbox,
+ FillButton,
+ FlexBox,
+ FormGroup,
+ GridBox,
+ IconButton,
+ Input,
+ Menu,
+ MenuItem,
+ Radio,
+ Text,
+} from '@codecademy/gamut';
+import { SearchIcon } from '@codecademy/gamut-icons';
+import React from 'react';
+
+// Generated after adding rules to github copilot
+// using claude 4
+
+export const McpLandingPageExample: React.FC = () => {
+ return (
+
+ {/* Hero Section */}
+
+
+
+ New
+
+
+ From canvas to code—automagically.
+
+
+
+ You can now inspect a Figma file and get back real, usable code
+ thanks to MCP.
+
+
+
+
+ {/* Background pattern overlay */}
+
+
+
+ {/* How it works section */}
+
+
+
+ How it works
+
+
+ {/* Step 1 */}
+
+
+
+ 1. Design with real components
+
+
+ Use components from your design system directly in Figma. Each
+ one is mapped to a real implementation in code—no need to fake
+ it.
+
+
+
+ replace with a screenshot
+
+
+
+ {/* Divider */}
+
+
+ {/* Step 2 */}
+
+
+ replace with a screenshot
+
+
+
+ 2. Inspect in Dev Mode
+
+
+ With the MCP server running, Figma Dev Mode shows the actual
+ component name, available props, and design tokens used (like
+ spacing, color, and typography).
+
+
+
+
+ {/* Divider */}
+
+
+ {/* Step 3 */}
+
+
+
+ 3. Copy usable code
+
+
+ Developers get production-ready code they can copy straight from
+ the design—no guessing, no redlining, no translation.
+
+
+
+ replace with a screenshot
+
+
+
+
+
+ {/* Inspectable components section */}
+
+
+
+
+ Inspectable components
+
+
+ Each of these elements below are real Gamut components. Open Dev
+ Mode to view props, tokens, and usable code.
+
+
+
+ {/* Components showcase */}
+
+
+ {/* Fill Button */}
+ Button text
+
+ {/* Icon Button */}
+
+
+ {/* Menu */}
+
+
+
+
+ {/* Input */}
+
+
+
+
+
+
+ {/* Checkboxes */}
+
+
+
+
+
+
+ {/* Radio buttons */}
+
+
+
+
+
+
+
+
+
+
+ );
+};
diff --git a/packages/styleguide/.storybook/preview.ts b/packages/styleguide/.storybook/preview.ts
index 6a5e70e5c06..40bb9ec4664 100644
--- a/packages/styleguide/.storybook/preview.ts
+++ b/packages/styleguide/.storybook/preview.ts
@@ -22,7 +22,7 @@ const preview: Preview = {
order: [
'Gamut',
'Meta',
- ['About', 'Best Practices', 'Contributing', 'FAQs', 'Stories'],
+ ['About', 'Best Practices', 'Contributing', 'FAQs','Stories', 'Brand', 'Installation', 'Usage Guide', 'MCP'],
'Foundations',
'Layouts',
'Typography',
diff --git a/packages/styleguide/src/lib/Atoms/Badge/Badge.mdx b/packages/styleguide/src/lib/Atoms/Badge/Badge.mdx
index 0925d228a39..599bab045cb 100644
--- a/packages/styleguide/src/lib/Atoms/Badge/Badge.mdx
+++ b/packages/styleguide/src/lib/Atoms/Badge/Badge.mdx
@@ -124,7 +124,7 @@ Use `sm` when the `Badge` is inline with other components such as
+
+
+
+
diff --git a/packages/styleguide/src/lib/Meta/MCP/Code Connect.mdx b/packages/styleguide/src/lib/Meta/MCP/Code Connect.mdx
new file mode 100644
index 00000000000..9c5c614066a
--- /dev/null
+++ b/packages/styleguide/src/lib/Meta/MCP/Code Connect.mdx
@@ -0,0 +1,39 @@
+import { Meta } from '@storybook/blocks';
+
+import { AboutHeader, Callout, ImageWrapper } from '~styleguide/blocks';
+
+export const parameters = {
+ id: 'Code Connect',
+ title: 'Code Connect',
+ subtitle: 'Exploring Code Connect features in Figma.',
+ status: 'updating',
+};
+
+
+
+
+
+
+Code Connect provides Figma with the actual code for Figma components. In providing accurate code, this helps the Figma MCP generate accurate code snippets for designs that use these components.
+
+More information can be found at [Figma Code Connect documentation](https://www.figma.com/code-connect-docs/)
+
+
+
+## Code Connected components
+
+When visiting the Figma file, you'll know if a component is set up with Code Connect if you select the component and see the sidebar includes a "Code Connect" section.
+
+
+
+### Exploring behavior
+
+For components with Code Connect, you can also click on the "Explore behavior" button to open a modal that allows you to edit the component's props. Editing these props will automatically update the code in the modal's Code Connect section to give you a sense of how to adapt your component accordingly.
+
+
diff --git a/packages/styleguide/src/lib/Meta/MCP/Figma MCP.mdx b/packages/styleguide/src/lib/Meta/MCP/Figma MCP.mdx
new file mode 100644
index 00000000000..e0623d96a6f
--- /dev/null
+++ b/packages/styleguide/src/lib/Meta/MCP/Figma MCP.mdx
@@ -0,0 +1,87 @@
+import { Meta } from '@storybook/blocks';
+
+import { AboutHeader, Callout } from '~styleguide/blocks';
+
+export const parameters = {
+ id: 'Figma MCP',
+ title: 'Figma MCP',
+ subtitle:
+ 'Set up the Figma MCP locally to enable design to code generation, exclusive to Codecademy + Skillsoft employees.',
+ status: 'updating',
+};
+
+
+
+
+
+
+
+The offical guidance and documentation comes from Figma. Please reference [Figma Dev Mode MCP documentation](https://help.figma.com/hc/en-us/articles/32132100833559-Guide-to-the-Dev-Mode-MCP-Server) for the most up to date information. This documentation below has been adapted to fit the context of the Gamut repository.
+
+## Figma (desktop client app)
+
+If you haven't already, download the Figma desktop client app appropriate for your OS by going to [Figma's download page](https://www.figma.com/downloads/).
+
+### Start up local Figma MCP server
+
+1. Click on the Figma icon in the top left-hand corner
+2. **Preferences** > **Enable local MCP server**
+
+## Set up MCP Client for your text editor/IDE
+
+We currently support Figma MCP for Cursor. Please let the Gamut team know if you'd like support for other editors.
+
+### Cursor
+
+1. Open **Cursor** → **Settings** → **Cursor Settings**.
+2. Go to the **MCP** tab (might be called **MCP & Integrations**) from the left-hand sidebar.
+3. Under **MCP Tools**, click **+ Add MCP server**.
+4. Enter the following configuration and save:
+
+```
+{
+ "mcpServers": {
+ "Figma": {
+ "url": "http://127.0.0.1:3845/mcp"
+ }
+ }
+}
+```
+
+### Verify your MCP server is running
+
+To check if your MCP server is running, you can visit the endpoint: `http://127.0.0.1:3845/mcp`. You should see a response, e.g.: `{"jsonrpc":"2.0","error":{"code":-32001,"message":"Invalid sessionId"},"id":null}`.
+Yes, it's an odd response, but it indicates that the MCP server is running — otherwise if it's not running you'll see an error "This site can’t be reached" on the page.
+
+Similarly you can test the end point using:
+
+```bash
+curl http://127.0.0.1:3845/mcp
+```
+
+## (Optional) Check the rules
+
+In this repo, there are rules for Copilot (VScode) and Cursor to use the Figma MCP server. You can find them in `.github/instructions/figma.instructions.md` and `.cursor/rules/figma-rules.mdc` respectively.
+
+## Prompt your MCP client
+
+You can prompt the MCP in two main ways:
+
+1. Provide a link to the node of the design you'd like to generate code for, e.g.:
+
+ > Generate the code for this node: https://www.figma.com/design/ReGfRNillGABAj5SlITalN/%F0%9F%93%90-Gamut?node-id=79202-13690&m=dev
+
+2. Selecting the node in the Figma interface, e.g.:
+ > Generate the code for the current selection
+
+In the chat, you may be prompted to allow the Figma commands like `get_code()` to run.
+
+## Feedback for the Gamut team
+
+Please let the Gamut team of any feedback you have, things like:
+
+- If you find that a new rule that you'd like implemented in this repo, please let the Gamut team know.
+- Support for another text editor/IDE.
+- Incorrect code generation
+
+If you have any other feedback or suggestions, feel free to share those as well!
diff --git a/packages/styleguide/src/lib/Molecules/Alert/Alert.mdx b/packages/styleguide/src/lib/Molecules/Alert/Alert.mdx
index 7c08412d23f..73d89850d39 100644
--- a/packages/styleguide/src/lib/Molecules/Alert/Alert.mdx
+++ b/packages/styleguide/src/lib/Molecules/Alert/Alert.mdx
@@ -62,7 +62,7 @@ Use an alert to display an important, succinct message with actions for users to
4. Dismiss button (optional)
- Use to allow users to remove the alert after they've acknowledged it or when it's no longer needed
-- Only exclude when the information must remain visible until specific conditions are met to ensure users don’t miss critical information
+- Only exclude when the information must remain visible until specific conditions are met to ensure users don't miss critical information
## Variants
diff --git a/packages/styleguide/src/static/mcp/component_playground.png b/packages/styleguide/src/static/mcp/component_playground.png
new file mode 100644
index 00000000000..bde623a0a66
Binary files /dev/null and b/packages/styleguide/src/static/mcp/component_playground.png differ
diff --git a/packages/styleguide/src/static/mcp/component_with_code_connect.png b/packages/styleguide/src/static/mcp/component_with_code_connect.png
new file mode 100644
index 00000000000..c8efb2881ea
Binary files /dev/null and b/packages/styleguide/src/static/mcp/component_with_code_connect.png differ
diff --git a/script/jest/icon-figma.js b/script/jest/icon-figma.js
new file mode 100644
index 00000000000..6500f3dff09
--- /dev/null
+++ b/script/jest/icon-figma.js
@@ -0,0 +1,45 @@
+import { client } from '@figma/code-connect';
+import fs from 'fs';
+
+async function generateIcons() {
+ // fetch components from a figma file. If the `node-id` query parameter is used,
+ // only components within those frames will be included. This is useful if your
+ // file is very large, as this will speed up the query by a lot
+ let components = await client.getComponents(
+ 'https://www.figma.com/design/ReGfRNillGABAj5SlITalN/%F0%9F%93%90-Gamut?node-id=38228-2739'
+ );
+
+ // Converts icon names from e.g `icon-32-list` to `Icon32List`
+ components = components
+ .filter(({ name }) => {
+ return name.includes('icon');
+ })
+ .map((component) => ({
+ ...component,
+ name: component.name
+ .split(/[.-]/g)
+ .map((part) => part.charAt(0).toUpperCase() + part.slice(1))
+ .join(''),
+ }));
+
+ const uniqueNames = new Set([...components.map((c) => c.name)]);
+
+ fs.writeFileSync(
+ 'icons.figma.tsx',
+ `\
+ import figma from '@figma/code-connect'
+
+ import {
+ ${Array.from(uniqueNames)
+ .map((iconName) => ` ${iconName},`)
+ .join('\n')}
+ } from './packages/gamut-icons/icons/regular'
+
+ ${components
+ .map((c) => `figma.connect(${c.name}, '${c.figmaUrl}')`)
+ .join('\n')}
+ `
+ );
+}
+
+generateIcons();
diff --git a/tsconfig.base.json b/tsconfig.base.json
index 34081b8e649..2f1d075a7bd 100644
--- a/tsconfig.base.json
+++ b/tsconfig.base.json
@@ -19,5 +19,5 @@
"strict": true,
"target": "esnext"
},
- "exclude": ["**/node_modules", "tmp"]
+ "exclude": ["**/node_modules", "tmp", "packages/code-connect"]
}