Skip to content

Commit 55fc6f7

Browse files
authored
Merge branch 'main' into feature/pat-full-analysis
2 parents f18c73d + 5faf824 commit 55fc6f7

11 files changed

Lines changed: 311 additions & 137 deletions

File tree

index.html

Lines changed: 61 additions & 86 deletions
Original file line numberDiff line numberDiff line change
@@ -1,84 +1,58 @@
11
<!doctype html>
22
<html lang="en">
3-
<head>
4-
<meta charset="UTF-8" />
5-
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
6-
<meta name="theme-color" content="#0f172a" />
7-
8-
<title>
9-
OrgExplorer — GitHub Organization Analytics & Repository Insights
10-
</title>
11-
12-
<meta
13-
name="title"
14-
content="OrgExplorer — GitHub Organization Analytics & Repository Insights"
15-
/>
16-
17-
<meta
18-
name="description"
19-
content="Analyze GitHub organizations with repository insights, contributor intelligence, activity trends, governance analytics, and interactive visualizations using OrgExplorer."
20-
/>
21-
22-
<meta
23-
name="keywords"
24-
content="GitHub analytics, GitHub organization analytics, repository insights, contributor analytics, open source analytics, GitHub dashboard, repository metrics, contributor graph, OrgExplorer, GitHub data visualization, open source project analytics"
25-
/>
26-
27-
<meta name="author" content="AOSSIE" />
28-
<meta name="robots" content="index, follow" />
29-
30-
<link rel="canonical" href="https://orgexplorer.aossie.org/" />
31-
32-
<link
33-
rel="icon"
34-
type="image/svg+xml"
35-
href="/org-explorer-logo.svg"
36-
/>
37-
<link rel="apple-touch-icon" href="/org-explorer-logo.png" />
38-
39-
<meta property="og:type" content="website" />
40-
41-
<meta
42-
property="og:url"
43-
content="https://orgexplorer.aossie.org/"
44-
/>
45-
46-
<meta
47-
property="og:title"
48-
content="OrgExplorer — GitHub Organization Analytics"
49-
/>
50-
51-
<meta
52-
property="og:description"
53-
content="Advanced GitHub organization analytics with repository insights, contributor intelligence, governance metrics, and interactive visualizations."
54-
/>
55-
56-
<meta
57-
property="og:image"
58-
content="https://orgexplorer.aossie.org/og-image.png"
59-
/>
60-
61-
<meta name="twitter:card" content="summary_large_image" />
62-
63-
<meta
64-
name="twitter:title"
65-
content="OrgExplorer — GitHub Organization Analytics"
66-
/>
67-
68-
<meta
69-
name="twitter:description"
70-
content="Analyze GitHub organizations with advanced repository and contributor analytics."
71-
/>
72-
73-
<meta
74-
name="twitter:image"
75-
content="https://orgexplorer.aossie.org/og-image.png"
76-
/>
77-
78-
<link rel="preconnect" href="https://api.github.com" />
79-
<link rel="dns-prefetch" href="https://api.github.com" />
80-
81-
<script type="application/ld+json">
3+
4+
<head>
5+
<meta charset="UTF-8" />
6+
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
7+
<meta name="theme-color" content="#0f172a" />
8+
9+
<title>
10+
OrgExplorer — GitHub Organization Analytics & Repository Insights
11+
</title>
12+
13+
<meta name="title" content="OrgExplorer — GitHub Organization Analytics & Repository Insights" />
14+
15+
<meta name="description"
16+
content="Analyze GitHub organizations with repository insights, contributor intelligence, activity trends, governance analytics, and interactive visualizations using OrgExplorer." />
17+
18+
<meta name="keywords"
19+
content="GitHub analytics, GitHub organization analytics, repository insights, contributor analytics, open source analytics, GitHub dashboard, repository metrics, contributor graph, OrgExplorer, GitHub data visualization, open source project analytics" />
20+
21+
<meta name="author" content="AOSSIE" />
22+
<meta name="robots" content="index, follow" />
23+
24+
<link rel="canonical" href="https://orgexplorer.aossie.org/" />
25+
26+
<link rel="icon" type="image/svg+xml" href="/org-explorer-logo.svg" />
27+
<link rel="apple-touch-icon" href="/org-explorer-logo.png" />
28+
29+
<meta property="og:type" content="website" />
30+
31+
<meta property="og:url" content="https://orgexplorer.aossie.org/" />
32+
33+
<meta property="og:title" content="OrgExplorer — GitHub Organization Analytics" />
34+
35+
<meta property="og:description"
36+
content="Advanced GitHub organization analytics with repository insights, contributor intelligence, governance metrics, and interactive visualizations." />
37+
38+
<meta property="og:image" content="https://orgexplorer.aossie.org/og-image.png" />
39+
40+
<meta name="twitter:card" content="summary_large_image" />
41+
42+
<meta name="twitter:title" content="OrgExplorer — GitHub Organization Analytics" />
43+
44+
<meta name="twitter:description"
45+
content="Analyze GitHub organizations with advanced repository and contributor analytics." />
46+
47+
<meta name="twitter:image" content="https://orgexplorer.aossie.org/og-image.png" />
48+
49+
<link rel="preconnect" href="https://api.github.com" />
50+
<link rel="dns-prefetch" href="https://api.github.com" />
51+
<link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/AOSSIE-Org/SocialShareButton/src/social-share-button.css"
52+
crossorigin="anonymous" />
53+
<script defer src="https://cdn.jsdelivr.net/gh/AOSSIE-Org/SocialShareButton/src/social-share-button.js"
54+
crossorigin="anonymous"></script>
55+
<script type="application/ld+json">
8256
{
8357
"@context": "https://schema.org",
8458
"@type": "WebApplication",
@@ -94,13 +68,14 @@
9468
}
9569
}
9670
</script>
97-
</head>
71+
</head>
72+
73+
<body>
74+
<noscript> OrgExplorer requires JavaScript to run properly. </noscript>
9875

99-
<body>
100-
<noscript> OrgExplorer requires JavaScript to run properly. </noscript>
76+
<div id="root"></div>
10177

102-
<div id="root"></div>
78+
<script type="module" src="/src/main.jsx"></script>
79+
</body>
10380

104-
<script type="module" src="/src/main.jsx"></script>
105-
</body>
106-
</html>
81+
</html>

src/components/Navbar.jsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ export default function Navbar() {
3333
onClick={() => navigate('/')}
3434
style={{ fontWeight: 800, fontSize: 15, letterSpacing: '.1em', color: 'var(--accent)', cursor: 'pointer', flexShrink: 0 }}
3535
>
36-
ORGEXPLORER
36+
OrgExplorer
3737
</span>
3838

3939
{/* Nav links — only visible when data is loaded */}

src/components/RateLimitBanner.jsx

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,10 @@ export default function RateLimitBanner() {
3333
</span>
3434
)}
3535
</span>
36-
<span style={{ fontSize: 11, color: 'var(--text2)' }}>RESETS HOURLY</span>
36+
<span style={{ fontSize: 11, color: 'var(--text2)' }}>
37+
Used: {rateLimit.used} • Reset at{' '}
38+
{new Date(rateLimit.reset * 1000).toLocaleTimeString()}
39+
</span>
3740
</div>
3841
)
3942
}
Lines changed: 116 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,116 @@
1+
import React, { useRef, useEffect, useState } from 'react';
2+
import { FiShare2 } from 'react-icons/fi';
3+
4+
const DEFAULT_HASHTAGS = [];
5+
const DEFAULT_PLATFORMS = ['whatsapp', 'facebook', 'twitter', 'linkedin', 'telegram', 'reddit', 'pinterest'];
6+
const DEFAULT_ANALYTICS_PLUGINS = [];
7+
8+
const SocialShareButton = ({
9+
url = '',
10+
title = '',
11+
description = '',
12+
hashtags = DEFAULT_HASHTAGS,
13+
via = '',
14+
platforms = DEFAULT_PLATFORMS,
15+
theme = 'dark',
16+
buttonText = 'Share',
17+
customClass = '',
18+
onShare = null,
19+
onCopy = null,
20+
buttonStyle = 'default',
21+
modalPosition = 'center',
22+
buttonColor = '',
23+
buttonHoverColor = '',
24+
showButton = true,
25+
analytics = true,
26+
onAnalytics = null,
27+
analyticsPlugins = DEFAULT_ANALYTICS_PLUGINS,
28+
componentId = null,
29+
debug = false,
30+
}) => {
31+
const containerRef = useRef(null);
32+
const shareButtonRef = useRef(null);
33+
const [loadError, setLoadError] = useState(false);
34+
35+
useEffect(() => {
36+
if (typeof window !== 'undefined') {
37+
if (window.SocialShareButton) {
38+
setLoadError(false);
39+
shareButtonRef.current = new window.SocialShareButton({
40+
container: containerRef.current,
41+
url: url || 'https://orgexplorer.aossie.org/',
42+
title: title || document.title,
43+
description,
44+
hashtags,
45+
via,
46+
platforms,
47+
theme,
48+
buttonText,
49+
customClass,
50+
onShare,
51+
onCopy,
52+
buttonStyle,
53+
modalPosition,
54+
buttonColor,
55+
buttonHoverColor,
56+
showButton,
57+
analytics,
58+
onAnalytics,
59+
analyticsPlugins,
60+
componentId,
61+
debug,
62+
});
63+
} else {
64+
setLoadError(true);
65+
}
66+
}
67+
68+
return () => {
69+
if (shareButtonRef.current) {
70+
shareButtonRef.current.destroy();
71+
shareButtonRef.current = null;
72+
}
73+
};
74+
}, [
75+
url, title, description, hashtags, via, platforms, theme, buttonText,
76+
customClass, onShare, onCopy, buttonStyle, modalPosition, buttonColor,
77+
buttonHoverColor, showButton, analytics, onAnalytics, analyticsPlugins,
78+
componentId, debug
79+
]);
80+
81+
if (loadError) {
82+
const handleFallbackCopy = async () => {
83+
try {
84+
if (onCopy) {
85+
await onCopy();
86+
} else {
87+
const fallbackUrl = url || 'https://orgexplorer.aossie.org/';
88+
if (navigator.clipboard && navigator.clipboard.writeText) {
89+
await navigator.clipboard.writeText(fallbackUrl);
90+
} else {
91+
throw new Error("Clipboard API not available");
92+
}
93+
}
94+
alert("Widget failed to load. Link copied to clipboard!");
95+
} catch (err) {
96+
console.error("Failed to copy link: ", err);
97+
alert("Widget failed to load. Failed to copy link.");
98+
}
99+
};
100+
101+
return (
102+
<button
103+
type="button"
104+
onClick={handleFallbackCopy}
105+
style={{ display: 'flex', alignItems: 'center', gap: 6, fontSize: 12, border: '1px solid #ef4444', padding: '6px 12px', borderRadius: '6px', background: 'transparent', color: 'inherit', cursor: 'pointer' }}
106+
title="Social Share widget failed to load. Click to copy link."
107+
>
108+
<FiShare2 size={13} /> {buttonText} (Fallback)
109+
</button>
110+
);
111+
}
112+
113+
return <div ref={containerRef}></div>;
114+
};
115+
116+
export default SocialShareButton;

src/components/UI.jsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,8 @@ export const C = {
3939
border: 'none',
4040
transition: 'opacity .15s',
4141
...(v === 'primary' ? { background: 'var(--accent)', color: '#000' }
42-
: v === 'ghost' ? { background: 'transparent', color: 'var(--text)', border: '1px solid var(--border)' }
42+
: v === 'ghost' ? { background: 'transparent', color: 'var(--text)', border: '1px solid var(--border)' }
43+
: v === 'danger' ? { background: 'var(--red)', color: '#fff' }
4344
: { background: 'var(--surface2)', color: 'var(--text)', border: '1px solid var(--border)' }),
4445
}),
4546
input: {

src/components/layout/Footer.jsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -125,7 +125,7 @@ export default function Footer() {
125125
<div className="flex flex-col items-start gap-2 text-left lg:items-end lg:text-right">
126126
<p
127127
className="
128-
text-xs uppercase tracking-[0.2em]
128+
text-xs tracking-[0.2em]
129129
text-zinc-500
130130
"
131131
>

0 commit comments

Comments
 (0)