-
Notifications
You must be signed in to change notification settings - Fork 26
Fix: add light mode support to footer component #67
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -12,7 +12,7 @@ const Footer: React.FC = () => { | |
| { name: 'Integrations', href: '#integrations' }, | ||
| ], | ||
| resources: [ | ||
| { name: 'Documentation', href: 'https://opsimate.vercel.app/#integrations' }, // Placeholder - will link to actual docs | ||
| { name: 'Documentation', href: 'https://opsimate.vercel.app/#integrations' }, | ||
| ], | ||
| opensource: [ | ||
| { name: 'GitHub Repository', href: 'https://github.com/OpsiMate/OpsiMate' }, | ||
|
|
@@ -25,29 +25,29 @@ const Footer: React.FC = () => { | |
| const socialLinks = [ | ||
| { | ||
| name: 'GitHub', | ||
| href: 'https://github.com/OpsiMate/OpsiMate', // From documentation | ||
| href: 'https://github.com/OpsiMate/OpsiMate', | ||
| icon: Github | ||
| }, | ||
| { | ||
| name: 'Slack Community', | ||
| href: 'https://join.slack.com/t/opsimate/shared_invite/zt-39bq3x6et-NrVCZzH7xuBGIXmOjJM7gA', // From documentation | ||
| href: 'https://join.slack.com/t/opsimate/shared_invite/zt-39bq3x6et-NrVCZzH7xuBGIXmOjJM7gA', | ||
| icon: Slack | ||
| }, | ||
|
Comment on lines
+33
to
35
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🧩 Analysis chainSlack invite links expire; use a non‑expiring invite or a vanity redirect (e.g., /community → Slack). Consider a permanent Slack share link or your own redirect you can rotate without code changes. 🌐 Web query: 💡 Result: Short answer — yes. On paid and free Slack workspaces you can create a shared invite link and set it to "Never expires" from Invite people → Copy invite link → Edit link settings → Never expires. By default links are active 30 days and can be reused up to the link-use limit (Slack docs: invite links default 30 days / up to 400 uses; you may see limits or admin/SO settings that remove the option). [1][2] How to create a non‑expiring invite link (quick steps)
Key Slack limits & notes (from Slack)
Recommended best practices for publicly sharing community invites
Sources
Replace the expiring Slack invite link with a non-expiring one or a vanity redirect. The current shared invite link (zt-39bq3x6et-NrVCZzH7xuBGIXmOjJM7gA) will expire in 30 days or after 400 uses by default. Set the link to "Never expires" via Invite people → Copy invite link → Edit link settings, or implement a vanity redirect (e.g., 🤖 Prompt for AI Agents |
||
| { | ||
| name: 'Email', | ||
| href: 'mailto:idan.lut@gmail.com', // Placeholder | ||
| href: 'mailto:idan.lut@gmail.com', | ||
| icon: Mail | ||
| }, | ||
| ]; | ||
|
|
||
| return ( | ||
| <footer className="bg-gray-900 text-white"> | ||
| <footer className="bg-[#FEFEFE] dark:bg-gray-900 text-gray-900 dark:text-white border-t border-gray-200 dark:border-gray-800 transition-colors duration-200"> | ||
| <div className="container-max section-padding"> | ||
| <div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-5 gap-8"> | ||
| {/* Company Info */} | ||
| <div className="lg:col-span-2"> | ||
| <Logo className="mb-4" /> | ||
| <p className="text-gray-300 mb-6 max-w-md"> | ||
| <p className="text-gray-700 dark:text-gray-300 mb-6 max-w-md"> | ||
| Simplify your infrastructure management with one unified platform. | ||
| Monitor, manage, and optimize your entire infrastructure from a single dashboard. | ||
| </p> | ||
|
|
@@ -58,7 +58,7 @@ const Footer: React.FC = () => { | |
| <Link | ||
| key={social.name} | ||
| href={social.href} | ||
| className="text-gray-400 hover:text-white transition-colors duration-200" | ||
| className="text-gray-600 dark:text-gray-400 hover:text-blue-600 dark:hover:text-white transition-colors duration-200" | ||
| target="_blank" | ||
| rel="noopener noreferrer" | ||
| aria-label={social.name} | ||
|
|
@@ -72,13 +72,13 @@ const Footer: React.FC = () => { | |
|
|
||
| {/* Product Links */} | ||
| <div> | ||
| <h3 className="font-semibold text-white mb-4">Product</h3> | ||
| <h3 className="font-semibold text-gray-900 dark:text-white mb-4">Product</h3> | ||
| <ul className="space-y-2"> | ||
| {footerLinks.product.map((link) => ( | ||
| <li key={link.name}> | ||
| <Link | ||
| href={link.href} | ||
| className="text-gray-300 hover:text-white transition-colors duration-200" | ||
| className="text-gray-700 dark:text-gray-300 hover:text-blue-600 dark:hover:text-white transition-colors duration-200" | ||
| {...(link.href.startsWith('http') && { | ||
| target: "_blank", | ||
| rel: "noopener noreferrer" | ||
|
|
@@ -93,13 +93,15 @@ const Footer: React.FC = () => { | |
|
|
||
| {/* Resources Links */} | ||
| <div> | ||
| <h3 className="font-semibold text-white mb-4">Resources</h3> | ||
| <h3 className="font-semibold text-gray-900 dark:text-white mb-4">Resources</h3> | ||
| <ul className="space-y-2"> | ||
| {footerLinks.resources.map((link) => ( | ||
| <li key={link.name}> | ||
| <Link | ||
| href={link.href} | ||
| className="text-gray-300 hover:text-white transition-colors duration-200" | ||
| className="text-gray-700 dark:text-gray-300 hover:text-blue-600 dark:hover:text-white transition-colors duration-200" | ||
| target="_blank" | ||
| rel="noopener noreferrer" | ||
| > | ||
| {link.name} | ||
| </Link> | ||
|
|
@@ -110,13 +112,13 @@ const Footer: React.FC = () => { | |
|
|
||
| {/* Open Source Links */} | ||
| <div> | ||
| <h3 className="font-semibold text-white mb-4">Open Source</h3> | ||
| <h3 className="font-semibold text-gray-900 dark:text-white mb-4">Open Source</h3> | ||
| <ul className="space-y-2"> | ||
| {footerLinks.opensource.map((link) => ( | ||
| <li key={link.name}> | ||
| <Link | ||
| href={link.href} | ||
| className="text-gray-300 hover:text-white transition-colors duration-200" | ||
| className="text-gray-700 dark:text-gray-300 hover:text-blue-600 dark:hover:text-white transition-colors duration-200" | ||
| target="_blank" | ||
| rel="noopener noreferrer" | ||
| > | ||
|
|
@@ -129,15 +131,21 @@ const Footer: React.FC = () => { | |
| </div> | ||
|
|
||
| {/* Bottom Section */} | ||
| <div className="border-t border-gray-800 mt-12 pt-8 flex flex-col md:flex-row justify-between items-center"> | ||
| <p className="text-gray-400 text-sm"> | ||
| <div className="border-t border-gray-200 dark:border-gray-800 mt-12 pt-8 flex flex-col md:flex-row justify-between items-center"> | ||
| <p className="text-gray-600 dark:text-gray-400 text-sm"> | ||
| © {currentYear} OpsiMate. All rights reserved. | ||
| </p> | ||
| <div className="flex space-x-6 mt-4 md:mt-0"> | ||
| <Link href="/privacy" className="text-gray-400 hover:text-white text-sm transition-colors duration-200"> | ||
| <Link | ||
| href="/privacy" | ||
| className="text-gray-600 dark:text-gray-400 hover:text-blue-600 dark:hover:text-white text-sm transition-colors duration-200" | ||
| > | ||
| Privacy Policy | ||
| </Link> | ||
| <Link href="/terms" className="text-gray-400 hover:text-white text-sm transition-colors duration-200"> | ||
| <Link | ||
| href="/terms" | ||
| className="text-gray-600 dark:text-gray-400 hover:text-blue-600 dark:hover:text-white text-sm transition-colors duration-200" | ||
| > | ||
| Terms of Service | ||
| </Link> | ||
| </div> | ||
|
|
||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🧩 Analysis chain
“Documentation” points to an “#integrations” anchor — likely wrong target.
Suggest aligning label and URL:
🌐 Web query:
💡 Result:
The documentation (docs) landing page is: https://opsimate.vercel.app/ . [1][2]
There is no "#integrations" fragment/anchor on that landing page (the Integrations content is a separate docs page at https://opsimate.vercel.app/docs/integrations/overview). [2][3]
Sources:
[1] OpsiMate main site (links to docs).
[2] OpsiMate docs landing (https://opsimate.vercel.app/).
[3] OpsiMate Integrations page (https://opsimate.vercel.app/docs/integrations/overview).
Fix broken documentation link — "#integrations" anchor does not exist.
The "#integrations" anchor does not exist on the docs landing page; integrations content is at https://opsimate.vercel.app/docs/integrations/overview. Correct the link to match the intent:
If linking to Documentation: Use https://opsimate.vercel.app/
If linking to Integrations: Use https://opsimate.vercel.app/docs/integrations/overview
📝 Committable suggestion
🤖 Prompt for AI Agents