diff --git a/check-links.js b/check-links.js
index 34a3a17..793c1bb 100644
--- a/check-links.js
+++ b/check-links.js
@@ -6,6 +6,32 @@ import fetch from 'node-fetch';
const __dirname = path.dirname(fileURLToPath(import.meta.url));
+// URLs to ignore during external link checking
+const IGNORED_URLS = [
+ 'https://deploystack.io',
+ 'https://deploystack.io/*',
+ 'https://cloud.deploystack.io'
+];
+
+// Check if a URL should be ignored
+const shouldIgnoreUrl = (url) => {
+ for (const pattern of IGNORED_URLS) {
+ if (pattern.endsWith('/*')) {
+ // Handle wildcard patterns
+ const baseUrl = pattern.slice(0, -2); // Remove /*
+ if (url === baseUrl || url.startsWith(baseUrl + '/')) {
+ return true;
+ }
+ } else {
+ // Handle exact matches
+ if (url === pattern) {
+ return true;
+ }
+ }
+ }
+ return false;
+};
+
// Read a markdown file and extract all markdown links
const extractLinks = (content) => {
const linkRegex = /\[([^\]]+)\]\(([^)]+)\)/g;
@@ -82,6 +108,12 @@ const checkExternalUrl = async (url) => {
return true;
}
+ // Check if URL should be ignored
+ if (shouldIgnoreUrl(url)) {
+ console.log(` ➡️ ${url} (ignored)`);
+ return true;
+ }
+
try {
const response = await fetch(url, {
method: 'HEAD',
diff --git a/docs/development/frontend/index.mdx b/docs/development/frontend/index.mdx
index a0ca6f6..7a2bcdb 100644
--- a/docs/development/frontend/index.mdx
+++ b/docs/development/frontend/index.mdx
@@ -74,6 +74,17 @@ For table-specific implementations, refer to the [Table Design System](/developm
The frontend uses **TailwindCSS** for styling with **shadcn-vue** component library for consistent UI elements. For comprehensive styling guidelines, component patterns, and design standards, see the [UI Design System](/development/frontend/ui-design-system) documentation.
+### ⚠️ **Mandatory Design Patterns**
+
+All structured information displays must follow the **[Structured Data Display Pattern](/development/frontend/ui-design-system-structured-data)**. This includes:
+- User profiles and settings
+- Form layouts
+- Configuration displays
+- Installation details
+- Any information presented in label-value pairs
+
+This pattern ensures visual consistency across the entire application.
+
## Environment Configuration
The frontend uses a sophisticated environment variable system that works seamlessly across development and production environments. For complete details on configuring and using environment variables, see the dedicated [Environment Variables Guide](/development/frontend/environment-variables).
@@ -115,6 +126,7 @@ Continue reading the detailed guides:
- [Frontend Architecture](/development/frontend/architecture) - Application architecture, patterns, and development principles
- [UI Design System](/development/frontend/ui-design-system) - Component patterns, styling guidelines, and design standards
+- **[Structured Data Display Pattern](/development/frontend/ui-design-system-structured-data)** - **Mandatory pattern** for consistent information display
- [Environment Variables](/development/frontend/environment-variables) - Complete environment configuration guide
- [Global Event Bus](/development/frontend/event-bus) - Cross-component communication system
- [Internationalization (i18n)](/development/frontend/internationalization) - Multi-language support
diff --git a/docs/development/frontend/ui-design-system-structured-data.mdx b/docs/development/frontend/ui-design-system-structured-data.mdx
new file mode 100644
index 0000000..e3f0c86
--- /dev/null
+++ b/docs/development/frontend/ui-design-system-structured-data.mdx
@@ -0,0 +1,490 @@
+---
+title: Structured Data Display Pattern
+description: Mandatory design pattern for displaying structured information consistently throughout the DeployStack frontend using description lists.
+sidebar: Structured Data
+---
+
+# Structured Data Display Pattern
+
+This document establishes the **mandatory pattern** for displaying structured information throughout the DeployStack frontend. All structured data displays - whether read-only information or form layouts - must follow this consistent description list pattern.
+
+## Design Principle
+
+**Every piece of structured information must use the same visual pattern**: label on the left, content on the right, with consistent spacing and typography.
+
+This creates a cohesive, professional appearance across the entire application and eliminates visual inconsistency between different pages and components.
+
+## The Mandatory Pattern
+
+All structured data displays must use this HTML structure:
+
+```html
+
+
Section Title
+
Section description
+
+
+
+
+
+
Field Label
+
+ Field Content
+
+
+
+
+```
+
+### Pattern Components
+
+| Element | Classes | Purpose |
+|---------|---------|---------|
+| `` | `text-sm/6 font-medium text-gray-900` | Field label (left column) |
+| ` ` | `mt-1 text-sm/6 text-gray-700 sm:col-span-2 sm:mt-0` | Field content (right column) |
+| Container | `px-4 py-6 sm:grid sm:grid-cols-3 sm:gap-4 sm:px-0` | Responsive grid layout |
+| List | `divide-y divide-gray-100` | Visual separation between fields |
+
+## When to Use This Pattern
+
+### ✅ **Required For**
+- User profile information
+- Server configuration details
+- Installation information
+- Settings pages
+- Form layouts
+- Team management displays
+- Any structured data presentation
+
+### ❌ **Not Required For**
+- Simple text content
+- Marketing pages
+- Dashboard cards (unless showing structured data)
+- Navigation elements
+- Alerts and notifications
+
+## Implementation Examples
+
+### Read-Only Information Display
+
+```html
+
+
+
Installation Details
+
+ Information about this MCP server installation
+
+
+
+
+
+
+
+
Installation Name
+
+ {{ installation.name }}
+
+
+
+
+
+
Status
+
+
+ {{ installation.status }}
+
+
+
+
+
+
+
+
+
+```
+
+### Form Input Layout
+
+```html
+
+
+
Basic Information
+
+ Configure the basic settings for your MCP server
+
+
+
+
+
+
+
+
Server Name
+
+
+
+ A unique name for this MCP server
+
+
+
+
+
+
+
Description
+
+
+
+ Brief description of the server's functionality
+
+
+
+
+
+
+
Category
+
+
+
+
+
+
+ Productivity
+ Development
+
+
+
+ Choose the most appropriate category
+
+
+
+
+
+
+```
+
+### Complex Field Types
+
+#### Switch/Toggle Fields
+```html
+
+
Featured Server
+
+
+
+
+ {{ formData.featured ? 'Yes' : 'No' }}
+
+
+
+ Featured servers appear prominently in the catalog
+
+
+
+```
+
+#### Tag Management Fields
+```html
+
+
Tags
+
+
+
+
+ {{ tag }}
+
+
+
+
+
+
+
+
+
+
+ Tags help users discover your server
+
+
+
+```
+
+#### File Upload Fields
+```html
+
+
Configuration File
+
+
+
+
+
+ Drop your config file here or
+ browse
+
+
+
+
+ Accepted formats: .json, .yaml, .yml
+
+
+
+```
+
+## Integration with ContentWrapper
+
+When using this pattern within pages that require the ContentWrapper (tabbed content, detail pages), structure it like this:
+
+```html
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Installation Details
+
+ Detailed information about this installation
+
+
+
+
+
+
+
+```
+
+For more information about ContentWrapper usage, see the [Layout Design Patterns](/development/frontend/ui-design-system#layout-design-patterns) section.
+
+## Typography and Spacing Standards
+
+### Label Typography (dt)
+- **Font size**: `text-sm/6` (14px with 24px line-height)
+- **Font weight**: `font-medium` (500)
+- **Color**: `text-gray-900` (high contrast for readability)
+
+### Content Typography (dd)
+- **Font size**: `text-sm/6` (14px with 24px line-height)
+- **Font weight**: Regular (400)
+- **Color**: `text-gray-700` (slightly lighter than labels)
+
+### Description Text
+- **Font size**: `text-xs` (12px)
+- **Color**: `text-muted-foreground`
+- **Margin**: `mt-1` (4px top margin)
+
+### Spacing
+- **Vertical padding**: `py-6` (24px top and bottom)
+- **Horizontal padding**: `px-4` on mobile, `px-0` on desktop
+- **Grid gap**: `sm:gap-4` (16px between columns)
+
+## Migration Guide
+
+### From Traditional Form Layout
+
+**Before (Traditional Form):**
+
+```html
+
+
+
Server Name
+
+
+ Enter a unique name for the server
+
+
+
+```
+
+**After (Structured Data Pattern):**
+```html
+
+
+
+
Server Name
+
+
+
+ Enter a unique name for the server
+
+
+
+
+
+```
+
+### Migration Steps
+
+1. **Remove Label components** - Labels become ` ` elements
+2. **Wrap in description list** - Add ` ` container with dividers
+3. **Structure each field** - Use the dt/dd grid pattern
+4. **Update typography classes** - Apply standard text classes
+5. **Move descriptions** - Place help text inside `` with `mt-1`
+
+## Accessibility Features
+
+### Semantic HTML
+- Uses proper ``, ``, ` ` elements for screen readers
+- Maintains logical information hierarchy
+- Preserves form labeling with `id` and `for` attributes
+
+### Keyboard Navigation
+- All interactive elements remain keyboard accessible
+- Tab order follows natural reading flow (left to right, top to bottom)
+- Form validation and error states work normally
+
+### Screen Reader Support
+```html
+
+ Installation Name
+
+ brightdata-mcp
+
+```
+
+## Common Mistakes to Avoid
+
+### ❌ **Don't Use for Non-Structured Content**
+```html
+
+Welcome Message
+Welcome to DeployStack! This is just a paragraph...
+```
+
+### ❌ **Don't Inconsistent Typography**
+```html
+
+Field Name
+Field Value
+```
+
+### ❌ **Don't Skip the Grid Layout**
+```html
+
+
+
Field Name
+ Field Value
+
+```
+
+### ❌ **Don't Put Labels in dd**
+```html
+
+Field Name
+
+ Field Name
+
+
+```
+
+## Best Practices
+
+### ✅ **Group Related Fields**
+Use section headers to organize related information:
+
+```html
+
+
Basic Information
+
+
+
+
+
+
+
Advanced Settings
+
+
+
+
+```
+
+### ✅ **Consistent Description Text**
+Keep help text concise and consistently formatted:
+
+```html
+
+
+
+ Brief, helpful description of what this field does
+
+
+```
+
+### ✅ **Handle Empty States**
+Show appropriate messages for missing data:
+
+```html
+
+ {{ installation.description || 'No description provided' }}
+
+```
+
+## Component Examples
+
+For working examples of this pattern, see:
+- **InstallationInfo.vue** - Read-only information display
+- **BasicInfoStep.vue** - Form layout implementation
+- **UserProfile.vue** - Mixed content with badges and links
+
+## Related Documentation
+
+- [UI Design System](/development/frontend/ui-design-system) - Overall design patterns and component guidelines
+- [ContentWrapper Pattern](/development/frontend/ui-design-system#layout-design-patterns) - Mandatory wrapper for tabbed content
+- [Form Design Patterns](/development/frontend/ui-design-system#form-design-patterns) - Additional form styling guidelines
+
+---
+
+This structured data display pattern is **mandatory** for all new structured information displays and should be used when updating existing components to ensure visual consistency across the DeployStack frontend.
diff --git a/docs/self-hosted/quick-start.mdx b/docs/self-hosted/quick-start.mdx
index c486a77..dfb395b 100644
--- a/docs/self-hosted/quick-start.mdx
+++ b/docs/self-hosted/quick-start.mdx
@@ -316,10 +316,6 @@ If you need assistance:
- **[Global Settings](/global-settings)**: Configure email, auth, and more
- **[User Roles](/roles)**: Manage team permissions
-### Deploy MCP Servers
-
-- **[MCP Server Catalog](https://deploystack.io/mcp)**: Browse available servers
-
---
**🎉 Congratulations!** You now have DeployStack running. Start deploying MCP servers and streamline your AI agent infrastructure!
diff --git a/package-lock.json b/package-lock.json
index 7928181..a6911b6 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -12,7 +12,7 @@
"@types/mdx": "^2.0.13",
"fumadocs-core": "^15.6.9",
"fumadocs-mdx": "^11.7.4",
- "fumadocs-ui": "^15.6.9",
+ "fumadocs-ui": "^15.6.12",
"lucide-react": "^0.525.0",
"mdx": "^0.3.1",
"next": "^15.4.5",
@@ -22,16 +22,16 @@
"schema-dts": "^1.1.5"
},
"devDependencies": {
- "@semantic-release/github": "^11.0.3",
+ "@semantic-release/github": "^11.0.4",
"@tailwindcss/postcss": "^4.1.11",
- "@types/node": "24.2.0",
+ "@types/node": "24.3.0",
"@types/react": "^19.1.8",
"@types/react-dom": "^19.1.6",
"autoprefixer": "^10.4.21",
"markdownlint-cli": "^0.45.0",
"markdownlint-cli2": "^0.18.1",
"postcss": "^8.5.6",
- "tailwindcss": "^4.1.11",
+ "tailwindcss": "^4.1.12",
"typescript": "5.8.3"
}
},
@@ -628,31 +628,31 @@
}
},
"node_modules/@floating-ui/core": {
- "version": "1.7.1",
- "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.7.1.tgz",
- "integrity": "sha512-azI0DrjMMfIug/ExbBaeDVJXcY0a7EPvPjb2xAJPa4HeimBX+Z18HK8QQR3jb6356SnDDdxx+hinMLcJEDdOjw==",
+ "version": "1.7.3",
+ "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.7.3.tgz",
+ "integrity": "sha512-sGnvb5dmrJaKEZ+LDIpguvdX3bDlEllmv4/ClQ9awcmCZrlx5jQyyMWFM5kBI+EyNOCDDiKk8il0zeuX3Zlg/w==",
"license": "MIT",
"dependencies": {
- "@floating-ui/utils": "^0.2.9"
+ "@floating-ui/utils": "^0.2.10"
}
},
"node_modules/@floating-ui/dom": {
- "version": "1.7.1",
- "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.7.1.tgz",
- "integrity": "sha512-cwsmW/zyw5ltYTUeeYJ60CnQuPqmGwuGVhG9w0PRaRKkAyi38BT5CKrpIbb+jtahSwUl04cWzSx9ZOIxeS6RsQ==",
+ "version": "1.7.3",
+ "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.7.3.tgz",
+ "integrity": "sha512-uZA413QEpNuhtb3/iIKoYMSK07keHPYeXF02Zhd6e213j+d1NamLix/mCLxBUDW/Gx52sPH2m+chlUsyaBs/Ag==",
"license": "MIT",
"dependencies": {
- "@floating-ui/core": "^1.7.1",
- "@floating-ui/utils": "^0.2.9"
+ "@floating-ui/core": "^1.7.3",
+ "@floating-ui/utils": "^0.2.10"
}
},
"node_modules/@floating-ui/react-dom": {
- "version": "2.1.3",
- "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.1.3.tgz",
- "integrity": "sha512-huMBfiU9UnQ2oBwIhgzyIiSpVgvlDstU8CX0AF+wS+KzmYMs0J2a3GwuFHV1Lz+jlrQGeC1fF+Nv0QoumyV0bA==",
+ "version": "2.1.5",
+ "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.1.5.tgz",
+ "integrity": "sha512-HDO/1/1oH9fjj4eLgegrlH3dklZpHtUYYFiVwMUwfGvk9jWDRWqkklA2/NFScknrcNSspbV868WjXORvreDX+Q==",
"license": "MIT",
"dependencies": {
- "@floating-ui/dom": "^1.0.0"
+ "@floating-ui/dom": "^1.7.3"
},
"peerDependencies": {
"react": ">=16.8.0",
@@ -660,9 +660,9 @@
}
},
"node_modules/@floating-ui/utils": {
- "version": "0.2.9",
- "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.9.tgz",
- "integrity": "sha512-MDWhGtE+eHw5JW7lq4qhc5yRLS11ERl1c7Z6Xd0a58DozHES6EnNNwUWbMiG4J9Cgj053Bhk8zvlhFYKVhULwg==",
+ "version": "0.2.10",
+ "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.10.tgz",
+ "integrity": "sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ==",
"license": "MIT"
},
"node_modules/@formatjs/intl-localematcher": {
@@ -1600,19 +1600,19 @@
"license": "MIT"
},
"node_modules/@radix-ui/primitive": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.2.tgz",
- "integrity": "sha512-XnbHrrprsNqZKQhStrSwgRUQzoCI1glLzdw79xiZPoofhGICeZRSQ3dIxAKH1gb3OHfNf4d6f+vAv3kil2eggA==",
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.3.tgz",
+ "integrity": "sha512-JTF99U/6XIjCBo0wqkU5sK10glYe27MRRsfwoiq5zzOEZLHU3A3KCMa5X/azekYRCJ0HlwI0crAXS/5dEHTzDg==",
"license": "MIT"
},
"node_modules/@radix-ui/react-accordion": {
- "version": "1.2.11",
- "resolved": "https://registry.npmjs.org/@radix-ui/react-accordion/-/react-accordion-1.2.11.tgz",
- "integrity": "sha512-l3W5D54emV2ues7jjeG1xcyN7S3jnK3zE2zHqgn0CmMsy9lNJwmgcrmaxS+7ipw15FAivzKNzH3d5EcGoFKw0A==",
+ "version": "1.2.12",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-accordion/-/react-accordion-1.2.12.tgz",
+ "integrity": "sha512-T4nygeh9YE9dLRPhAHSeOZi7HBXo+0kYIPJXayZfvWOWA0+n3dESrZbjfDPUABkUNym6Hd+f2IR113To8D2GPA==",
"license": "MIT",
"dependencies": {
- "@radix-ui/primitive": "1.1.2",
- "@radix-ui/react-collapsible": "1.1.11",
+ "@radix-ui/primitive": "1.1.3",
+ "@radix-ui/react-collapsible": "1.1.12",
"@radix-ui/react-collection": "1.1.7",
"@radix-ui/react-compose-refs": "1.1.2",
"@radix-ui/react-context": "1.1.2",
@@ -1660,16 +1660,16 @@
}
},
"node_modules/@radix-ui/react-collapsible": {
- "version": "1.1.11",
- "resolved": "https://registry.npmjs.org/@radix-ui/react-collapsible/-/react-collapsible-1.1.11.tgz",
- "integrity": "sha512-2qrRsVGSCYasSz1RFOorXwl0H7g7J1frQtgpQgYrt+MOidtPAINHn9CPovQXb83r8ahapdx3Tu0fa/pdFFSdPg==",
+ "version": "1.1.12",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-collapsible/-/react-collapsible-1.1.12.tgz",
+ "integrity": "sha512-Uu+mSh4agx2ib1uIGPP4/CKNULyajb3p92LsVXmH2EHVMTfZWpll88XJ0j4W0z3f8NK1eYl1+Mf/szHPmcHzyA==",
"license": "MIT",
"dependencies": {
- "@radix-ui/primitive": "1.1.2",
+ "@radix-ui/primitive": "1.1.3",
"@radix-ui/react-compose-refs": "1.1.2",
"@radix-ui/react-context": "1.1.2",
"@radix-ui/react-id": "1.1.1",
- "@radix-ui/react-presence": "1.1.4",
+ "@radix-ui/react-presence": "1.1.5",
"@radix-ui/react-primitive": "2.1.3",
"@radix-ui/react-use-controllable-state": "1.2.2",
"@radix-ui/react-use-layout-effect": "1.1.1"
@@ -1746,20 +1746,20 @@
}
},
"node_modules/@radix-ui/react-dialog": {
- "version": "1.1.14",
- "resolved": "https://registry.npmjs.org/@radix-ui/react-dialog/-/react-dialog-1.1.14.tgz",
- "integrity": "sha512-+CpweKjqpzTmwRwcYECQcNYbI8V9VSQt0SNFKeEBLgfucbsLssU6Ppq7wUdNXEGb573bMjFhVjKVll8rmV6zMw==",
+ "version": "1.1.15",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-dialog/-/react-dialog-1.1.15.tgz",
+ "integrity": "sha512-TCglVRtzlffRNxRMEyR36DGBLJpeusFcgMVD9PZEzAKnUs1lKCgX5u9BmC2Yg+LL9MgZDugFFs1Vl+Jp4t/PGw==",
"license": "MIT",
"dependencies": {
- "@radix-ui/primitive": "1.1.2",
+ "@radix-ui/primitive": "1.1.3",
"@radix-ui/react-compose-refs": "1.1.2",
"@radix-ui/react-context": "1.1.2",
- "@radix-ui/react-dismissable-layer": "1.1.10",
- "@radix-ui/react-focus-guards": "1.1.2",
+ "@radix-ui/react-dismissable-layer": "1.1.11",
+ "@radix-ui/react-focus-guards": "1.1.3",
"@radix-ui/react-focus-scope": "1.1.7",
"@radix-ui/react-id": "1.1.1",
"@radix-ui/react-portal": "1.1.9",
- "@radix-ui/react-presence": "1.1.4",
+ "@radix-ui/react-presence": "1.1.5",
"@radix-ui/react-primitive": "2.1.3",
"@radix-ui/react-slot": "1.2.3",
"@radix-ui/react-use-controllable-state": "1.2.2",
@@ -1797,12 +1797,12 @@
}
},
"node_modules/@radix-ui/react-dismissable-layer": {
- "version": "1.1.10",
- "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.1.10.tgz",
- "integrity": "sha512-IM1zzRV4W3HtVgftdQiiOmA0AdJlCtMLe00FXaHwgt3rAnNsIyDqshvkIW3hj/iu5hu8ERP7KIYki6NkqDxAwQ==",
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.1.11.tgz",
+ "integrity": "sha512-Nqcp+t5cTB8BinFkZgXiMJniQH0PsUt2k51FUhbdfeKvc4ACcG2uQniY/8+h1Yv6Kza4Q7lD7PQV0z0oicE0Mg==",
"license": "MIT",
"dependencies": {
- "@radix-ui/primitive": "1.1.2",
+ "@radix-ui/primitive": "1.1.3",
"@radix-ui/react-compose-refs": "1.1.2",
"@radix-ui/react-primitive": "2.1.3",
"@radix-ui/react-use-callback-ref": "1.1.1",
@@ -1824,9 +1824,9 @@
}
},
"node_modules/@radix-ui/react-focus-guards": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-guards/-/react-focus-guards-1.1.2.tgz",
- "integrity": "sha512-fyjAACV62oPV925xFCrH8DR5xWhg9KYtJT4s3u54jxp+L/hbpTY2kIeEFFbFe+a/HCE94zGQMZLIpVTPVZDhaA==",
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-guards/-/react-focus-guards-1.1.3.tgz",
+ "integrity": "sha512-0rFg/Rj2Q62NCm62jZw0QX7a3sz6QCQU0LpZdNrJX8byRGaGVTqbrW9jAoIAHyMQqsNpeZ81YgSizOt5WXq0Pw==",
"license": "MIT",
"peerDependencies": {
"@types/react": "*",
@@ -1882,19 +1882,19 @@
}
},
"node_modules/@radix-ui/react-navigation-menu": {
- "version": "1.2.13",
- "resolved": "https://registry.npmjs.org/@radix-ui/react-navigation-menu/-/react-navigation-menu-1.2.13.tgz",
- "integrity": "sha512-WG8wWfDiJlSF5hELjwfjSGOXcBR/ZMhBFCGYe8vERpC39CQYZeq1PQ2kaYHdye3V95d06H89KGMsVCIE4LWo3g==",
+ "version": "1.2.14",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-navigation-menu/-/react-navigation-menu-1.2.14.tgz",
+ "integrity": "sha512-YB9mTFQvCOAQMHU+C/jVl96WmuWeltyUEpRJJky51huhds5W2FQr1J8D/16sQlf0ozxkPK8uF3niQMdUwZPv5w==",
"license": "MIT",
"dependencies": {
- "@radix-ui/primitive": "1.1.2",
+ "@radix-ui/primitive": "1.1.3",
"@radix-ui/react-collection": "1.1.7",
"@radix-ui/react-compose-refs": "1.1.2",
"@radix-ui/react-context": "1.1.2",
"@radix-ui/react-direction": "1.1.1",
- "@radix-ui/react-dismissable-layer": "1.1.10",
+ "@radix-ui/react-dismissable-layer": "1.1.11",
"@radix-ui/react-id": "1.1.1",
- "@radix-ui/react-presence": "1.1.4",
+ "@radix-ui/react-presence": "1.1.5",
"@radix-ui/react-primitive": "2.1.3",
"@radix-ui/react-use-callback-ref": "1.1.1",
"@radix-ui/react-use-controllable-state": "1.2.2",
@@ -1918,21 +1918,21 @@
}
},
"node_modules/@radix-ui/react-popover": {
- "version": "1.1.14",
- "resolved": "https://registry.npmjs.org/@radix-ui/react-popover/-/react-popover-1.1.14.tgz",
- "integrity": "sha512-ODz16+1iIbGUfFEfKx2HTPKizg2MN39uIOV8MXeHnmdd3i/N9Wt7vU46wbHsqA0xoaQyXVcs0KIlBdOA2Y95bw==",
+ "version": "1.1.15",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-popover/-/react-popover-1.1.15.tgz",
+ "integrity": "sha512-kr0X2+6Yy/vJzLYJUPCZEc8SfQcf+1COFoAqauJm74umQhta9M7lNJHP7QQS3vkvcGLQUbWpMzwrXYwrYztHKA==",
"license": "MIT",
"dependencies": {
- "@radix-ui/primitive": "1.1.2",
+ "@radix-ui/primitive": "1.1.3",
"@radix-ui/react-compose-refs": "1.1.2",
"@radix-ui/react-context": "1.1.2",
- "@radix-ui/react-dismissable-layer": "1.1.10",
- "@radix-ui/react-focus-guards": "1.1.2",
+ "@radix-ui/react-dismissable-layer": "1.1.11",
+ "@radix-ui/react-focus-guards": "1.1.3",
"@radix-ui/react-focus-scope": "1.1.7",
"@radix-ui/react-id": "1.1.1",
- "@radix-ui/react-popper": "1.2.7",
+ "@radix-ui/react-popper": "1.2.8",
"@radix-ui/react-portal": "1.1.9",
- "@radix-ui/react-presence": "1.1.4",
+ "@radix-ui/react-presence": "1.1.5",
"@radix-ui/react-primitive": "2.1.3",
"@radix-ui/react-slot": "1.2.3",
"@radix-ui/react-use-controllable-state": "1.2.2",
@@ -1955,9 +1955,9 @@
}
},
"node_modules/@radix-ui/react-popper": {
- "version": "1.2.7",
- "resolved": "https://registry.npmjs.org/@radix-ui/react-popper/-/react-popper-1.2.7.tgz",
- "integrity": "sha512-IUFAccz1JyKcf/RjB552PlWwxjeCJB8/4KxT7EhBHOJM+mN7LdW+B3kacJXILm32xawcMMjb2i0cIZpo+f9kiQ==",
+ "version": "1.2.8",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-popper/-/react-popper-1.2.8.tgz",
+ "integrity": "sha512-0NJQ4LFFUuWkE7Oxf0htBKS6zLkkjBH+hM1uk7Ng705ReR8m/uelduy1DBo0PyBXPKVnBA6YBlU94MBGXrSBCw==",
"license": "MIT",
"dependencies": {
"@floating-ui/react-dom": "^2.0.0",
@@ -2011,9 +2011,9 @@
}
},
"node_modules/@radix-ui/react-presence": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.1.4.tgz",
- "integrity": "sha512-ueDqRbdc4/bkaQT3GIpLQssRlFgWaL/U2z/S31qRwwLWoxHLgry3SIfCwhxeQNbirEUXFa+lq3RL3oBYXtcmIA==",
+ "version": "1.1.5",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.1.5.tgz",
+ "integrity": "sha512-/jfEwNDdQVBCNvjkGit4h6pMOzq8bHkopq458dPt2lMjx+eBQUohZNG9A7DtO/O5ukSbxuaNGXMjHicgwy6rQQ==",
"license": "MIT",
"dependencies": {
"@radix-ui/react-compose-refs": "1.1.2",
@@ -2058,12 +2058,12 @@
}
},
"node_modules/@radix-ui/react-roving-focus": {
- "version": "1.1.10",
- "resolved": "https://registry.npmjs.org/@radix-ui/react-roving-focus/-/react-roving-focus-1.1.10.tgz",
- "integrity": "sha512-dT9aOXUen9JSsxnMPv/0VqySQf5eDQ6LCk5Sw28kamz8wSOW2bJdlX2Bg5VUIIcV+6XlHpWTIuTPCf/UNIyq8Q==",
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-roving-focus/-/react-roving-focus-1.1.11.tgz",
+ "integrity": "sha512-7A6S9jSgm/S+7MdtNDSb+IU859vQqJ/QAtcYQcfFC6W8RS4IxIZDldLR0xqCFZ6DCyrQLjLPsxtTNch5jVA4lA==",
"license": "MIT",
"dependencies": {
- "@radix-ui/primitive": "1.1.2",
+ "@radix-ui/primitive": "1.1.3",
"@radix-ui/react-collection": "1.1.7",
"@radix-ui/react-compose-refs": "1.1.2",
"@radix-ui/react-context": "1.1.2",
@@ -2089,17 +2089,17 @@
}
},
"node_modules/@radix-ui/react-scroll-area": {
- "version": "1.2.9",
- "resolved": "https://registry.npmjs.org/@radix-ui/react-scroll-area/-/react-scroll-area-1.2.9.tgz",
- "integrity": "sha512-YSjEfBXnhUELsO2VzjdtYYD4CfQjvao+lhhrX5XsHD7/cyUNzljF1FHEbgTPN7LH2MClfwRMIsYlqTYpKTTe2A==",
+ "version": "1.2.10",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-scroll-area/-/react-scroll-area-1.2.10.tgz",
+ "integrity": "sha512-tAXIa1g3sM5CGpVT0uIbUx/U3Gs5N8T52IICuCtObaos1S8fzsrPXG5WObkQN3S6NVl6wKgPhAIiBGbWnvc97A==",
"license": "MIT",
"dependencies": {
"@radix-ui/number": "1.1.1",
- "@radix-ui/primitive": "1.1.2",
+ "@radix-ui/primitive": "1.1.3",
"@radix-ui/react-compose-refs": "1.1.2",
"@radix-ui/react-context": "1.1.2",
"@radix-ui/react-direction": "1.1.1",
- "@radix-ui/react-presence": "1.1.4",
+ "@radix-ui/react-presence": "1.1.5",
"@radix-ui/react-primitive": "2.1.3",
"@radix-ui/react-use-callback-ref": "1.1.1",
"@radix-ui/react-use-layout-effect": "1.1.1"
@@ -2138,18 +2138,18 @@
}
},
"node_modules/@radix-ui/react-tabs": {
- "version": "1.1.12",
- "resolved": "https://registry.npmjs.org/@radix-ui/react-tabs/-/react-tabs-1.1.12.tgz",
- "integrity": "sha512-GTVAlRVrQrSw3cEARM0nAx73ixrWDPNZAruETn3oHCNP6SbZ/hNxdxp+u7VkIEv3/sFoLq1PfcHrl7Pnp0CDpw==",
+ "version": "1.1.13",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-tabs/-/react-tabs-1.1.13.tgz",
+ "integrity": "sha512-7xdcatg7/U+7+Udyoj2zodtI9H/IIopqo+YOIcZOq1nJwXWBZ9p8xiu5llXlekDbZkca79a/fozEYQXIA4sW6A==",
"license": "MIT",
"dependencies": {
- "@radix-ui/primitive": "1.1.2",
+ "@radix-ui/primitive": "1.1.3",
"@radix-ui/react-context": "1.1.2",
"@radix-ui/react-direction": "1.1.1",
"@radix-ui/react-id": "1.1.1",
- "@radix-ui/react-presence": "1.1.4",
+ "@radix-ui/react-presence": "1.1.5",
"@radix-ui/react-primitive": "2.1.3",
- "@radix-ui/react-roving-focus": "1.1.10",
+ "@radix-ui/react-roving-focus": "1.1.11",
"@radix-ui/react-use-controllable-state": "1.2.2"
},
"peerDependencies": {
@@ -2375,9 +2375,9 @@
}
},
"node_modules/@semantic-release/github": {
- "version": "11.0.3",
- "resolved": "https://registry.npmjs.org/@semantic-release/github/-/github-11.0.3.tgz",
- "integrity": "sha512-T2fKUyFkHHkUNa5XNmcsEcDPuG23hwBKptfUVcFXDVG2cSjXXZYDOfVYwfouqbWo/8UefotLaoGfQeK+k3ep6A==",
+ "version": "11.0.4",
+ "resolved": "https://registry.npmjs.org/@semantic-release/github/-/github-11.0.4.tgz",
+ "integrity": "sha512-fU/nLSjkp9DmB0h7FVO5imhhWJMvq2LjD4+3lz3ZAzpDLY9+KYwC+trJ+g7LbZeJv9y3L9fSFSg2DduUpiT6bw==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -2623,6 +2623,13 @@
"tailwindcss": "4.1.11"
}
},
+ "node_modules/@tailwindcss/node/node_modules/tailwindcss": {
+ "version": "4.1.11",
+ "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.1.11.tgz",
+ "integrity": "sha512-2E9TBm6MDD/xKYe+dvJZAmg3yxIEDNRc0jwlNyDg/4Fil2QcSLjFKGVff0lAf1jjeaArlG/M75Ey/EYr/OJtBA==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/@tailwindcss/oxide": {
"version": "4.1.11",
"resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.1.11.tgz",
@@ -2943,6 +2950,13 @@
"tailwindcss": "4.1.11"
}
},
+ "node_modules/@tailwindcss/postcss/node_modules/tailwindcss": {
+ "version": "4.1.11",
+ "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.1.11.tgz",
+ "integrity": "sha512-2E9TBm6MDD/xKYe+dvJZAmg3yxIEDNRc0jwlNyDg/4Fil2QcSLjFKGVff0lAf1jjeaArlG/M75Ey/EYr/OJtBA==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/@types/debug": {
"version": "4.1.12",
"resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz",
@@ -3005,9 +3019,9 @@
"license": "MIT"
},
"node_modules/@types/node": {
- "version": "24.2.0",
- "resolved": "https://registry.npmjs.org/@types/node/-/node-24.2.0.tgz",
- "integrity": "sha512-3xyG3pMCq3oYCNg7/ZP+E1ooTaGB4cG8JWRsqqOYQdbWNY4zbaV0Ennrd7stjiJEFZCaybcIgpTjJWHRfBSIDw==",
+ "version": "24.3.0",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-24.3.0.tgz",
+ "integrity": "sha512-aPTXCrfwnDLj4VvXrm+UUCQjNEvJgNA8s5F1cvwQU+3KNltTOkBm1j30uNLyqqPNe7gE3KFzImYoZEfLhp4Yow==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -4998,9 +5012,9 @@
}
},
"node_modules/fumadocs-core": {
- "version": "15.6.9",
- "resolved": "https://registry.npmjs.org/fumadocs-core/-/fumadocs-core-15.6.9.tgz",
- "integrity": "sha512-GVrJ2C2fch3KfNz3utqvF2CeZ7Uc947lfo7Deq1mKhWlH+HY3RSUM9MMecRl+uTzu9TNWPCUwj9q0XSUBh5VbQ==",
+ "version": "15.6.12",
+ "resolved": "https://registry.npmjs.org/fumadocs-core/-/fumadocs-core-15.6.12.tgz",
+ "integrity": "sha512-QlnDcBNk+CbnX8jxa9EdWMWy6CJPNxAyLGhA2Zk+ia35kQEbATI9xaTp2oDObuqb2qH7VRD0Ild/e56dSlcxTQ==",
"license": "MIT",
"dependencies": {
"@formatjs/intl-localematcher": "^0.6.1",
@@ -5112,23 +5126,23 @@
}
},
"node_modules/fumadocs-ui": {
- "version": "15.6.9",
- "resolved": "https://registry.npmjs.org/fumadocs-ui/-/fumadocs-ui-15.6.9.tgz",
- "integrity": "sha512-4zQcWqBJx7DuJn3IWAVrRY7o7Xx6DsScq3U8R8Qu2EJOuioJHotyLoVldSaB3wLioxtR7ito6866LZDp3oci6A==",
+ "version": "15.6.12",
+ "resolved": "https://registry.npmjs.org/fumadocs-ui/-/fumadocs-ui-15.6.12.tgz",
+ "integrity": "sha512-1DGH5dwtA8XLDP8d3Y2L+/zPqASV7XlD+zj/OfXsF/0OvJT1gIAe1TL8CRlmKeUkTnOjGbvOMg/805iwDvXMFg==",
"license": "MIT",
"dependencies": {
- "@radix-ui/react-accordion": "^1.2.11",
- "@radix-ui/react-collapsible": "^1.1.11",
- "@radix-ui/react-dialog": "^1.1.14",
+ "@radix-ui/react-accordion": "^1.2.12",
+ "@radix-ui/react-collapsible": "^1.1.12",
+ "@radix-ui/react-dialog": "^1.1.15",
"@radix-ui/react-direction": "^1.1.1",
- "@radix-ui/react-navigation-menu": "^1.2.13",
- "@radix-ui/react-popover": "^1.1.14",
- "@radix-ui/react-presence": "^1.1.4",
- "@radix-ui/react-scroll-area": "^1.2.9",
+ "@radix-ui/react-navigation-menu": "^1.2.14",
+ "@radix-ui/react-popover": "^1.1.15",
+ "@radix-ui/react-presence": "^1.1.5",
+ "@radix-ui/react-scroll-area": "^1.2.10",
"@radix-ui/react-slot": "^1.2.3",
- "@radix-ui/react-tabs": "^1.1.12",
+ "@radix-ui/react-tabs": "^1.1.13",
"class-variance-authority": "^0.7.1",
- "fumadocs-core": "15.6.9",
+ "fumadocs-core": "15.6.12",
"lodash.merge": "^4.6.2",
"next-themes": "^0.4.6",
"postcss-selector-parser": "^7.1.0",
@@ -13023,10 +13037,11 @@
}
},
"node_modules/tailwindcss": {
- "version": "4.1.11",
- "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.1.11.tgz",
- "integrity": "sha512-2E9TBm6MDD/xKYe+dvJZAmg3yxIEDNRc0jwlNyDg/4Fil2QcSLjFKGVff0lAf1jjeaArlG/M75Ey/EYr/OJtBA==",
- "devOptional": true
+ "version": "4.1.12",
+ "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.1.12.tgz",
+ "integrity": "sha512-DzFtxOi+7NsFf7DBtI3BJsynR+0Yp6etH+nRPTbpWnS2pZBaSksv/JGctNwSWzbFjp0vxSqknaUylseZqMDGrA==",
+ "devOptional": true,
+ "license": "MIT"
},
"node_modules/tapable": {
"version": "2.2.2",
diff --git a/package.json b/package.json
index 6c137b0..45d485d 100644
--- a/package.json
+++ b/package.json
@@ -17,7 +17,7 @@
"@types/mdx": "^2.0.13",
"fumadocs-core": "^15.6.9",
"fumadocs-mdx": "^11.7.4",
- "fumadocs-ui": "^15.6.9",
+ "fumadocs-ui": "^15.6.12",
"lucide-react": "^0.525.0",
"mdx": "^0.3.1",
"next": "^15.4.5",
@@ -27,16 +27,16 @@
"schema-dts": "^1.1.5"
},
"devDependencies": {
- "@semantic-release/github": "^11.0.3",
+ "@semantic-release/github": "^11.0.4",
"@tailwindcss/postcss": "^4.1.11",
- "@types/node": "24.2.0",
+ "@types/node": "24.3.0",
"@types/react": "^19.1.8",
"@types/react-dom": "^19.1.6",
"autoprefixer": "^10.4.21",
"markdownlint-cli": "^0.45.0",
"markdownlint-cli2": "^0.18.1",
"postcss": "^8.5.6",
- "tailwindcss": "^4.1.11",
+ "tailwindcss": "^4.1.12",
"typescript": "5.8.3"
}
}