Skip to content

Commit eb7b6f0

Browse files
authored
Merge pull request #311 from neural-loop/collaboration-network
Foundational Supporters: Collaboration network
2 parents 4fe7016 + d293581 commit eb7b6f0

39 files changed

Lines changed: 1168 additions & 432 deletions

File tree

.github/workflows/main.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ name: Deploy Hugo site to Pages
22

33
on:
44
push:
5-
branches: ["main"]
5+
branches: ["main", "collaboration-network"]
66

77

88
permissions:

archetypes/community-resources.md

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
---
2+
title: "{{ replace .Name "-" " " | title }}" # Resource Title, e.g., "Neuromorphic Engineering Blog"
3+
date: {{ .Date }}
4+
# Meta Description for SEO (120-160 characters):
5+
# Briefly describe the resource and its value to the neuromorphic community.
6+
description: "A description of this valuable community resource."
7+
image: "resource-logo.png" # Main logo or banner for the resource (place in this folder)
8+
draft: true
9+
type: "community-resources" # Do not change
10+
video: "" # Optional: YouTube video ID for an introductory video.
11+
12+
# --- Resource Details ---
13+
# The primary type of the resource. E.g., "YouTube Channel", "Blog", "Podcast", "Community Website"
14+
resource_type: "Website"
15+
# The main URL to access the resource
16+
website: "https://example.com"
17+
# Optional: List of authors/creators. Match with contributor profiles if they exist.
18+
author:
19+
- "Creator Name"
20+
# Set to true if this resource is part of our foundational supporter network.
21+
is_supporter: false
22+
23+
# --- Resource Log ---
24+
# Add entries here to log updates, new content, or milestones related to the resource.
25+
# Newest entries should be at the top.
26+
resource_log:
27+
- date: "YYYY-MM-DD"
28+
title: "First Log Entry"
29+
description: "Briefly describe the update, e.g., 'Launched a new video series on SNNs'."
30+
# Optional link to the specific update/content
31+
# link: "https://example.com/update"
32+
---
33+
34+
Provide a more detailed overview of the resource here. This content will appear on its dedicated page.
35+
Explain what the community can find here, who it's for, and why it's a valuable resource.
36+
Use code with caution.

assets/js/main.js

Lines changed: 25 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
// assets/js/main.js
12
// main script
23
(function () {
34
"use strict";
@@ -52,6 +53,8 @@
5253
bubblePool.push(bubble);
5354
}
5455
let activeBubbles = new Map();
56+
let recentlyHidden = new Set();
57+
const COOLDOWN_PERIOD = BUBBLE_INTERVAL;
5558

5659
const updateBubblePositions = () => {
5760
activeBubbles.forEach((bubble, partner) => {
@@ -65,20 +68,38 @@
6568
};
6669
requestAnimationFrame(updateBubblePositions);
6770

71+
const setBubbleContent = (partner) => {
72+
const name = partner.dataset.projectName || '';
73+
const description = partner.dataset.projectDescription || '';
74+
const contributions = partner.dataset.contributions;
75+
76+
return `
77+
<div class="bubble-content">
78+
<h4 class="bubble-title">${name}</h4>
79+
<p class="bubble-description">${description}</p>
80+
${contributions ? `<div class="bubble-separator"></div><div class="bubble-contributions">${contributions}</div>` : ''}
81+
</div>
82+
`;
83+
}
84+
6885
const showBubble = (partner) => {
6986
const bubble = bubblePool.find(b => b.dataset.busy === 'false');
7087
if (!bubble) return;
88+
partner.classList.add('is-highlighted');
7189
bubble.dataset.busy = 'true';
7290
activeBubbles.set(partner, bubble);
73-
bubble.innerHTML = partner.dataset.contributions;
91+
bubble.innerHTML = setBubbleContent(partner);
7492
bubble.classList.add('visible');
7593
setTimeout(() => hideBubble(partner, bubble), BUBBLE_LIFETIME);
7694
};
7795

7896
const hideBubble = (partner, bubble) => {
97+
partner.classList.remove('is-highlighted');
7998
bubble.classList.remove('visible');
8099
activeBubbles.delete(partner);
81-
setTimeout(() => { bubble.dataset.busy = 'false'; }, 300);
100+
recentlyHidden.add(partner);
101+
setTimeout(() => { bubble.dataset.busy = 'false'; }, 400);
102+
setTimeout(() => { recentlyHidden.delete(partner); }, COOLDOWN_PERIOD);
82103
};
83104

84105
// --- NEW: Hover-triggered bubble logic ---
@@ -93,7 +114,7 @@
93114
// Hide any random bubbles that might be showing
94115
activeBubbles.forEach((bubble, p) => hideBubble(p, bubble));
95116

96-
hoverBubble.innerHTML = partner.dataset.contributions;
117+
hoverBubble.innerHTML = setBubbleContent(partner);
97118

98119
// Position calculation must happen *after* content is set
99120
const partnerRect = partner.getBoundingClientRect();
@@ -121,7 +142,7 @@
121142

122143
if (isInView) {
123144
const availablePartners = partnersWithContributions.filter(p => {
124-
if (activeBubbles.has(p)) return false;
145+
if (activeBubbles.has(p) || recentlyHidden.has(p)) return false;
125146
const r = p.getBoundingClientRect();
126147
return r.left > 50 && r.right < window.innerWidth - 50;
127148
});

assets/scss/_typography-custom.scss

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
// assets/scss/_typography-custom.scss
2+
// assets/scss/_typography-custom.scss
23

34
// Define link colors as variables
45
$link-color: var(--color-primary-new);
@@ -124,6 +125,7 @@ a {
124125

125126
// REFACTORED: Centralized Link Styling
126127
.styled-link,
128+
.byline-link,
127129
.content :is(:where(a):not(:where([class~="not-prose"], [class~="not-prose"] *, .btn))),
128130
section a:not(.breadcrumb-link-parent, .social-link-container, .btn, .hardware-card-wide-link, .social-icon, .no-style),
129131
section a.social-link-container .social-link-text,

assets/scss/components/_community-partners.scss

Lines changed: 113 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,55 @@
11
// assets/scss/components/_community-partners.scss
22
.community-partners-section {
3+
position: relative;
4+
overflow: hidden;
5+
background-color: #ffffff;
6+
7+
> * {
8+
position: relative;
9+
z-index: 2;
10+
}
11+
12+
&::after {
13+
content: '';
14+
position: absolute;
15+
top: 0;
16+
left: 0;
17+
width: 100%;
18+
height: 100%;
19+
z-index: 0;
20+
background-image:
21+
linear-gradient(45deg, theme('colors.body') 25%, transparent 105%),
22+
linear-gradient(-45deg, theme('colors.body') 25%, transparent 25%),
23+
linear-gradient(45deg, transparent 75%, theme('colors.body') 75%),
24+
linear-gradient(-45deg, transparent 75%, theme('colors.body') 75%);
25+
background-size: 10px 10px;
26+
}
27+
28+
.dark & {
29+
background-color: theme('colors.darkmode.theme-dark');
30+
31+
&::after {
32+
background-image:
33+
linear-gradient(45deg, theme('colors.darkmode.body') 25%, transparent 105%),
34+
linear-gradient(-45deg, theme('colors.darkmode.body') 25%, transparent 25%),
35+
linear-gradient(45deg, transparent 75%, theme('colors.darkmode.body') 75%),
36+
linear-gradient(-45deg, transparent 75%, theme('colors.darkmode.body') 75%);
37+
}
38+
}
39+
340
.partners-slider-wrapper {
441
overflow: hidden;
542
-webkit-mask-image: linear-gradient(to right, transparent, black 20%, black 80%, transparent);
643
mask-image: linear-gradient(to right, transparent, black 20%, black 80%, transparent);
744
}
845

946
.partners-track {
47+
@apply bg-white dark:bg-black;
1048
animation: scroll 40s linear infinite;
1149
&:hover {
1250
animation-play-state: paused;
1351
}
52+
padding-bottom: 30px;
1453
}
1554

1655
.partner-logo {
@@ -19,7 +58,8 @@
1958
transition: all 0.3s ease-in-out;
2059
}
2160

22-
.partner-logo-link:hover .partner-logo {
61+
.partner-logo-link:hover .partner-logo,
62+
.partner-logo-link.is-highlighted .partner-logo {
2363
filter: grayscale(0%);
2464
opacity: 1;
2565
transform: scale(1.05);
@@ -42,9 +82,15 @@
4282
}
4383

4484
.contribution-bubble {
45-
@apply absolute top-0 left-0 bg-dark dark:bg-darkmode-theme-dark text-white dark:text-darkmode-text text-xs font-semibold p-2 rounded-lg shadow-lg z-20 dark:border-2 dark:border-darkmode-border;
46-
@apply opacity-0 invisible transition-opacity duration-300 ease-in-out;
85+
@apply absolute top-0 left-0 dark:bg-darkmode-theme-dark text-white dark:text-darkmode-text rounded-lg shadow-lg z-40 dark:border-2 dark:border-darkmode-border;
86+
background: linear-gradient(135deg, color-mix(in srgb, var(--color-primary-new) 40%, black) 0%, color-mix(in srgb, var(--color-secondary-new) 40%, black) 100%);
87+
@apply opacity-0 invisible transition-opacity ease-in-out;
88+
transition-duration: 300ms;
4789
will-change: opacity, transform;
90+
max-width: 280px;
91+
padding: 0.75rem;
92+
text-align: left;
93+
font-weight: 400;
4894

4995
&.visible {
5096
@apply opacity-100;
@@ -56,10 +102,31 @@
56102
content: '';
57103
@apply absolute top-full left-1/2 -translate-x-1/2;
58104
@apply w-0 h-0 border-x-8 border-x-transparent border-t-8;
59-
border-top-color: theme('colors.dark');
105+
border-top-color: color-mix(in srgb, var(--color-secondary-new) 40%, black);
60106
}
61107
}
62108

109+
.bubble-title {
110+
@apply font-bold text-sm mb-1 text-white;
111+
}
112+
113+
.bubble-description {
114+
@apply text-xs text-gray-300 dark:text-white leading-snug;
115+
display: -webkit-box;
116+
-webkit-line-clamp: 3;
117+
-webkit-box-orient: vertical;
118+
overflow: hidden;
119+
}
120+
121+
.bubble-separator {
122+
@apply h-px bg-gray-600 dark:bg-gray-500 my-2;
123+
}
124+
125+
.bubble-contributions {
126+
@apply text-xs font-semibold;
127+
}
128+
129+
63130
// Dark mode styles for the bubble's tail to add a border
64131
.dark .contribution-bubble {
65132
// Border for the tail
@@ -78,3 +145,45 @@
78145
margin-top: -2px;
79146
}
80147
}
148+
149+
.byline-paragraph {
150+
@apply inline-flex items-center rounded-bl-lg rounded-br-lg px-4 py-2;
151+
152+
&::before, &::after {
153+
content: '';
154+
display: inline-block;
155+
width: 30px;
156+
height: 16px;
157+
flex-shrink: 0;
158+
background-size: 8px 8px;
159+
background-color: var(--color-secondary-new);
160+
}
161+
162+
&::before {
163+
margin-right: 0.75rem;
164+
background-image:
165+
linear-gradient(45deg, theme('colors.body') 25%, transparent 25%),
166+
linear-gradient(-45deg, theme('colors.body') 25%, transparent 25%),
167+
linear-gradient(45deg, transparent 75%, theme('colors.body') 75%),
168+
linear-gradient(-45deg, transparent 75%, theme('colors.body') 75%);
169+
}
170+
&::after {
171+
margin-left: 0.75rem;
172+
background-image:
173+
linear-gradient(45deg, theme('colors.body') 25%, transparent 25%),
174+
linear-gradient(-45deg, theme('colors.body') 25%, transparent 25%),
175+
linear-gradient(45deg, transparent 75%, theme('colors.body') 75%),
176+
linear-gradient(-45deg, transparent 75%, theme('colors.body') 75%);
177+
}
178+
179+
.dark & {
180+
&::before, &::after {
181+
background-color: var(--color-primary-new);
182+
background-image:
183+
linear-gradient(45deg, theme('colors.darkmode.body') 25%, transparent 25%),
184+
linear-gradient(-45deg, theme('colors.darkmode.body') 25%, transparent 25%),
185+
linear-gradient(45deg, transparent 75%, theme('colors.darkmode.body') 75%),
186+
linear-gradient(-45deg, transparent 75%, theme('colors.darkmode.body') 75%);
187+
}
188+
}
189+
}

assets/scss/custom.scss

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,50 @@
1010
--shadow-md-new: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06);
1111
}
1212

13+
// Hero section background with fading checkerboard
14+
.hero-section {
15+
position: relative;
16+
overflow: hidden;
17+
background-color: #ffffff;
18+
19+
&::before {
20+
content: '';
21+
position: absolute;
22+
top: 0;
23+
left: 0;
24+
width: 100%;
25+
height: 100%;
26+
z-index: 0;
27+
background-image:
28+
linear-gradient(45deg, theme('colors.body') 25%, transparent 100%),
29+
linear-gradient(-45deg, theme('colors.body') 25%, transparent 25%),
30+
linear-gradient(45deg, transparent 75%, theme('colors.body') 75%),
31+
linear-gradient(-45deg, transparent 75%, theme('colors.body') 75%);
32+
background-size: 10px 10px;
33+
mask-image: linear-gradient(to bottom, black 0%, transparent 40%, transparent 60%, black 100%);
34+
-webkit-mask-image: linear-gradient(to bottom, black 0%, transparent 40%, transparent 60%, black 100%);
35+
}
36+
37+
// Ensure content is above the pattern
38+
> .container {
39+
position: relative;
40+
z-index: 1;
41+
}
42+
}
43+
44+
.dark .hero-section {
45+
background-color: theme('colors.darkmode.theme-dark');
46+
47+
&::before {
48+
background-image:
49+
linear-gradient(45deg, theme('colors.darkmode.body') 25%, transparent 100%),
50+
linear-gradient(-45deg, theme('colors.darkmode.body') 25%, transparent 25%),
51+
linear-gradient(45deg, transparent 75%, theme('colors.darkmode.body') 75%),
52+
linear-gradient(-45deg, transparent 75%, theme('colors.darkmode.body') 75%);
53+
}
54+
}
55+
56+
1357
.nav-dropdown.active .nav-dropdown-list {
1458
@apply lg:bg-white dark:lg:bg-darkmode-theme-dark;
1559
}

0 commit comments

Comments
 (0)