Skip to content

Commit 47f75b6

Browse files
committed
fix: add validated NCO next-session card from Google Calendar
Replace stale calendar TEMPLATE links with a live card that only shows confirmed EMEA/AMER sessions for the next orientation day. Unconfirmed or unavailable calendar data falls back to typical schedule guidance without inventing Zoom or add-to-calendar actions. Document EasyCLA-safe commit attribution for agents in AGENTS.md.
1 parent 30c23f7 commit 47f75b6

11 files changed

Lines changed: 762 additions & 58 deletions

File tree

AGENTS.md

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
# Agent guidance
2+
3+
## Git commits and EasyCLA
4+
5+
This repository is covered by the Linux Foundation **EasyCLA** check. Every identity listed on a commit must have a signed CLA.
6+
7+
Do **not** add a `Co-authored-by:` trailer for AI tools (including Cursor / `cursoragent@cursor.com`). EasyCLA treats co-authors as contributors; unsigned AI attributions fail the check and block the PR.
8+
9+
- Prefer no AI trailer, or use a non-CLA trailer such as `Assisted-by: Cursor` if disclosure is needed.
10+
- Before committing from Cursor, disable **Cursor Settings → Agents → Attribution** so commits are not auto-tagged with `Co-authored-by: Cursor <cursoragent@cursor.com>`.
11+
- If a commit already has that trailer, amend the message to remove it and force-push the feature branch (`git push --force-with-lease`) before expecting EasyCLA to pass.
12+
13+
Author and committer should be the human contributor who signed the CLA (for example `Christopher Tineo <christophertineo02@gmail.com>` / GitHub `TineoC`).

assets/scss/_kep_page.scss

Lines changed: 46 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -1,58 +1,59 @@
1-
/* KEP page styles */
2-
.kep-page {
3-
padding: 0;
4-
5-
.kep-banner-container {
6-
background-color: #fff;
7-
border: 1px solid #e0e4e8;
8-
border-radius: 4px;
9-
overflow: hidden;
10-
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.03);
11-
}
1+
/* Shared component: Banner / Metadata Container */
2+
.metadata-container {
3+
background-color: #fff;
4+
border: 1px solid #e0e4e8;
5+
border-radius: 4px;
6+
overflow: hidden;
7+
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.03);
8+
}
129

13-
.kep-banner-grid {
14-
display: grid;
15-
grid-template-columns: 1fr 1fr;
10+
.metadata-grid {
11+
display: grid;
12+
grid-template-columns: 1fr 1fr;
1613

17-
@media (max-width: 991px) {
18-
grid-template-columns: 1fr;
19-
}
14+
@media (max-width: 991px) {
15+
grid-template-columns: 1fr;
2016
}
17+
}
2118

22-
.kep-banner-col {
23-
padding: 2rem;
24-
position: relative;
19+
.metadata-col {
20+
padding: 2rem;
21+
position: relative;
2522

26-
&.border-start-refined {
27-
border-left: 1px solid #e0e4e8;
23+
&.border-start-refined {
24+
border-left: 1px solid #e0e4e8;
2825

29-
@media (max-width: 991px) {
30-
border-left: none;
31-
border-top: 1px solid #e0e4e8;
32-
}
26+
@media (max-width: 991px) {
27+
border-left: none;
28+
border-top: 1px solid #e0e4e8;
3329
}
3430
}
31+
}
3532

36-
.kep-banner-label {
37-
font-family: var(--bs-font-monospace);
38-
font-size: 0.7rem;
39-
text-transform: uppercase;
40-
letter-spacing: 0.15em;
41-
color: #8a94a6;
42-
margin-bottom: 2rem;
43-
display: block;
44-
font-weight: 600;
45-
}
33+
.metadata-label {
34+
font-family: var(--bs-font-monospace);
35+
font-size: 0.7rem;
36+
text-transform: uppercase;
37+
letter-spacing: 0.15em;
38+
color: #8a94a6;
39+
margin-bottom: 2rem;
40+
display: block;
41+
font-weight: 600;
42+
}
4643

47-
.kep-banner-sublabel {
48-
font-family: var(--bs-font-monospace);
49-
font-size: 0.65rem;
50-
text-transform: uppercase;
51-
letter-spacing: 0.1em;
52-
color: #a0aec0;
53-
margin-bottom: 0.75rem;
54-
font-weight: 600;
55-
}
44+
.metadata-sublabel {
45+
font-family: var(--bs-font-monospace);
46+
font-size: 0.65rem;
47+
text-transform: uppercase;
48+
letter-spacing: 0.1em;
49+
color: #a0aec0;
50+
margin-bottom: 0.75rem;
51+
font-weight: 600;
52+
}
53+
54+
/* KEP page styles */
55+
.kep-page {
56+
padding: 0;
5657

5758
/* Refined Badges */
5859
.kep-badge-refined {

assets/scss/_nco.scss

Lines changed: 241 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,241 @@
1+
.nco-container {
2+
padding: 2rem;
3+
}
4+
5+
@media (max-width: 576px) {
6+
.nco-container {
7+
padding: 1.25rem;
8+
}
9+
}
10+
11+
.nco-connected-section {
12+
border-top: 1px solid #f1f5f9;
13+
}
14+
15+
.nco-muted {
16+
color: #64748b;
17+
}
18+
19+
.nco-pulse-dot {
20+
display: inline-block;
21+
width: 8px;
22+
height: 8px;
23+
background-color: #326ce5;
24+
border-radius: 50%;
25+
margin-right: 0.45rem;
26+
vertical-align: middle;
27+
animation: nco-pulse 2s infinite ease-in-out;
28+
}
29+
30+
@keyframes nco-pulse {
31+
0% { transform: scale(0.9); opacity: 0.6; box-shadow: 0 0 0 0 rgba(50, 108, 229, 0.4); }
32+
50% { transform: scale(1.1); opacity: 1; box-shadow: 0 0 0 4px rgba(50, 108, 229, 0); }
33+
100% { transform: scale(0.9); opacity: 0.6; box-shadow: 0 0 0 0 rgba(50, 108, 229, 0); }
34+
}
35+
36+
.nco-loader {
37+
width: 28px;
38+
height: 28px;
39+
border: 3px solid #f1f5f9;
40+
border-top-color: #326ce5;
41+
border-radius: 50%;
42+
animation: nco-spin 0.8s linear infinite;
43+
}
44+
45+
@keyframes nco-spin {
46+
to { transform: rotate(360deg); }
47+
}
48+
49+
.nco-state {
50+
animation: nco-fade-in 0.25s cubic-bezier(0.16, 1, 0.3, 1);
51+
}
52+
53+
@keyframes nco-fade-in {
54+
from { opacity: 0; transform: translateY(4px); }
55+
to { opacity: 1; transform: translateY(0); }
56+
}
57+
58+
.nco-session-row {
59+
border-bottom: 1px solid #f1f5f9;
60+
transition: all 0.2s ease;
61+
margin-left: -0.5rem;
62+
margin-right: -0.5rem;
63+
padding: 0.5rem;
64+
border-radius: 8px;
65+
}
66+
67+
.nco-session-row:hover {
68+
background-color: #f8fafc;
69+
border-color: transparent;
70+
}
71+
72+
.nco-session-row:last-child {
73+
border-bottom: none;
74+
}
75+
76+
.nco-session-row--unconfirmed {
77+
opacity: 0.85;
78+
}
79+
80+
.nco-session-row--unconfirmed .nco-session-title-text {
81+
font-weight: 600;
82+
}
83+
84+
.nco-globe-icon-wrapper {
85+
display: flex;
86+
align-items: center;
87+
justify-content: center;
88+
width: 38px;
89+
height: 38px;
90+
border-radius: 50%;
91+
background-color: #eff6ff;
92+
color: #326ce5;
93+
font-size: 1.1rem;
94+
transition: all 0.25s cubic-bezier(0.4, 0, 0.2, 1);
95+
}
96+
97+
.nco-session-row:hover .nco-globe-icon-wrapper {
98+
background-color: #326ce5;
99+
color: #ffffff;
100+
transform: rotate(12deg);
101+
}
102+
103+
.nco-session-link:link,
104+
.nco-session-link:visited {
105+
color: inherit;
106+
transition: all 0.2s ease;
107+
cursor: pointer;
108+
flex-grow: 1;
109+
text-decoration: none;
110+
}
111+
112+
.nco-session-title-text {
113+
font-size: 0.95rem;
114+
color: #1e293b;
115+
transition: color 0.2s ease;
116+
}
117+
118+
.nco-session-link:hover .nco-session-title-text {
119+
color: #326ce5;
120+
}
121+
122+
.nco-session-time-text {
123+
color: #64748b;
124+
transition: color 0.2s ease;
125+
}
126+
127+
.nco-session-link:hover .nco-session-time-text {
128+
color: #326ce5;
129+
opacity: 0.9;
130+
}
131+
132+
.nco-action-btn:link,
133+
.nco-action-btn:visited {
134+
display: inline-flex;
135+
align-items: center;
136+
justify-content: center;
137+
width: 36px;
138+
height: 36px;
139+
border-radius: 50%;
140+
background-color: #f1f5f9;
141+
color: #64748b;
142+
transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);
143+
border: 1px solid transparent;
144+
text-decoration: none;
145+
}
146+
147+
.nco-action-btn:hover {
148+
background-color: #eff6ff;
149+
color: #326ce5;
150+
border-color: #bfdbfe;
151+
transform: translateY(-1px);
152+
box-shadow: 0 4px 6px -1px rgba(50, 108, 229, 0.08);
153+
}
154+
155+
.nco-connected-link:link,
156+
.nco-connected-link:visited {
157+
display: flex;
158+
align-items: center;
159+
gap: 0.625rem;
160+
padding: 0.5rem 0.75rem;
161+
margin-left: -0.75rem;
162+
border-radius: 6px;
163+
color: #334155;
164+
font-weight: 500;
165+
font-size: 0.9rem;
166+
transition: all 0.2s ease;
167+
text-decoration: none;
168+
}
169+
170+
.nco-connected-link:hover {
171+
background-color: #f1f5f9;
172+
color: #326ce5;
173+
}
174+
175+
.nco-connected-link i {
176+
color: #94a3b8;
177+
font-size: 1rem;
178+
width: 18px;
179+
text-align: center;
180+
transition: color 0.2s ease;
181+
}
182+
183+
.nco-connected-link:hover i {
184+
color: #326ce5;
185+
}
186+
187+
.nco-connected-invite {
188+
color: #64748b;
189+
margin-left: 0.5rem;
190+
padding-left: 0.75rem;
191+
border-left: 1px solid #e2e8f0;
192+
}
193+
194+
.nco-inline-link:link,
195+
.nco-inline-link:visited {
196+
color: #326ce5;
197+
text-decoration: underline;
198+
}
199+
200+
.nco-footer-links {
201+
display: grid;
202+
grid-template-columns: repeat(3, 1fr);
203+
gap: 0.75rem;
204+
width: 100%;
205+
}
206+
207+
@media (max-width: 576px) {
208+
.nco-footer-links {
209+
grid-template-columns: 1fr;
210+
gap: 0.5rem;
211+
}
212+
}
213+
214+
.nco-footer-btn:link,
215+
.nco-footer-btn:visited {
216+
display: flex;
217+
align-items: center;
218+
justify-content: center;
219+
gap: 0.5rem;
220+
padding: 0.625rem;
221+
border-radius: 6px;
222+
background-color: #f8fafc;
223+
border: 1px solid #e2e8f0;
224+
color: #475569;
225+
font-weight: 600;
226+
font-size: 0.85rem;
227+
text-align: center;
228+
transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);
229+
text-decoration: none;
230+
}
231+
232+
.nco-footer-btn .fa-youtube {
233+
color: #dc3545;
234+
}
235+
236+
.nco-footer-btn:hover {
237+
background-color: #eff6ff;
238+
border-color: #bfdbfe;
239+
color: #326ce5;
240+
transform: translateY(-1px);
241+
}

assets/scss/_styles_project.scss

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,9 @@ Add styles or import other files. */
1717
// Cross-cutting media queries
1818
@import "base";
1919

20+
// NCO feature
21+
@import "nco";
22+
2023
/* Chroma syntax highlighting (emacs theme) */
2124
.chroma {
2225
background-color: #f8f8f8;

data/nco.yaml

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
# Typical NCO cadence and times (guidance only).
2+
# Confirmed next-session date/time/Zoom come from Google Calendar events.
3+
# Do NOT treat these values as proof that a given month's EMEA or AMER session exists.
4+
name: "Kubernetes New Contributor Orientation"
5+
calendar_id: "calendar@kubernetes.io"
6+
search_query: "New Contributor Orientation"
7+
schedule: "Third Tuesday of every month"
8+
session_times:
9+
emea:
10+
label: "EMEA/APAC-friendly"
11+
timezone_string: "1:30 PT / 8:30 UTC / 10:30 CET / 14:00 IST"
12+
amer:
13+
label: "AMER-friendly"
14+
timezone_string: "8:30 PT / 15:30 UTC / 17:30 CET / 21:00 IST"
15+
links:
16+
mailing_list: "https://groups.google.com/forum/#!forum/kubernetes-sig-contribex"
17+
dev_mailing_list: "https://groups.google.com/a/kubernetes.io/g/dev"
18+
slack_join: "https://slack.k8s.io/"
19+
slack_new_contributors: "https://kubernetes.slack.com/archives/C09R23FHP"
20+
slack_sig_contribex: "https://kubernetes.slack.com/archives/C1TU9EB9S"
21+
youtube_playlist: "https://www.youtube.com/playlist?list=PL69nYSiGNLP24dHZ4BifJwHPHGch94d9F"
22+
slide_deck: "https://github.com/kubernetes/community/blob/main/mentoring/new-contributor-orientation/nco-slides/TEMPLATE%20%5BMONTH%5D%20New%20Contributor%20Orientation.pdf"

0 commit comments

Comments
 (0)