From 5b0498797cbe142e85cccd15b54abfd6c1eaca90 Mon Sep 17 00:00:00 2001 From: Jordan Violet Date: Tue, 17 Jun 2025 15:34:08 -0400 Subject: [PATCH 1/9] updated homepage with new product sections, product names not yet updated --- docusaurus.config.js | 187 +++++------ .../CommunityHighlights/styles.module.css | 5 +- src/components/HomepageFeatures/index.js | 317 ++++++++++++------ .../HomepageFeatures/styles.module.css | 305 +++++++++++++++++ 4 files changed, 599 insertions(+), 215 deletions(-) diff --git a/docusaurus.config.js b/docusaurus.config.js index 68bf383621..0a399410e8 100644 --- a/docusaurus.config.js +++ b/docusaurus.config.js @@ -83,6 +83,23 @@ const config = { tagline: 'Documentation for Netwrix Products', favicon: 'img/branding/favicon.ico', + scripts: [ + { + src: "https://widget.kapa.ai/kapa-widget.bundle.js", + "data-website-id": "c8052612-e9cf-49f8-b7a4-e717c6adc398", + "data-project-name": "Netwrix", + "data-project-color": "#F5F5F5", + "data-project-logo": "https://img.netwrix.com/elements/social_communities/netwrix_blog.svg", + "data-user-analytics-cookie-enabled": "true", + "data-modal-title": "Netwrix Help Center AI Assistant", + "data-modal-example-questions-title": "Try asking me...", + "data-modal-disclaimer": "This **AI assistant answers Netwrix questions** using the documentation", + "data-modal-example-questions": "How to reduce Audit DB size?,How to scan for sensitive data?,How to migrate NEA to new server?,How to upload archive to SQL DB?", + "data-button-text-color": "#E32C2D", + async: true, + }, + ], + // Set the production url of your site here // Use environment variable for dynamic URL configuration url: process.env.RENDER_EXTERNAL_URL || 'http://localhost:3000', @@ -771,177 +788,139 @@ const config = { items: [ { type: 'dropdown', - label: 'Security Admin', + label: 'Identity', position: 'left', items: [ { - label: '1Secure', - to: '/docs/1secure', - }, - { - label: 'Access Analyzer - 12.0', - to: '/docs/accessanalyzer/12.0', - }, - { - label: 'Access Analyzer - 11.6', - to: '/docs/accessanalyzer/11.6', - }, - { - label: 'Activity Monitor - 8.0', - to: '/docs/activitymonitor/8.0', - }, - { - label: 'Activity Monitor - 7.1', - to: '/docs/activitymonitor/7.1', + label: 'Product Name', + to: '#', }, { - label: 'Auditor - 10.7', - to: '/docs/auditor/10.7', + label: 'Product Name', + to: '#', }, { - label: 'Auditor - 10.6', - to: '/docs/auditor/10.6', + label: 'Product Name', + to: '#', }, { - label: 'Threat Manager - 3.0', - to: '/docs/threatmanager/3.0', + label: 'Product Name', + to: '#', }, ], }, { type: 'dropdown', - label: 'Identity & Access', + label: 'Privilege', position: 'left', items: [ { - label: 'Access Information Center - 12.0', - to: '/docs/accessinformationcenter/12.0', + label: 'Product Name', + to: '#', }, { - label: 'Access Information Center - 11.6', - to: '/docs/accessinformationcenter/11.6', + label: 'Product Name', + to: '#', }, { - label: 'Group ID - 11.1', - to: '/docs/groupid/11.1', + label: 'Product Name', + to: '#', }, { - label: 'Group ID - 11.0', - to: '/docs/groupid/11.0', - }, - { - label: 'Password Policy Enforcer - 11.0', - to: '/docs/passwordpolicyenforcer/11.0', - }, - { - label: 'Password Policy Enforcer - 10.2', - to: '/docs/passwordpolicyenforcer/10.2', - }, - { - label: 'Password Reset - 3.3', - to: '/docs/passwordreset/3.3', - }, - { - label: 'Password Reset - 3.23', - to: '/docs/passwordreset/3.23', - }, - { - label: 'Password Secure - 9.2', - to: '/docs/passwordsecure/9.2', - }, - { - label: 'Password Secure - 9.1', - to: '/docs/passwordsecure/9.1', - }, - { - label: 'Privilege Secure - 4.2', - to: '/docs/privilegesecure/4.2', - }, - { - label: 'Privilege Secure - 4.1', - to: '/docs/privilegesecure/4.1', + label: 'Product Name', + to: '#', }, ], }, { type: 'dropdown', - label: 'Compliance', + label: 'Directory', position: 'left', items: [ { - label: 'Change Tracker - 8.1', - to: '/docs/changetracker/8.1', + label: 'Product Name', + to: '#', }, { - label: 'Change Tracker - 8.0', - to: '/docs/changetracker/8.0', + label: 'Product Name', + to: '#', }, { - label: 'StrongPoint for NetSuite', - to: '/docs/strongpointfornetsuite', + label: 'Product Name', + to: '#', }, { - label: 'StrongPoint for Salesforce', - to: '/docs/strongpointforsalesforce', - }, - { - label: 'StrongPoint NetSuite Flashlight', - to: '/docs/strongpointnetsuiteflashlight', + label: 'Product Name', + to: '#', }, + ], + }, + { + type: 'dropdown', + label: 'Endpoint', + position: 'left', + items: [ { - label: 'StrongPoint Salesforce Flashlight', - to: '/docs/strongpointsalesforceflashlight', + label: 'Product Name', + to: '#', }, { - label: 'Data Classification - 5.7', - to: '/docs/dataclassification/5.7', + label: 'Product Name', + to: '#', }, { - label: 'Data Classification - 5.6.2', - to: '/docs/dataclassification/5.6.2', + label: 'Product Name', + to: '#', }, { - label: 'Recovery for Active Directory - 2.6', - to: '/docs/recoveryforactivedirectory/2.6', + label: 'Product Name', + to: '#', }, ], }, { type: 'dropdown', - label: 'Endpoint', + label: 'DSPM', position: 'left', items: [ { - label: 'Endpoint Protector - 5.9.4.2', - to: '/docs/endpointprotector/5.9.4.2', + label: 'Product Name', + to: '#', }, { - label: 'Endpoint Protector - 5.9.4', - to: '/docs/endpointprotector/5.9.4', + label: 'Product Name', + to: '#', }, { - label: 'PolicyPak', - to: '/docs/policypak', + label: 'Product Name', + to: '#', }, { - label: 'Threat Prevention - 7.5', - to: '/docs/threatprevention/7.5', + label: 'Product Name', + to: '#', }, + ], + }, + { + type: 'dropdown', + label: 'ITDR', + position: 'left', + items: [ { - label: 'Threat Prevention - 7.4', - to: '/docs/threatprevention/7.4', + label: 'Product Name', + to: '#', }, { - label: 'UserCube - 6.2', - to: '/docs/usercube/6.2', + label: 'Product Name', + to: '#', }, { - label: 'UserCube - 6.1', - to: '/docs/usercube/6.1', + label: 'Product Name', + to: '#', }, { - label: 'UserCube SaaS', - to: '/docs/usercube_saas', + label: 'Product Name', + to: '#', }, ], }, diff --git a/src/components/CommunityHighlights/styles.module.css b/src/components/CommunityHighlights/styles.module.css index ecca1f84f8..f1a62b9801 100644 --- a/src/components/CommunityHighlights/styles.module.css +++ b/src/components/CommunityHighlights/styles.module.css @@ -42,7 +42,7 @@ } .carouselContainer { - margin-bottom: 2rem; + margin-bottom: 3rem; position: relative; } @@ -69,7 +69,8 @@ display: flex; justify-content: center; gap: 0.5rem; - margin-top: 1rem; + margin-top: 1.5rem; + margin-bottom: 0.5rem; } .indicator { diff --git a/src/components/HomepageFeatures/index.js b/src/components/HomepageFeatures/index.js index 55fb347622..65b9cd075f 100644 --- a/src/components/HomepageFeatures/index.js +++ b/src/components/HomepageFeatures/index.js @@ -38,191 +38,187 @@ const SECTION_TITLES = [ */ const ProductCategories = [ { - title: 'Identity Management', + title: 'Identity', description: 'Comprehensive identity and user management solutions', icon: '👤', products: [ { - name: 'UserCube', - description: 'User provisioning and management', - link: '/docs/usercube', + name: 'Access Analyzer', + description: 'Analyze and audit file system permissions', + link: '/docs/accessanalyzer/12.0', + versions: ['12.0', '11.6'], + displayType: 'badge' }, { - name: 'UserCube SaaS', - description: 'Cloud-based user management', - link: '/docs/usercube_saas', + name: 'Access Information Center', + description: 'Centralized access information management', + link: '/docs/accessinformationcenter/12.0', + versions: ['12.0', '11.6'], + displayType: 'badge' }, { - name: 'GroupID', + name: 'Group ID', description: 'Active Directory group management', - link: '/docs/groupid', + link: '/docs/groupid/11.1', + versions: ['11.1', '11.0'], + displayType: 'badge' }, { - name: 'StrongPoint', - description: 'Platform governance and compliance', - link: '/docs/strongpointfornetsuite', + name: 'UserCube', + description: 'User provisioning and management', + link: '/docs/usercube/6.2', + versions: ['6.2', '6.1'], + displayType: 'badge' }, ], }, { - title: 'Privileged Access Management (PAM)', + title: 'Privilege', description: 'Control and monitor privileged access to critical systems', icon: '🔐', products: [ { - name: 'Privilege Secure', - description: 'Privileged access management', - link: '/docs/privilegesecure', + name: 'Password Policy Enforcer', + description: 'Enforce strong password policies', + link: '/docs/passwordpolicyenforcer/11.0', + versions: ['11.0', '10.2'], + displayType: 'badge' }, { - name: 'Endpoint Privilege Manager', - description: 'Endpoint privilege management', - link: '/docs/policypak', + name: 'Password Reset', + description: 'Self-service password reset solution', + link: '/docs/passwordreset/3.3', + versions: ['3.3', '3.23'], + displayType: 'badge' }, { name: 'Password Secure', description: 'Secure password management', - link: '/docs/passwordsecure', + link: '/docs/passwordsecure/9.2', + versions: ['9.2', '9.1'], + displayType: 'badge' + }, + { + name: 'Privilege Secure', + description: 'Privileged access management', + link: '/docs/privilegesecure/4.2', + versions: ['4.2', '4.1'], + displayType: 'badge' }, ], }, { - title: 'Directory Management', + title: 'Directory', description: 'Active Directory management and password policy enforcement', icon: '📁', products: [ + { + name: 'Activity Monitor', + description: 'Track user activities across IT infrastructure', + link: '/docs/activitymonitor/8.0', + versions: ['8.0', '7.1'], + displayType: 'badge' + }, { name: 'Auditor', description: 'Comprehensive IT infrastructure auditing', - link: '/docs/auditor', + link: '/docs/auditor/10.7', + versions: ['10.7', '10.6'], + displayType: 'badge' }, { - name: 'GroupID', - description: 'Active Directory group management', - link: '/docs/groupid', + name: 'Recovery for Active Directory', + description: 'Active Directory backup and recovery', + link: '/docs/recoveryforactivedirectory/2.6', }, { - name: 'Password Policy Enforcer', - description: 'Enforce strong password policies', - link: '/docs/passwordpolicyenforcer', + name: 'PolicyPak', + description: 'Group Policy management and enforcement', + link: '/docs/policypak', }, ], }, { - title: 'Endpoint Management', + title: 'Endpoint', description: 'Comprehensive endpoint protection and policy management', icon: '💻', products: [ { name: 'Endpoint Protector', description: 'Comprehensive endpoint security', - link: '/docs/endpointprotector', - }, - { - name: 'PolicyPak', - description: 'Group Policy management and enforcement', - link: '/docs/policypak', + link: '/docs/endpointprotector/5.9.4.2', + versions: ['5.9.4.2', '5.9.4'], + displayType: 'badge' }, { name: 'Change Tracker', description: 'Real-time change monitoring and alerts', - link: '/docs/changetracker', + link: '/docs/changetracker/8.1', + versions: ['8.1', '8.0'], + displayType: 'badge' + }, + { + name: 'UserCube SaaS', + description: 'Cloud-based user management', + link: '/docs/usercube_saas', + }, + { + name: 'Product Name', + description: 'Product description placeholder', + link: '#', }, ], }, { - title: 'Data Security Posture Management (DSPM)', + title: 'DSPM', description: 'Protect and classify your organization\'s sensitive data', icon: '🛡️', products: [ { - name: '1Secure', - description: 'Cloud-based security monitoring and compliance', - link: '/docs/1secure', + name: 'Data Classification', + description: 'Classify and protect sensitive data', + link: '/docs/dataclassification/5.7', + versions: ['5.7', '5.6.2'], + displayType: 'badge' }, { - name: 'Auditor', - description: 'Comprehensive IT infrastructure auditing', - link: '/docs/auditor', + name: 'StrongPoint for NetSuite', + description: 'NetSuite change management and compliance', + link: '/docs/strongpointfornetsuite', }, { - name: 'Access Analyzer', - description: 'Analyze and audit file system permissions', - link: '/docs/accessanalyzer', + name: 'StrongPoint for Salesforce', + description: 'Salesforce change management platform', + link: '/docs/strongpointforsalesforce', }, { - name: 'Data Classification', - description: 'Classify and protect sensitive data', - link: '/docs/dataclassification', + name: 'StrongPoint NetSuite Flashlight', + description: 'Lightweight NetSuite documentation and analysis', + link: '/docs/strongpointnetsuiteflashlight', }, ], }, { - title: 'Identity Threat Detection & Response (ITDR)', + title: 'ITDR', description: 'Advanced threat detection and incident response capabilities', icon: '🚨', products: [ - { - name: 'PingCastle', - description: 'Active Directory security assessment', - link: '/docs/pingcastle', - }, - { - name: 'Access Analyzer', - description: 'Analyze and audit file system permissions', - link: '/docs/accessanalyzer', - }, - { - name: 'Threat Manager', - description: 'Advanced threat detection and response', - link: '/docs/threatmanager', - }, { name: 'Threat Prevention', description: 'Proactive threat prevention', - link: '/docs/threatprevention', + link: '/docs/threatprevention/7.5', + versions: ['7.5', '7.4'], + displayType: 'badge' }, { - name: 'Recovery for Active Directory', - description: 'Active Directory backup and recovery', - link: '/docs/recoveryforactivedirectory', - }, - ], - }, - { - title: 'Other', - description: 'Additional security and management tools', - icon: '🔧', - products: [ - { - name: 'Access Information Center', - description: 'Centralized access information management', - link: '/docs/accessinformationcenter', - }, - { - name: 'Activity Monitor', - description: 'Track user activities across IT infrastructure', - link: '/docs/activitymonitor', - }, - { - name: 'Password Reset', - description: 'Self-service password reset solution', - link: '/docs/passwordreset', - }, - { - name: 'StrongPoint for NetSuite', - description: 'NetSuite change management and compliance', - link: '/docs/strongpointfornetsuite', - }, - { - name: 'StrongPoint for Salesforce', - description: 'Salesforce change management platform', - link: '/docs/strongpointforsalesforce', + name: 'Threat Manager', + description: 'Advanced threat detection and response', + link: '/docs/threatmanager/3.0', }, { - name: 'StrongPoint NetSuite Flashlight', - description: 'Lightweight NetSuite documentation and analysis', - link: '/docs/strongpointnetsuiteflashlight', + name: '1Secure', + description: 'Cloud-based security monitoring and compliance', + link: '/docs/1secure', }, { name: 'StrongPoint Salesforce Flashlight', @@ -233,6 +229,113 @@ const ProductCategories = [ }, ]; +/** + * Renders a product card with version display based on displayType + */ +function ProductCard({ product, idx }) { + const hasVersions = product.versions && product.versions.length > 0; + + if (!hasVersions) { + // Standard product card without versions + return ( + +

{product.name}

+

{product.description}

+ Learn more → + + ); + } + + const renderVersionDisplay = () => { + switch (product.displayType) { + case 'diagonal': + return ( +
+
{product.versions[0]}
+
{product.versions[1]}
+
+ ); + + case 'stacked': + return ( +
+ {product.versions.map((version, i) => ( +
v{version}
+ ))} +
+ ); + + case 'badge': + return ( +
+ {product.versions.map((version, i) => ( + v{version} + ))} +
+ ); + + case 'badge-classic': + return ( +
+ {product.versions.map((version, i) => ( + v{version} + ))} +
+ ); + + case 'badge-modern': + return ( +
+ {product.versions.map((version, i) => ( + v{version} + ))} +
+ ); + + case 'badge-minimal': + return ( +
+ {product.versions.map((version, i) => ( + {version} + ))} +
+ ); + + case 'badge-gradient': + return ( +
+ {product.versions.map((version, i) => ( + v{version} + ))} +
+ ); + + case 'tabs': + return ( +
+ {product.versions.map((version, i) => ( +
v{version}
+ ))} +
+ ); + + default: + return null; + } + }; + + return ( + + {renderVersionDisplay()} +
+

{product.name}

+

{product.description}

+ Learn more → +
+ + ); +} + /** * Renders a single product category with its products * Displays category info and a grid of product cards @@ -251,11 +354,7 @@ function ProductCategory({ title, description, icon, products }) {
{products.map((product, idx) => ( - -

{product.name}

-

{product.description}

- Learn more → - + ))}
diff --git a/src/components/HomepageFeatures/styles.module.css b/src/components/HomepageFeatures/styles.module.css index 0c8f2552d7..30a54a4337 100644 --- a/src/components/HomepageFeatures/styles.module.css +++ b/src/components/HomepageFeatures/styles.module.css @@ -172,6 +172,283 @@ } } +/* Version Display Styles */ + +/* Common styles for versioned product cards */ +.productCard--diagonal, +.productCard--stacked, +.productCard--badge, +.productCard--tabs, +.productCard--badge-classic, +.productCard--badge-modern, +.productCard--badge-minimal, +.productCard--badge-gradient { + position: relative; + overflow: hidden; +} + +.productContent { + position: relative; + z-index: 2; +} + +/* Add spacing for version badges to prevent overlap with bottom badges */ +.productCard--badge .productContent { + margin-bottom: 8px; +} + +/* Diagonal Split Design */ +.versionDiagonal { + position: absolute; + top: 0; + right: 0; + width: 80px; + height: 80px; + overflow: hidden; +} + +.versionTop { + position: absolute; + top: 8px; + right: 8px; + background: var(--ifm-color-primary); + color: white; + padding: 4px 8px; + font-size: 0.75rem; + font-weight: 600; + border-radius: 4px; + transform: rotate(45deg); + transform-origin: center; + white-space: nowrap; + box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1); +} + +.versionBottom { + position: absolute; + bottom: 8px; + left: 8px; + background: var(--ifm-color-secondary); + color: white; + padding: 4px 8px; + font-size: 0.75rem; + font-weight: 600; + border-radius: 4px; + transform: rotate(45deg); + transform-origin: center; + white-space: nowrap; + box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1); +} + +/* Stacked Design */ +.versionStacked { + position: absolute; + top: 12px; + right: 12px; + display: flex; + flex-direction: column; + gap: 4px; +} + +.versionStackedItem { + background: linear-gradient(135deg, var(--ifm-color-primary), var(--ifm-color-primary-dark)); + color: white; + padding: 4px 8px; + font-size: 0.75rem; + font-weight: 600; + border-radius: 6px; + text-align: center; + box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1); + min-width: 40px; +} + +.versionStackedItem:nth-child(2) { + background: linear-gradient(135deg, var(--ifm-color-secondary), var(--ifm-color-secondary-dark)); +} + +/* Badge Design */ +.versionBadges { + position: absolute; + bottom: 12px; + right: 12px; + display: flex; + gap: 6px; + z-index: 10; +} + +.versionBadge { + background: var(--ifm-color-primary); + color: white; + padding: 4px 8px; + font-size: 0.7rem; + font-weight: 600; + border-radius: 12px; + border: 2px solid white; + box-shadow: 0 2px 6px rgba(0, 0, 0, 0.15); +} + +.versionBadge:nth-child(2) { + background: var(--ifm-color-secondary); +} + +/* Badge Classic Design - Round badges with border */ +.versionBadgesClassic { + position: absolute; + top: 12px; + right: 12px; + display: flex; + gap: 8px; +} + +.versionBadgeClassic { + background: var(--ifm-color-primary); + color: white; + padding: 6px 12px; + font-size: 0.7rem; + font-weight: 700; + border-radius: 20px; + border: 3px solid white; + box-shadow: 0 3px 8px rgba(0, 0, 0, 0.2); + text-transform: uppercase; + letter-spacing: 0.5px; +} + +.versionBadgeClassic:nth-child(2) { + background: var(--ifm-color-success); +} + +/* Badge Modern Design - Sleek rectangular badges */ +.versionBadgesModern { + position: absolute; + top: 12px; + right: 12px; + display: flex; + gap: 4px; +} + +.versionBadgeModern { + background: rgba(var(--ifm-color-primary-rgb), 0.9); + color: white; + padding: 4px 10px; + font-size: 0.7rem; + font-weight: 600; + border-radius: 6px; + backdrop-filter: blur(10px); + border: 1px solid rgba(255, 255, 255, 0.2); + box-shadow: 0 2px 12px rgba(0, 0, 0, 0.1); +} + +.versionBadgeModern:nth-child(2) { + background: rgba(var(--ifm-color-info-rgb), 0.9); +} + +/* Badge Minimal Design - Simple text badges */ +.versionBadgesMinimal { + position: absolute; + top: 12px; + right: 12px; + display: flex; + gap: 6px; +} + +.versionBadgeMinimal { + background: rgba(var(--ifm-color-emphasis-200), 0.8); + color: var(--ifm-color-emphasis-800); + padding: 3px 8px; + font-size: 0.65rem; + font-weight: 600; + border-radius: 4px; + border: 1px solid var(--ifm-color-emphasis-300); + font-family: var(--ifm-font-family-monospace); +} + +.versionBadgeMinimal:nth-child(2) { + background: rgba(var(--ifm-color-emphasis-300), 0.8); +} + +/* Badge Gradient Design - Colorful gradient badges */ +.versionBadgesGradient { + position: absolute; + top: 12px; + right: 12px; + display: flex; + gap: 6px; +} + +.versionBadgeGradient { + background: linear-gradient(135deg, var(--ifm-color-primary), var(--ifm-color-secondary)); + color: white; + padding: 5px 10px; + font-size: 0.7rem; + font-weight: 700; + border-radius: 15px; + box-shadow: 0 4px 15px rgba(0, 0, 0, 0.2); + text-shadow: 0 1px 2px rgba(0, 0, 0, 0.3); + position: relative; + overflow: hidden; +} + +.versionBadgeGradient:nth-child(2) { + background: linear-gradient(135deg, var(--ifm-color-info), var(--ifm-color-success)); +} + +.versionBadgeGradient::before { + content: ''; + position: absolute; + top: 0; + left: -100%; + width: 100%; + height: 100%; + background: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.3), transparent); + transition: left 0.5s ease; +} + +.versionBadgeGradient:hover::before { + left: 100%; +} + +/* Tabs Design */ +.versionTabs { + position: absolute; + top: 0; + left: 0; + right: 0; + display: flex; +} + +.versionTab { + flex: 1; + background: var(--ifm-color-primary); + color: white; + padding: 8px 12px; + font-size: 0.75rem; + font-weight: 600; + text-align: center; + border-bottom: 3px solid var(--ifm-color-primary-dark); +} + +.versionTab:nth-child(2) { + background: var(--ifm-color-secondary); + border-bottom-color: var(--ifm-color-secondary-dark); +} + +.versionTab:first-child { + border-top-left-radius: 12px; +} + +.versionTab:last-child { + border-top-right-radius: 12px; +} + +/* Adjust content padding for tabbed design */ +.productCard--tabs .productContent { + padding-top: 1rem; +} + +/* Dark mode adjustments */ +[data-theme='dark'] .versionBadge { + border-color: var(--ifm-color-emphasis-300); +} + @media screen and (max-width: 768px) { .categoriesContainer { gap: 2rem; @@ -184,4 +461,32 @@ .sectionHeader { margin-bottom: 2.5rem; } + + /* Make version displays smaller on mobile */ + .versionDiagonal { + width: 60px; + height: 60px; + } + + .versionTop, + .versionBottom { + font-size: 0.65rem; + padding: 3px 6px; + } + + .versionStackedItem, + .versionBadge, + .versionTab, + .versionBadgeClassic, + .versionBadgeModern, + .versionBadgeMinimal, + .versionBadgeGradient { + font-size: 0.65rem; + padding: 3px 6px; + } + + .versionBadgeClassic { + padding: 4px 8px; + border-width: 2px; + } } From f9925f58cef7ced8d0a5dc02569ba199bbf4115b Mon Sep 17 00:00:00 2001 From: Jordan Violet Date: Tue, 17 Jun 2025 19:17:19 -0400 Subject: [PATCH 2/9] retrigger checks From 555d8ddc5a77991c3c549342a43163dcb560b6d7 Mon Sep 17 00:00:00 2001 From: Jordan Violet Date: Tue, 17 Jun 2025 19:17:40 -0400 Subject: [PATCH 3/9] retrigger checks From 0ac8ee2c7573993e6ebbfc08ba974c1509f3f136 Mon Sep 17 00:00:00 2001 From: Jordan Violet Date: Tue, 17 Jun 2025 19:19:13 -0400 Subject: [PATCH 4/9] updated docusaurus agent --- .github/workflows/agent-docusarus-dev.yml | 2 -- 1 file changed, 2 deletions(-) diff --git a/.github/workflows/agent-docusarus-dev.yml b/.github/workflows/agent-docusarus-dev.yml index 9e10f26564..665fcf7db9 100644 --- a/.github/workflows/agent-docusarus-dev.yml +++ b/.github/workflows/agent-docusarus-dev.yml @@ -1,5 +1,4 @@ name: Claude Code Documentation Review - on: pull_request: branches: @@ -8,7 +7,6 @@ on: paths-ignore: - '**.md' - '**.mdx' - jobs: claude-review: runs-on: ubuntu-latest From 1c60d3fdebdc079a9fbd8eb89efd3f3bddf41d77 Mon Sep 17 00:00:00 2001 From: Jordan Violet Date: Tue, 17 Jun 2025 19:19:59 -0400 Subject: [PATCH 5/9] updated docusaurus agent --- .github/workflows/agent-docusarus-dev.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/agent-docusarus-dev.yml b/.github/workflows/agent-docusarus-dev.yml index 665fcf7db9..bd5f52fac1 100644 --- a/.github/workflows/agent-docusarus-dev.yml +++ b/.github/workflows/agent-docusarus-dev.yml @@ -4,6 +4,7 @@ on: branches: - main - dev + - fix/homepage-updates paths-ignore: - '**.md' - '**.mdx' From 75b733a3865b495fe1bd0e267489c21dffec323d Mon Sep 17 00:00:00 2001 From: Jordan Violet Date: Tue, 17 Jun 2025 19:20:58 -0400 Subject: [PATCH 6/9] retrigger checks From e93d8dd9165c4ea4c35dd1916452ad4e1a081253 Mon Sep 17 00:00:00 2001 From: Jordan Violet Date: Tue, 17 Jun 2025 19:38:15 -0400 Subject: [PATCH 7/9] updated dev agent --- .github/workflows/agent-docusarus-dev.yml | 168 +++++++++++++++++++++- 1 file changed, 165 insertions(+), 3 deletions(-) diff --git a/.github/workflows/agent-docusarus-dev.yml b/.github/workflows/agent-docusarus-dev.yml index bd5f52fac1..aee4b146bb 100644 --- a/.github/workflows/agent-docusarus-dev.yml +++ b/.github/workflows/agent-docusarus-dev.yml @@ -12,6 +12,137 @@ jobs: claude-review: runs-on: ubuntu-latest + permissions: + contents: read + pull-requests: write + + steps: + - name: Checkout code + uses: actions/checkout@v4 + with: + fetch-depth: 2 + + - name: Fetch system prompt from private repo + id: fetch-prompt + env: + GH_TOKEN: ${{ secrets.NETWRIX_PROMPT_REPO_TOKEN }} + run: | + echo "Fetching system prompt..." + + RESPONSE=$(curl -s -w "\n%{http_code}" \ + -H "Authorization: token $GH_TOKEN" \ + -H "Accept: application/vnd.github.v3.raw" \ + https://api.github.com/repos/netwrix/action-agent-prompts/contents/docs-dev.md?ref=main) + + HTTP_CODE=$(echo "$RESPONSE" | tail -n1) + CONTENT=$(echo "$RESPONSE" | head -n-1) + + if [ "$HTTP_CODE" != "200" ]; then + echo "Failed to fetch system prompt (HTTP $HTTP_CODE)" + exit 1 + fi + + echo "$CONTENT" > /tmp/system-prompt.md + echo "System prompt fetched successfully" + + - name: Check for Docusaurus changes + id: check-files + run: | + CHANGED_FILES=$(git diff --name-only HEAD~1) + + DOCUSAURUS_FILES=$(echo "$CHANGED_FILES" | grep -E "(docusaurus\.config\.js|sidebars?\.js|babel\.config\.js|package\.json|\.github/|src/)" || true) + + if [ -z "$DOCUSAURUS_FILES" ]; then + echo "No Docusaurus infrastructure files changed. Skipping review." + echo "skip_review=true" >> $GITHUB_OUTPUT + else + echo "skip_review=false" >> $GITHUB_OUTPUT + echo "### 🎯 Docusaurus Files Changed" >> $GITHUB_STEP_SUMMARY + echo '```' >> $GITHUB_STEP_SUMMARY + echo "$DOCUSAURUS_FILES" >> $GITHUB_STEP_SUMMARY + echo '```' >> $GITHUB_STEP_SUMMARY + fi + + - name: Create review prompt + if: steps.check-files.outputs.skip_review != 'true' + run: | + cat > /tmp/review-prompt.txt << 'REVIEW_PROMPT_EOF' + Review this pull request focusing exclusively on Docusaurus infrastructure and configuration files. + + Analyze changes to: + - docusaurus.config.js (site configuration, plugins, themes) + - sidebars.js (navigation structure) + - package.json (dependencies, scripts) + - Build configuration files + - Source code in src/ directory + - GitHub Actions workflows + + For each issue found, provide: + 1. Clear explanation of the problem + 2. Specific code suggestion with reasoning + 3. Potential impact on the documentation site + + Ignore all .md and .mdx files - focus only on the technical infrastructure. + REVIEW_PROMPT_EOF + + - name: Read system prompt for append + if: steps.check-files.outputs.skip_review != 'true' + id: read-prompt + run: | + SYSTEM_PROMPT=$(cat /tmp/system-prompt.md) + echo "system_content<> $GITHUB_OUTPUT + echo "$SYSTEM_PROMPT" >> $GITHUB_OUTPUT + echo "EOF" >> $GITHUB_OUTPUT + + - name: Run Claude Code Review + if: steps.check-files.outputs.skip_review != 'true' + id: claude-review + uses: anthropics/claude-code-base-action@beta + with: + prompt_file: /tmp/review-prompt.txt + append_system_prompt: ${{ steps.read-prompt.outputs.system_content }} + allowed_tools: "Read,Grep,Glob,LS" + anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY }} + timeout_minutes: "15" + max_turns: "20" + model: "claude-sonnet-4-20250514" + + - name: Post review summary (bash) + if: steps.claude-review.conclusion == 'success' + env: + EXECUTION_FILE: ${{ steps.claude-review.outputs.execution_file }} + GH_TOKEN: ${{ secrets.NETWRIX_PROMPT_REPO_TOKEN }} + PR_NUMBER: ${{ github.event.pull_request.number }} + run: | + if [ ! -f "$EXECUTION_FILE" ]; then + echo "No execution file found" + exit 0 + fi + + # Extract the last assistant message using jq + REVIEW_CONTENT=$(jq -r '.[] | select(.role == "assistant") | .content' "$EXECUTION_FILE" | tail -1) + + if [ -z "$REVIEW_CONTENT" ]; then + echo "No review content found" + exit 0 + fi + + # Create comment file with proper escaping + cat > /tmp/comment.md << 'HEADER' + ## 🤖 Claude Docusaurus Rname: Claude Code Documentation Review +on: + pull_request: + branches: + - main + - dev + - fix/homepage-updates + paths-ignore: + - '**.md' + - '**.mdx' +jobs: + claude-review: + runs-on: ubuntu-latest + permissions: contents: read pull-requests: write @@ -107,7 +238,7 @@ EOF max_turns: "20" model: "claude-sonnet-4-20250514" - - name: Post review summary (bash) +- name: Post review summary (bash) if: steps.claude-review.conclusion == 'success' env: EXECUTION_FILE: ${{ steps.claude-review.outputs.execution_file }} @@ -119,11 +250,19 @@ EOF exit 0 fi - # Extract the last assistant message using jq - REVIEW_CONTENT=$(jq -r '.[] | select(.role == "assistant") | .content' "$EXECUTION_FILE" | tail -1) + # Extract the last assistant message using jq - handle the nested structure + REVIEW_CONTENT=$(jq -r ' + .[] | + select(.type == "assistant") | + .message.content[]? | + select(.type == "text") | + .text + ' "$EXECUTION_FILE" | tail -1) if [ -z "$REVIEW_CONTENT" ]; then echo "No review content found" + echo "Execution file contents:" + cat "$EXECUTION_FILE" | jq '.' | head -100 exit 0 fi @@ -144,6 +283,29 @@ HEADER Automated review by Claude Code FOOTER + # Post comment using GitHub API + jq -n --arg body "$(cat /tmp/comment.md)" '{body: $body}' | \ + curl -X POST \ + -H "Authorization: token $GH_TOKEN" \ + -H "Accept: application/vnd.github.v3+json" \ + "https://api.github.com/repos/${{ github.repository }}/issues/$PR_NUMBER/comments" \ + -d @- + + echo "Review posted successfully"eview + + HEADER + + # Append the review content + echo "$REVIEW_CONTENT" >> /tmp/comment.md + + # Add footer + cat >> /tmp/comment.md << 'FOOTER' + + --- + + Automated review by Claude Code + FOOTER + # Post comment using GitHub API jq -n --arg body "$(cat /tmp/comment.md)" '{body: $body}' | \ curl -X POST \ From e91168d198a68491cdb6039d675c01692c4534f5 Mon Sep 17 00:00:00 2001 From: Jordan Violet Date: Tue, 17 Jun 2025 19:42:02 -0400 Subject: [PATCH 8/9] updated dev agent --- .github/workflows/agent-docusarus-dev.yml | 160 +--------------------- 1 file changed, 3 insertions(+), 157 deletions(-) diff --git a/.github/workflows/agent-docusarus-dev.yml b/.github/workflows/agent-docusarus-dev.yml index aee4b146bb..57717702ee 100644 --- a/.github/workflows/agent-docusarus-dev.yml +++ b/.github/workflows/agent-docusarus-dev.yml @@ -66,7 +66,7 @@ jobs: - name: Create review prompt if: steps.check-files.outputs.skip_review != 'true' run: | - cat > /tmp/review-prompt.txt << 'REVIEW_PROMPT_EOF' + cat > /tmp/review-prompt.txt << 'EOF' Review this pull request focusing exclusively on Docusaurus infrastructure and configuration files. Analyze changes to: @@ -83,7 +83,7 @@ jobs: 3. Potential impact on the documentation site Ignore all .md and .mdx files - focus only on the technical infrastructure. - REVIEW_PROMPT_EOF + EOF - name: Read system prompt for append if: steps.check-files.outputs.skip_review != 'true' @@ -108,137 +108,6 @@ jobs: model: "claude-sonnet-4-20250514" - name: Post review summary (bash) - if: steps.claude-review.conclusion == 'success' - env: - EXECUTION_FILE: ${{ steps.claude-review.outputs.execution_file }} - GH_TOKEN: ${{ secrets.NETWRIX_PROMPT_REPO_TOKEN }} - PR_NUMBER: ${{ github.event.pull_request.number }} - run: | - if [ ! -f "$EXECUTION_FILE" ]; then - echo "No execution file found" - exit 0 - fi - - # Extract the last assistant message using jq - REVIEW_CONTENT=$(jq -r '.[] | select(.role == "assistant") | .content' "$EXECUTION_FILE" | tail -1) - - if [ -z "$REVIEW_CONTENT" ]; then - echo "No review content found" - exit 0 - fi - - # Create comment file with proper escaping - cat > /tmp/comment.md << 'HEADER' - ## 🤖 Claude Docusaurus Rname: Claude Code Documentation Review -on: - pull_request: - branches: - - main - - dev - - fix/homepage-updates - paths-ignore: - - '**.md' - - '**.mdx' -jobs: - claude-review: - runs-on: ubuntu-latest - - permissions: - contents: read - pull-requests: write - - steps: - - name: Checkout code - uses: actions/checkout@v4 - with: - fetch-depth: 2 - - - name: Fetch system prompt from private repo - id: fetch-prompt - env: - GH_TOKEN: ${{ secrets.NETWRIX_PROMPT_REPO_TOKEN }} - run: | - echo "Fetching system prompt..." - - RESPONSE=$(curl -s -w "\n%{http_code}" \ - -H "Authorization: token $GH_TOKEN" \ - -H "Accept: application/vnd.github.v3.raw" \ - https://api.github.com/repos/netwrix/action-agent-prompts/contents/docs-dev.md?ref=main) - - HTTP_CODE=$(echo "$RESPONSE" | tail -n1) - CONTENT=$(echo "$RESPONSE" | head -n-1) - - if [ "$HTTP_CODE" != "200" ]; then - echo "Failed to fetch system prompt (HTTP $HTTP_CODE)" - exit 1 - fi - - echo "$CONTENT" > /tmp/system-prompt.md - echo "System prompt fetched successfully" - - - name: Check for Docusaurus changes - id: check-files - run: | - CHANGED_FILES=$(git diff --name-only HEAD~1) - - DOCUSAURUS_FILES=$(echo "$CHANGED_FILES" | grep -E "(docusaurus\.config\.js|sidebars?\.js|babel\.config\.js|package\.json|\.github/|src/)" || true) - - if [ -z "$DOCUSAURUS_FILES" ]; then - echo "No Docusaurus infrastructure files changed. Skipping review." - echo "skip_review=true" >> $GITHUB_OUTPUT - else - echo "skip_review=false" >> $GITHUB_OUTPUT - echo "### 🎯 Docusaurus Files Changed" >> $GITHUB_STEP_SUMMARY - echo '```' >> $GITHUB_STEP_SUMMARY - echo "$DOCUSAURUS_FILES" >> $GITHUB_STEP_SUMMARY - echo '```' >> $GITHUB_STEP_SUMMARY - fi - - - name: Create review prompt - if: steps.check-files.outputs.skip_review != 'true' - run: | - cat > /tmp/review-prompt.txt << 'EOF' -Review this pull request focusing exclusively on Docusaurus infrastructure and configuration files. - -Analyze changes to: -- docusaurus.config.js (site configuration, plugins, themes) -- sidebars.js (navigation structure) -- package.json (dependencies, scripts) -- Build configuration files -- Source code in src/ directory -- GitHub Actions workflows - -For each issue found, provide: -1. Clear explanation of the problem -2. Specific code suggestion with reasoning -3. Potential impact on the documentation site - -Ignore all .md and .mdx files - focus only on the technical infrastructure. -EOF - - - name: Read system prompt for append - if: steps.check-files.outputs.skip_review != 'true' - id: read-prompt - run: | - SYSTEM_PROMPT=$(cat /tmp/system-prompt.md) - echo "system_content<> $GITHUB_OUTPUT - echo "$SYSTEM_PROMPT" >> $GITHUB_OUTPUT - echo "EOF" >> $GITHUB_OUTPUT - - - name: Run Claude Code Review - if: steps.check-files.outputs.skip_review != 'true' - id: claude-review - uses: anthropics/claude-code-base-action@beta - with: - prompt_file: /tmp/review-prompt.txt - append_system_prompt: ${{ steps.read-prompt.outputs.system_content }} - allowed_tools: "Read,Grep,Glob,LS" - anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY }} - timeout_minutes: "15" - max_turns: "20" - model: "claude-sonnet-4-20250514" - -- name: Post review summary (bash) if: steps.claude-review.conclusion == 'success' env: EXECUTION_FILE: ${{ steps.claude-review.outputs.execution_file }} @@ -268,30 +137,7 @@ EOF # Create comment file with proper escaping cat > /tmp/comment.md << 'HEADER' -## 🤖 Claude Docusaurus Review - -HEADER - - # Append the review content - echo "$REVIEW_CONTENT" >> /tmp/comment.md - - # Add footer - cat >> /tmp/comment.md << 'FOOTER' - ---- - -Automated review by Claude Code -FOOTER - - # Post comment using GitHub API - jq -n --arg body "$(cat /tmp/comment.md)" '{body: $body}' | \ - curl -X POST \ - -H "Authorization: token $GH_TOKEN" \ - -H "Accept: application/vnd.github.v3+json" \ - "https://api.github.com/repos/${{ github.repository }}/issues/$PR_NUMBER/comments" \ - -d @- - - echo "Review posted successfully"eview + ## 🤖 Claude Docusaurus Review HEADER From d844c9927a33318f090353ab2ce7a95d54c82ca9 Mon Sep 17 00:00:00 2001 From: Jordan Violet Date: Tue, 17 Jun 2025 19:45:24 -0400 Subject: [PATCH 9/9] removed old workflows --- .github/workflows/convert-pngs.yml | 79 ------------------------------ .github/workflows/prettier.yml | 28 ----------- 2 files changed, 107 deletions(-) delete mode 100644 .github/workflows/convert-pngs.yml delete mode 100644 .github/workflows/prettier.yml diff --git a/.github/workflows/convert-pngs.yml b/.github/workflows/convert-pngs.yml deleted file mode 100644 index 2caf61a228..0000000000 --- a/.github/workflows/convert-pngs.yml +++ /dev/null @@ -1,79 +0,0 @@ -name: Convert PNG to WebP, Update Markdown Refs, and Comment -on: - push: - branches: ['**'] - workflow_dispatch: - pull_request: -jobs: - convert-images: - if: false - runs-on: ubuntu-latest - steps: - - name: Checkout code - uses: actions/checkout@v4 - - name: Install cwebp - run: sudo apt-get update && sudo apt-get install -y webp - - name: Convert and Replace - id: convert - run: | - echo "converted_images=" >> $GITHUB_OUTPUT - echo "updated_docs=" >> $GITHUB_OUTPUT - mkdir -p .tmp_logs - touch .tmp_logs/converted.txt .tmp_logs/updated.txt - find . -type f -name "*.png" ! -name "*.webp.png" | while read img; do - webp="${img%.png}.webp" - echo "Converting $img → $webp" - cwebp -q 80 "$img" -o "$webp" && rm "$img" && echo "$img → $webp (deleted PNG)" >> .tmp_logs/converted.txt - escaped_img=$(printf '%s\n' "$img" | sed 's|[][\.*^$(){}+?|]|\\&|g') - escaped_webp=$(printf '%s\n' "$webp" | sed 's|[][\.*^$(){}+?|]|\\&|g') - grep -rl --include="*.md" "$img" . | while read md; do - sed -i "s|$escaped_img|$escaped_webp|g" "$md" && echo "$md" >> .tmp_logs/updated.txt - done - done - echo "converted_images<> $GITHUB_OUTPUT - cat .tmp_logs/converted.txt >> $GITHUB_OUTPUT - echo "EOF" >> $GITHUB_OUTPUT - echo "updated_docs<> $GITHUB_OUTPUT - sort -u .tmp_logs/updated.txt >> $GITHUB_OUTPUT - echo "EOF" >> $GITHUB_OUTPUT - - name: Commit changes - run: | - git config user.name "github-actions" - git config user.email "github-actions@github.com" - git add '**/*.webp' '**/*.md' - git commit -m "Convert PNGs to WebP, delete originals, and update markdown references" || echo "No changes to commit" - git push || echo "No changes to push" - - name: Comment on PR or commit - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - run: | - CONVERTED="${{ steps.convert.outputs.converted_images }}" - UPDATED="${{ steps.convert.outputs.updated_docs }}" - - # Create comment body using heredoc - BODY=$(cat <<'EOF' - ### 🖼️ PNG to WebP Conversion Report - - **Converted & Deleted:** - ``` - CONVERTED_PLACEHOLDER - ``` - - **Markdown Files Updated:** - ``` - UPDATED_PLACEHOLDER - ``` - EOF - ) - - # Replace placeholders with actual values - BODY="${BODY//CONVERTED_PLACEHOLDER/$CONVERTED}" - BODY="${BODY//UPDATED_PLACEHOLDER/$UPDATED}" - - if [ "${{ github.event_name }}" = "pull_request" ]; then - PR_URL="${{ github.event.pull_request.comments_url }}" - else - PR_URL="https://api.github.com/repos/${{ github.repository }}/commits/${{ github.sha }}/comments" - fi - - echo "$BODY" | jq -Rs '{body: .}' | curl -s -X POST -H "Authorization: token $GITHUB_TOKEN" -H "Content-Type: application/json" -d @- "$PR_URL" diff --git a/.github/workflows/prettier.yml b/.github/workflows/prettier.yml deleted file mode 100644 index 40fe2ba158..0000000000 --- a/.github/workflows/prettier.yml +++ /dev/null @@ -1,28 +0,0 @@ -name: Prettier Check - -on: - push: - branches: ['*'] - pull_request: - branches: ['*'] - -jobs: - prettier: - name: Run Prettier - if: false - runs-on: ubuntu-latest - - steps: - - name: Checkout code - uses: actions/checkout@v4 - - - name: Set up Node.js - uses: actions/setup-node@v4 - with: - node-version: '>=18.0' - - - name: Install dependencies - run: npm ci - - - name: Run Prettier check - run: npx prettier --check .