Breu introducció de: (10 - 15 min)
Organizando chistes con NLP
Speaker: Julio Martínez (@liopic)
diff --git a/content/events/pyday_bcn/pyday_bcn_2019.md b/content/events/pyday_bcn/pyday_bcn_2019.md
index fd3c3f0d8..c1dcf5360 100644
--- a/content/events/pyday_bcn/pyday_bcn_2019.md
+++ b/content/events/pyday_bcn/pyday_bcn_2019.md
@@ -47,7 +47,7 @@ sponsor_levels:
sponsors: [kschool, satellogic, blueliv]
name: Silver
-# The programme of this edition, read from the printed agenda that the live
+# The program of this edition, read from the printed agenda that the live
# thread on X photographed (tweet 1195637939285430272, the photo on this page).
# The Google Calendar embed that held it is gone, and the Meetup description
# never carried it, so that photograph is the source. Titles are copied from
@@ -181,10 +181,10 @@ rooms:
# corrects now lives.
#
# This page declares no eventTimes, so no grid is rendered from this list.
-# The programme a reader sees is the Google Calendar embed in the body, which
+# The program a reader sees is the Google Calendar embed in the body, which
# is what the association published. The list is here because a photo of the
# gallery joins to a talk by id, and because the nine photo days still to
-# import need one shape for a programme and not two.
+# import need one shape for a program and not two.
agenda:
# The sheets print the opening keynote in all three tracks at 9:30, so it is
# one slot across the grid. The closing keynote has no slot: it is not on
@@ -264,7 +264,7 @@ agenda:
level: beginner
# Photos published by PyBCN on the day. One per tweet, so no two share a
-# caption, and the caption is also the alt text. PyBCN organisers took them.
+# caption, and the caption is also the alt text. PyBCN organizers took them.
# The page credits the account that published them, which is the part the
# post itself proves.
# The one photo of this day: the group photo when the day has one, and the
diff --git a/content/events/pyday_bcn/pyday_bcn_2020.md b/content/events/pyday_bcn/pyday_bcn_2020.md
index 7938baeef..5e5cdc559 100644
--- a/content/events/pyday_bcn/pyday_bcn_2020.md
+++ b/content/events/pyday_bcn/pyday_bcn_2020.md
@@ -72,8 +72,8 @@ numTracks: 2
eventTimes: ["16:00", "16:15", "16:30", "16:45", "17:00", "17:15", "17:30", "17:45", "18:00", "18:15", "18:30", "18:45", "19:00", "19:15", "19:30", "19:45", "20:00", "20:15", "20:30"]
# The rooms of this edition, in the order the grid first names them. A room is
-# a record with an id because the colour of a block now comes from it: the
-# template gives every room of an event one colour of the agenda palette and
+# a record with an id because the color of a block now comes from it: the
+# template gives every room of an event one color of the agenda palette and
# keeps it for the whole day. See partials/agenda_entry.html.
rooms:
- id: youtube-track1-and-track2
diff --git a/content/events/pyday_bcn/pyday_bcn_2021.md b/content/events/pyday_bcn/pyday_bcn_2021.md
index b8e262f3d..9776339e6 100644
--- a/content/events/pyday_bcn/pyday_bcn_2021.md
+++ b/content/events/pyday_bcn/pyday_bcn_2021.md
@@ -93,8 +93,8 @@ legend:
- type: sponsor
# The rooms of this edition, in the order the grid first names them. A room is
-# a record with an id because the colour of a block now comes from it: the
-# template gives every room of an event one colour of the agenda palette and
+# a record with an id because the color of a block now comes from it: the
+# template gives every room of an event one color of the agenda palette and
# keeps it for the whole day. See partials/agenda_entry.html.
rooms:
- id: open-air-terrace
@@ -260,7 +260,7 @@ talks:
# the integer 540.
agenda:
- start: "9:00"
- credited_as: "PyDay BCN 2021 Organising Committee"
+ credited_as: "PyDay BCN 2021 organizers"
track_length: 4
room: open-air-terrace
type: group
@@ -405,7 +405,7 @@ agenda:
topic_level: beginner
requirements: "Try to run Nautobot Lab (https://github.com/nautobot/nautobot-lab) in Docker, as we'll use it as support during the workshop."
- start: "17:30"
- credited_as: "PyDay BCN 2021 Organising Committee"
+ credited_as: "PyDay BCN 2021 organizers"
track_length: 4
room: all-rooms
type: group
diff --git a/content/events/pyday_bcn/pyday_bcn_2022.md b/content/events/pyday_bcn/pyday_bcn_2022.md
index faf8f8ba1..8b14b618e 100644
--- a/content/events/pyday_bcn/pyday_bcn_2022.md
+++ b/content/events/pyday_bcn/pyday_bcn_2022.md
@@ -125,8 +125,8 @@ legend:
- level: advanced
# The rooms of this edition, in the order the grid first names them. A room is
-# a record with an id because the colour of a block now comes from it: the
-# template gives every room of an event one colour of the agenda palette and
+# a record with an id because the color of a block now comes from it: the
+# template gives every room of an event one color of the agenda palette and
# keeps it for the whole day. See partials/agenda_entry.html.
rooms:
- id: sala-dactes-ada-lovelace
@@ -261,7 +261,7 @@ talks:
# the integer 540.
agenda:
- start: "9:00"
- credited_as: "PyDay BCN 2022 Organising Committee"
+ credited_as: "PyDay BCN 2022 organizers"
track_length: 3
room: sala-dactes-ada-lovelace
type: group
diff --git a/content/events/pyday_bcn/pyday_bcn_2023.md b/content/events/pyday_bcn/pyday_bcn_2023.md
index 5797cebed..d91ea54d6 100644
--- a/content/events/pyday_bcn/pyday_bcn_2023.md
+++ b/content/events/pyday_bcn/pyday_bcn_2023.md
@@ -126,8 +126,8 @@ legend:
- level: advanced
# The rooms of this edition, in the order the grid first names them. A room is
-# a record with an id because the colour of a block now comes from it: the
-# template gives every room of an event one colour of the agenda palette and
+# a record with an id because the color of a block now comes from it: the
+# template gives every room of an event one color of the agenda palette and
# keeps it for the whole day. See partials/agenda_entry.html.
rooms:
- id: room-b5
@@ -262,7 +262,7 @@ talks:
# the integer 540.
agenda:
- start: "9:00"
- credited_as: "PyDay BCN 2023 Organising Committee"
+ credited_as: "PyDay BCN 2023 organizers"
track_length: 3
room: room-b5
type: group
diff --git a/content/events/pyday_bcn/pyday_bcn_2024.md b/content/events/pyday_bcn/pyday_bcn_2024.md
index e113d8567..d3f836c16 100644
--- a/content/events/pyday_bcn/pyday_bcn_2024.md
+++ b/content/events/pyday_bcn/pyday_bcn_2024.md
@@ -121,8 +121,8 @@ legend:
- level: advanced
# The rooms of this edition, in the order the grid first names them. A room is
-# a record with an id because the colour of a block now comes from it: the
-# template gives every room of an event one colour of the agenda palette and
+# a record with an id because the color of a block now comes from it: the
+# template gives every room of an event one color of the agenda palette and
# keeps it for the whole day. See partials/agenda_entry.html.
rooms:
- id: sala-dactes-ada-lovelace
@@ -269,7 +269,7 @@ talks:
# the integer 540.
agenda:
- start: "9:00"
- credited_as: "PyDay BCN 2024 Organizing Committee"
+ credited_as: "PyDay BCN 2024 organizers"
track_length: 4
room: sala-dactes-ada-lovelace
type: group
diff --git a/content/events/pyday_bcn/pyday_bcn_2025.md b/content/events/pyday_bcn/pyday_bcn_2025.md
index 9f1c0635b..f8c6c3959 100644
--- a/content/events/pyday_bcn/pyday_bcn_2025.md
+++ b/content/events/pyday_bcn/pyday_bcn_2025.md
@@ -156,8 +156,8 @@ legend:
- level: advanced
# The rooms of this edition, in the order the grid first names them. A room is
-# a record with an id because the colour of a block now comes from it: the
-# template gives every room of an event one colour of the agenda palette and
+# a record with an id because the color of a block now comes from it: the
+# template gives every room of an event one color of the agenda palette and
# keeps it for the whole day. See partials/agenda_entry.html.
rooms:
- id: sala-dactes-ada-lovelace
@@ -386,7 +386,7 @@ talks:
# the integer 540.
agenda:
- start: "9:00"
- credited_as: "PyDay BCN 2025 Organising Committee"
+ credited_as: "PyDay BCN 2025 organizers"
track_length: 4
room: sala-dactes-ada-lovelace
type: group
diff --git a/content/people/_content.gotmpl b/content/people/_content.gotmpl
index 41fcc3227..d2b2f1343 100644
--- a/content/people/_content.gotmpl
+++ b/content/people/_content.gotmpl
@@ -31,9 +31,16 @@
run with -D adds no role for the fixture of content/canary.md.
The path segment is the label through urlize, "Permanent Committee"
- to permanent-committee and "Former Management Board (2018 - 2025)" to
- former-management-board-2018-2025, under one directory, role/, so a
- segment can never collide with a person id, which is firstname-surname.
+ to permanent-committee and "Mentor" to mentor, under one directory,
+ role/, so a segment can never collide with a person id, which is
+ firstname-surname. Three labels keep the segment of the words they
+ replaced (the table $segments below): the board is "Board (2026)" and
+ "Former Board (2018 - 2025)" since the glossary of 2026-10-25 and was
+ "Management Board" before, and the people who organized an event are
+ "Event organizer" and were "Organizer". Their pages stay at
+ management-board-2026, former-management-board-2018-2025, and
+ organizer, because a published release links the first one and
+ nothing is gained by moving the others.
The page carries the label as params.filter, which is how every walker
of the people section tells a listing from a person (a person has an
id, a listing has a filter), and how layouts/people/role.html knows
@@ -49,20 +56,25 @@
format; the name here is the path of the file under content/, which is
unique, where two sections both hold a job-offers.md.
- One more page, Assistants, which no label gives: /people/role/assistants/
+ One more page, Attendees, which no label gives: /people/role/attendees/
answers the question a reader of the other tabs asks next, who came,
and the answer is that the association never recorded it. The tab
- exists to say so. It is the data policy of the
- archive told as a joke: a programme, a board page, or a credit names
+ exists to say so. It was /people/role/assistants/ until the glossary
+ of 2026-10-25 (an assistant is a helper in English, the word was a
+ calque of the Catalan assistent), and the old address is an alias. It is the data policy of the
+ archive told as a joke: a program, a board page, or a credit names
the people who spoke, organized, mentored, or collaborated, and an
- attendee is on no such list. The one figure that exists is the count
- of Meetup RSVPs, which the page of a meetup prints as registrations
- and never as attendance (AGENTS.md: RSVPs are not attendance). The
- page carries its text as content and the same filter param as the
- others, so partials/people_tabs.html lists it from the pages like any
- other view, with no count because there is no number to print, and
- layouts/people/role.html prints the text where /people/ prints its
- intro and no empty bar of letters under it.
+ attendee is on no such list. The one figure that exists is the sum
+ of the Meetup RSVPs, which the page of a meetup prints as RSVPs and
+ never as attendance (AGENTS.md: RSVPs are not attendance), and the
+ page prints that sum and says what it is. The text is not here: an
+ adapter runs before the pages exist and cannot add the figure up, so
+ the page carries the same filter param as the others and no content,
+ partials/people_tabs.html lists it from the pages like any other
+ view, with no count because it holds no people, and
+ layouts/people/role.html prints partials/attendees_note.html where
+ /people/ prints its intro and no empty bar of letters under it. The
+ Meetup RSVPs tile of the home page leads here with the same sum.
*/ -}}
{{- $root := "content" -}}
@@ -121,21 +133,30 @@
{{- end -}}
{{- end -}}
+{{- /* The labels whose page keeps the path segment of the words they
+ replaced. See the header. */ -}}
+{{- $segments := dict
+ "Board (2026)" "management-board-2026"
+ "Former Board (2018 - 2025)" "former-management-board-2018-2025"
+ "Event organizer" "organizer" -}}
+
{{- /* The page of each label, in the order of the labels, so two builds
add the pages in one order. The title is the label itself, the
- words the row of a person prints and the tab reads. */ -}}
+ words the row of a person prints, and the tab reads the title. */ -}}
{{- range $label, $_ := $labels -}}
- {{- /* "Organizers (23)" and not "Organizer (23)": the heading names
+ {{- /* "Speakers (356)" and not "Speaker (356)": the heading names
what the page holds, which is people. A label that is a group
- and not a role ("Permanent Committee", "Management Board
- (2026)") is already the name of the thing and is left alone. */ -}}
+ and not a role ("Permanent Committee", "Board (2026)") is
+ already the name of the thing and is left alone; the test is
+ a parenthesis or the word Committee, because a role can be two
+ words ("Event organizer", whose page is "Event organizers"). */ -}}
{{- $title := $label -}}
- {{- if not (or (strings.Contains $label " ") (strings.Contains $label "(")) -}}
+ {{- if not (or (strings.Contains $label "Committee") (strings.Contains $label "(")) -}}
{{- $title = pluralize $label -}}
{{- end -}}
{{- $.AddPage (dict
"kind" "page"
- "path" (printf "role/%s" (urlize $label))
+ "path" (printf "role/%s" (default (urlize $label) (index $segments $label)))
"title" $title
"layout" "role"
"params" (dict
@@ -143,15 +164,12 @@
"description" (printf "Every person the archive credits as %s, with their roles, their events, and their links." $label))) -}}
{{- end -}}
-{{- $assistants := `## We don't track that!
-
-The association has never recorded who came to an event. The archive holds the people who spoke, organized, mentored, or collaborated, because a programme, a board page, or a credit names them, and an attendee is on no such list. The one figure that exists is how many people said yes on Meetup, which the page of a meetup prints as registrations: a promise to come, not a seat filled.` -}}
{{- $.AddPage (dict
"kind" "page"
- "path" "role/assistants"
- "title" "Assistants"
+ "path" "role/attendees"
+ "title" "Attendees"
"layout" "role"
- "content" (dict "mediaType" "text/markdown" "value" $assistants)
+ "aliases" (slice "/people/role/assistants/")
"params" (dict
- "filter" "Assistants"
- "description" "Who came to an event. The association never recorded it, so the archive holds the people who spoke, organized, mentored, or collaborated, and nobody else.")) -}}
+ "filter" "Attendees"
+ "description" "Who came to an event. The association never recorded it, so the archive holds the people who spoke, organized, mentored, or collaborated, and nobody else. The one figure is the Meetup RSVPs.")) -}}
diff --git a/content/people/_index.md b/content/people/_index.md
index 05ae3bad6..d9f6c01d5 100644
--- a/content/people/_index.md
+++ b/content/people/_index.md
@@ -5,4 +5,4 @@ menu: "main"
weight: 3
---
-Everyone the archive credits, by name. A row holds the roles the person has held, how many events credit them, and the pages that say so: the programme of a day, its photos, and the page of the board or the committee they sat on. The tabs above the list keep one role at a time. The board, the committee, and the collaborators of today are grouped on [the organizers page](/pybcn_association/organizers/).
+Everyone the archive credits, by name. A row holds the roles the person has held, how many events credit them, and the pages that say so: the program of a day, its photos, and the page of the board or the committee they sat on. The tabs above the list keep one role at a time. The board, the committee, and the collaborators of today are grouped on the [Who we are](/pybcn_association/organizers/) page.
diff --git a/content/pybcn_association/collaborate.md b/content/pybcn_association/collaborate.md
index 4e2d32d88..862f3eb17 100644
--- a/content/pybcn_association/collaborate.md
+++ b/content/pybcn_association/collaborate.md
@@ -11,13 +11,13 @@ heroBackground: /images/photos/people-pyday-2019.jpg
---
-PyBCN runs on volunteers. Everything you see here, the monthly meetups, PyDay BCN, PyDataBCN, the PyLadies BCN workshops, is organised by people in the community who decided to help.
+PyBCN runs on volunteers. Everything you see here, the monthly meetups, PyDay BCN, PyDataBCN, the PyLadies BCN workshops, is organized by people in the community who decided to help.
There are several ways in, and none of them asks for much to start:
* **[Become a member](/pybcn_association/membership/)** and support the association.
* **[Give a talk](/pybcn_association/propose-a-talk/)** at a meetup. First talks are very welcome, and we will help you prepare it.
-* **[Help organise an event](/pybcn_association/organize-with-us/)**, or propose one of your own.
+* **[Help organize an event](/pybcn_association/organize-with-us/)**, or propose one of your own.
* **[Sponsor us](/pybcn_association/sponsor-us/)**, or offer your office as a venue for a meetup.
* **[Post a job offer](/pybcn_association/job-offers/)** to the community.
* **[Promote your event](/pybcn_association/promote-your-event/)** if it is relevant to Python people in Barcelona.
diff --git a/content/pybcn_association/information.md b/content/pybcn_association/information.md
index 33d4f366b..d4f72b5e9 100644
--- a/content/pybcn_association/information.md
+++ b/content/pybcn_association/information.md
@@ -11,7 +11,7 @@ heroBackground: /images/photos/group-pydata-2017.jpg
---
-After 10 years of experience organizing python-related events and more than 3000 members on Meetup, **Python Barcelona (PyBCN)** was officially registered as a non-profit association in 2018. PyBCN is a meeting point for all the Barcelona Python community, and we organize different monthly activities like [PyBCN and PyLadiesBCN meetups and practice sessions](../../events/monthly_events), along with some annual events like [PyDay BCN](../../events/pyday_bcn/pyday_bcn_2022) or [PyDataBCN](../../events/pydatabcn/pydatabcn_2023/).
+After 10 years of experience organizing python-related events and more than 3000 people in its Meetup group, **Python Barcelona (PyBCN)** was officially registered as a non-profit association in 2018. PyBCN is a meeting point for all the Barcelona Python community, and we organize different monthly activities like [PyBCN and PyLadiesBCN meetups and practice sessions](../../events/monthly_events), along with some annual events like [PyDay BCN](../../events/pyday_bcn/pyday_bcn_2022) or [PyDataBCN](../../events/pydatabcn/pydatabcn_2023/).
Would you like to be a part of PyBCN? We are looking forward to hearing from you!
@@ -23,9 +23,9 @@ Would you like to be a part of PyBCN? We are looking forward to hearing from you
## How does PyBCN operate?
-We have a Management Board and a Permanent Committee to make decisions, and work groups to drive all the association activity.
+We have a Board and a Permanent Committee to make decisions, and work groups to drive all the association activity.
-* **Management Board**
+* **Board**
* President: Jordi Bosch Alibau
* Secretary: Daniel Mesejo Leon
* Treasurer: Yago Tafalla
@@ -46,7 +46,7 @@ We have a Management Board and a Permanent Committee to make decisions, and work
All the work groups must follow some rules:
* Every work group must have Chair, who will be accountable for the work group work to the Permanent Committee.
- * The Chair is chosen by the work group members, who must be member of the Permanent Committee.
+ * The Chair is chosen by the people in the work group, who must sit on the Permanent Committee.
* At least two members of the Permanent Committee must be part of every work group.
* Nobody can participate in more than three work groups.
* There's no other requirement to be a member of any work group.
@@ -65,8 +65,8 @@ photograph of the day where the association published one.
{{< assemblies >}}
-## Past Management Boards
-* Management Board 2018 - 2025
+## Past Boards
+* Board 2018 - 2025
* President: Laura Pérez-Mayos
* Secretary: Natàlia Padilla
* Treasurer: Mireia Álvarez
diff --git a/content/pybcn_association/legal-notice.md b/content/pybcn_association/legal-notice.md
index f0eda4875..8b346f6a7 100644
--- a/content/pybcn_association/legal-notice.md
+++ b/content/pybcn_association/legal-notice.md
@@ -13,17 +13,17 @@ heroBackground: /images/photos/reg-desk-pyday-2019.jpg
---
-This website, [pybcn.org](https://pybcn.org), is run by **Associació Python Barcelona** (PyBCN), a non-profit association of volunteers who organise Python meetups and events in Barcelona.
+This website, [pybcn.org](https://pybcn.org), is run by **Associació Python Barcelona** (PyBCN), a non-profit association of volunteers who organize Python meetups and events in Barcelona.
## Who we are
{{< association-identity >}}
-The Management Board is responsible for this website. You can see who sits on it on the [Information](/pybcn_association/information/) page.
+The Board is responsible for this website. You can see who sits on it on the [Information](/pybcn_association/information/) page.
## What this site is
-This is an informational site. It describes the association, its events, the people who organise them and speak at them, and how to join, propose a talk, or sponsor us. Nothing is sold through this site. The membership fee is paid on PayPal's own site, not here. Some pages embed a Google Form or a Google Calendar, and the page of a recorded talk, the page of a recorded session, the page of a speaker, and the home page embed video in a YouTube player (youtube-nocookie.com); those frames are served by Google.
+This is an informational site. It describes the association, its events, the people who organize them and speak at them, and how to join, propose a talk, or sponsor us. Nothing is sold through this site. The membership fee is paid on PayPal's own site, not here. Some pages embed a Google Form or a Google Calendar, and the page of a recorded talk, the page of a recorded session, the page of a speaker, and the home page embed video in a YouTube player (youtube-nocookie.com); those frames are served by Google.
The site is a set of static pages, published from a public repository on GitHub and served by GitHub Pages. We keep no server of our own and we run no analytics. The [Privacy policy](/pybcn_association/privacy-policy/) says what personal data this involves.
@@ -31,8 +31,8 @@ The site is a set of static pages, published from a public repository on GitHub
- The text on this site is written by volunteers and belongs to the association. You can quote it with a link to the page. Ask us before you reuse more than that.
- The photographs and biographies on the people pages belong to the people shown. Do not reuse them without their permission.
-- The logos of sponsors and partner organisations belong to their owners.
-- The site code is in a [public repository](https://github.com/pybcn/pybcn.github.io) on GitHub. The theme is free software under the MIT licence.
+- The logos of sponsors and partner organizations belong to their owners.
+- The site code is in a [public repository](https://github.com/pybcn/pybcn.github.io) on GitHub. The theme is free software under the MIT license.
## Links to other sites
@@ -54,4 +54,4 @@ We may update this notice. Every change is visible in the [history of this page]
Spanish law applies to this notice and to the use of this site. Any dispute goes to the courts of Barcelona, unless the law gives you the right to the courts of your own domicile.
-Last updated: 2026-10-14
+Last updated: 2026-10-25
diff --git a/content/pybcn_association/membership.md b/content/pybcn_association/membership.md
index 41677f194..760dddacb 100644
--- a/content/pybcn_association/membership.md
+++ b/content/pybcn_association/membership.md
@@ -11,7 +11,7 @@ heroBackground: /images/photos/people-pydata-2017.jpg
---
-The Python Barcelona Association, a.k.a. PyBCN, is a non-profit organisation with more than 10 years of history, focused on increasing the usage and knowledge of the Python programming language. By becoming a member, you'll support the association's activities and programs, helping us to increase the number of activities, to improve them (i.e. getting a better recording system for the meetups) and to cover basic expenses (domains, meetup fees...). **For just 20€/year you can now become a member of our community!**
+The Python Barcelona Association, a.k.a. PyBCN, is a non-profit organization with more than 10 years of history, focused on increasing the usage and knowledge of the Python programming language. By becoming a member, you'll support the association's activities and programs, helping us to increase the number of activities, to improve them (i.e. getting a better recording system for the meetups) and to cover basic expenses (domains, meetup fees...). **For just 20€/year you can now become a member of our community!**
{{< grid-row >}}
{{< grid-col md="6" >}}
diff --git a/content/pybcn_association/organizers.md b/content/pybcn_association/organizers.md
index b636826dc..5d174909c 100644
--- a/content/pybcn_association/organizers.md
+++ b/content/pybcn_association/organizers.md
@@ -1,5 +1,5 @@
---
-title: "Organizers"
+title: "Who we are"
# The name the appearance list of a person modal calls this page by. The
# line there reads "Permanent Committee at PyBCN", where the title would
# read "Permanent Committee at Organizers" and repeat the role. See
@@ -17,7 +17,7 @@ heroBackground: /images/photos/reg-desk-pyday-2019.jpg
people_levels:
- people_per_line: 5
people: [jordi-bosch, daniel-mesejo-leon, yago-tafalla, mauricio-volcanes, sergi-ramirez]
- name: Management Board (2026)
+ name: Board (2026)
# The faces the home page shows, which are the two bodies that
# run the association.
home_faces: true
@@ -31,7 +31,7 @@ people_levels:
people: [elisabeth-ortega-carrasco, josep-martinez-vila, loris-mularoni, laura-perez-mayos, nuria-pujol-vilanova, jose-riera-sanchez, ruben-berenguel, xavi-francisco-gilabert]
name: Collaborators
- people_per_line: 5
- name: Former Management Board (2018 - 2025)
+ name: Former Board (2018 - 2025)
# An entry with a role shows that role on this page instead of the
# pybcn_position of the person file. See people-grid.html.
people:
diff --git a/content/pybcn_association/privacy-policy.md b/content/pybcn_association/privacy-policy.md
index d77b5b1be..034e797c2 100644
--- a/content/pybcn_association/privacy-policy.md
+++ b/content/pybcn_association/privacy-policy.md
@@ -22,19 +22,27 @@ PyBCN is a volunteer association. This page says what personal data this website
- **Email**: [pybcn@googlegroups.com](mailto:pybcn@googlegroups.com)
- **Registered address**: Carrer de Concepció Arenal, 165, 08027 Barcelona
-The Management Board handles requests about personal data. We have no data protection officer: the law does not require one for an association of our size and activity.
+The Board handles requests about personal data. We have no data protection officer: the law does not require one for an association of our size and activity.
## What data this site involves, and why
### People pages
-The site has pages for the people who organise our events, speak at them, mentor at workshops, or collaborate with the association. Each page shows a name, a photograph, a short biography, the role in PyBCN or at an event, and links to the person's own profiles (GitHub, LinkedIn, Twitter, personal site).
+The site has pages for the people who organize our events, speak at them, mentor at workshops, or collaborate with the association. Each page shows a name, a photograph, a short biography, the role in PyBCN or at an event, and links to the person's own profiles (GitHub, LinkedIn, Twitter, personal site).
-- **Where it comes from**: the person. Each one sent the photograph and wrote or approved the text for publication here. Someone who did not want a photograph did not send one, and the page shows a silhouette instead.
-- **Why we have it**: with the person's consent (GDPR article 6.1.a). You can withdraw it at any time, and we remove the page. Withdrawing consent does not affect what was published before.
+- **Where it comes from**: for most people, the person. They sent the photograph and wrote or approved the text for publication here. For speakers that the archive credits, the public announcements of our own Meetup events: the page then shows the name, the talks, and the events. A page with no photograph shows the initials of the name on a color instead; the grid of organizers or speakers on an event page shows a silhouette.
+- **Why we have it**: for a page that the person sent, their consent (GDPR article 6.1.a). You can withdraw it at any time, and we remove the page. Withdrawing consent does not affect what was published before. For a page built from our announcements, our legitimate interest in keeping the history of the community (GDPR article 6.1.f). You can object to it, and we remove the page (see [Your rights](#your-rights)).
- **How long we keep it**: until the person asks us to remove it, or until we take the page down ourselves because it is out of date.
- **One thing to know**: the source of this site is a public Git repository on GitHub. When we remove a page, it disappears from the site and from the current version of the repository. The old text remains in the repository history, as with any Git project. Tell us if you also want it gone from there and we will work it out with you. Copies kept by search engines and web archives are outside our control.
+### Event photographs
+
+Some event pages show photographs from the posts of the association on X, with the caption they were posted with. Only photographs that the association published itself are on the site. They show the event in general: a speaker gave the talk in public and accepted that it was recorded, and the audience appears in the background and from a distance.
+
+- **Where it comes from**: the public posts of the association on X.
+- **Why we have it**: our legitimate interest in keeping the history of the community (GDPR article 6.1.f). You can object to a photograph in which you appear, and we remove it (see [Your rights](#your-rights)).
+- **How long we keep it**: until someone objects to it, or until we remove the gallery.
+
### Forms
A few pages link to or embed a Google Form:
@@ -49,7 +57,7 @@ Each form asks for what it needs to handle your request: usually your name, an e
- **Where it goes**: into a Google Forms spreadsheet in a Google account run by the association's organizers. Google stores it under its own [privacy policy](https://policies.google.com/privacy).
- **Why we have it**: to do what you asked for, which is the membership agreement or the steps you take to propose a talk or join a workshop (GDPR article 6.1.b).
- **Who sees it**: the organizers of that event or working group.
-- **How long we keep it**: responses to an event form are needed until the event is over and its programme is published. We have no automatic deletion after that. Ask us and we delete your response. Membership data stays in the member register for as long as you are a member; the law requires associations to keep that register and the related accounting records for some years after.
+- **How long we keep it**: responses to an event form are needed until the event is over and its program is published. We have no automatic deletion after that. Ask us and we delete your response. Membership data stays in the member register for as long as you are a member; the law requires associations to keep that register and the related accounting records for some years after.
### Membership payments
@@ -57,13 +65,13 @@ The membership fee is paid on [PayPal](https://www.paypal.com)'s site through a
### Email
-Our contact addresses, such as pybcn@googlegroups.com and pyladies-bcn@googlegroups.com, are Google Groups. A message you send there is stored in the group and read by the organizers who are members of that group. We use it to answer you and to follow up on what you asked (GDPR article 6.1.b and 6.1.f). The thread stays in the group archive; ask us and we delete it.
+Our contact addresses, such as pybcn@googlegroups.com and pyladies-bcn@googlegroups.com, are Google Groups. A message you send there is stored in the group and read by the organizers who belong to that group. We use it to answer you and to follow up on what you asked (GDPR article 6.1.b and 6.1.f). The thread stays in the group archive; ask us and we delete it.
### Embedded Google content
A few pages embed a Google Form or a Google Calendar in a frame: the two talk proposal forms and the agenda of PyDay BCN 2019. The frame is served by Google: when the page loads, Google sees your IP address and browser details, and may set its own cookies inside the frame. Google's [privacy policy](https://policies.google.com/privacy) applies to that.
-Some pages embed a video in a frame from **youtube-nocookie.com**, the YouTube player Google serves for sites that do not want it to set cookies. Four kinds of page carry one: the page of a talk that was recorded, one frame per talk; the page of a meetup whose session was recorded as a whole, one frame per recording; the page of a person, one frame per recorded talk they gave; and the home page, which plays the presentation of the Barcelona community at PyConES 2020. No other page has one: the lists of events, talks, and people, and the programme of an event, carry a link to the video and nothing else. What the frame does and does not do:
+Some pages embed a video in a frame from **youtube-nocookie.com**, the YouTube player Google serves for sites that do not want it to set cookies. Four kinds of page carry one: the page of a talk that was recorded, one frame per talk; the page of a meetup whose session was recorded as a whole, one frame per recording; the page of a person, one frame per recorded talk they gave; and the home page, which plays the presentation of the Barcelona community at PyConES 2020. No other page has one: the lists of events, talks, and people, and the program of an event, carry a link to the video and nothing else. What the frame does and does not do:
- When you open one of those pages and scroll near a video, your browser asks Google for the player. Google then sees your IP address and browser details, and that you opened that page on this site, as it would for an image loaded from its servers. This happens before you press play.
- Until you press play, Google states that this player stores nothing in your browser and sets no cookie.
@@ -72,7 +80,7 @@ Some pages embed a video in a frame from **youtube-nocookie.com**, the YouTube p
### Cookies
-This site sets no cookies of its own, and runs no analytics or tracking scripts. Your browser also loads a few images from unsplash.com (page headers) and paypalobjects.com (the PayPal button). Like any image host, those servers see your IP address and browser details.
+This site sets no cookies of its own, and runs no analytics or tracking scripts. Its scripts, styles, fonts, and images are served from this site, with two exceptions: the membership pages load the PayPal button from paypalobjects.com, and the page of PyDay BCN 2018 loads the Eventbrite ticket button from eventbrite.es. Like any image host, those servers see your IP address and browser details.
### Hosting
@@ -80,7 +88,7 @@ The site is served by [GitHub Pages](https://pages.github.com). GitHub may log t
## Who else sees your data
-Nobody buys or receives your data from us. The companies named above see it because we use their services: Google (forms, calendar, mailing lists, documents, and the YouTube player on the talk pages), PayPal (payments), and GitHub (hosting and the source repository). All three are based in the USA. Each publishes the safeguards it applies to data from the EU, and we rely on those.
+Nobody buys or receives your data from us. The companies named above see it because we use their services: Google (forms, calendar, mailing lists, documents, and the YouTube player on the talk pages), PayPal (payments), Eventbrite (the ticket button on the page of PyDay BCN 2018), and GitHub (hosting and the source repository). All four are based in the USA. Each publishes the safeguards it applies to data from the EU, and we rely on those.
## Your rights
@@ -101,4 +109,4 @@ If you think we handle your data wrongly, you can complain to the Spanish data p
We may update this policy. Every change is visible in the [history of this page](https://github.com/pybcn/pybcn.github.io/commits/edition/content/pybcn_association/privacy-policy.md) on GitHub.
-Last updated: 2026-10-14
+Last updated: 2026-10-25
diff --git a/content/pybcn_association/promote-your-event.md b/content/pybcn_association/promote-your-event.md
index 8cfeea36d..a807b0578 100644
--- a/content/pybcn_association/promote-your-event.md
+++ b/content/pybcn_association/promote-your-event.md
@@ -19,8 +19,8 @@ heroBackground: /images/photos/reg-desk-pyday-2019.jpg
- It must be clearly stated **who is organizing the event**, and therefore who is responsible for it.
## What do you get
-- We'll forward your event information to our PyBCN meetup list, with more than 3K members.
-- We'll forward your event information to our PyLadiesBCN meetup list, with more than 600 members.
+- We'll forward your event information to our PyBCN Meetup group, with more than 3K people.
+- We'll forward your event information to our PyLadiesBCN Meetup group, with more than 600 people.
- We'll mention your event in our social networks.
## How does it work?
diff --git a/content/pyladies_bcn/_index.md b/content/pyladies_bcn/_index.md
index 60f5cb68e..2458fedc5 100644
--- a/content/pyladies_bcn/_index.md
+++ b/content/pyladies_bcn/_index.md
@@ -13,7 +13,7 @@ config: "pyladies_first"
**[About PyLadiesBCN!](/pyladies_bcn/about)**\
Learn all about our mission
-**[Organisers and speakers!](/pyladies_bcn/organizers-and-speakers)**\
+**[Organizers and speakers!](/pyladies_bcn/organizers-and-speakers)**\
The people that make it possible
**[Upcoming meetups!](/pyladies_bcn/meetups)**\
diff --git a/content/pyladies_bcn/about.md b/content/pyladies_bcn/about.md
index 024f3ff44..58928ecd7 100644
--- a/content/pyladies_bcn/about.md
+++ b/content/pyladies_bcn/about.md
@@ -36,6 +36,6 @@ We are an **international mentorship group** with a focus on providing a friendl
Would you like to participate? Have a look at our [upcoming events!](/pyladies_bcn/meetups/)
Would you like to collaborate? [Contact us!](/pyladies_bcn/contact-us/)
-And if you'd like to get some more information about our parent organisation, check out [their website](https://www.pyladies.com).
+And if you'd like to get some more information about our parent organization, check out [their website](https://www.pyladies.com).
All our events adhere to a strong [Code of Conduct](/pybcn_association/coc/).
diff --git a/content/talks/_content.gotmpl b/content/talks/_content.gotmpl
index 811641d0a..227bfdac9 100644
--- a/content/talks/_content.gotmpl
+++ b/content/talks/_content.gotmpl
@@ -1,5 +1,5 @@
{{- /*
- One page per talk, built from the programme of every event.
+ One page per talk, built from the program of every event.
The talks of this archive live in the front matter of the event that
gave them, under the talks block, and that is where they stay: a talk
@@ -20,7 +20,7 @@
partials/talk_record.html, which reads the talk out of the event page
through site.GetPage. So the description, the speakers, the language,
the links, and the photo have one source, the event front matter, and
- cannot drift from what the programme grid and the gallery of that day
+ cannot drift from what the program grid and the gallery of that day
print.
Why the event is part of the path. A talk id is unique inside its
@@ -100,7 +100,7 @@
{{- /* The files to read: the markdown of content/events/ and of each series
under it. An _index.md is the container of a section and carries no
- programme of its own. */ -}}
+ program of its own. */ -}}
{{- $files := slice -}}
{{- range $entry := os.ReadDir $root -}}
{{- $here := path.Join $root $entry.Name -}}
@@ -135,7 +135,7 @@
{{- $slug := path.BaseName $file -}}
{{- /* The date of the event is the date of every talk of it. One
edition of the section carries no date, Hacktoberfest 2018,
- and it carries no talks either; a programme with no date
+ and it carries no talks either; a program with no date
would still get its pages, dated by the build. */ -}}
{{- $dates := dict -}}
{{- with $event.date -}}
diff --git a/content/talks/_index.md b/content/talks/_index.md
index 0a255dbdd..72f1ce8cb 100644
--- a/content/talks/_index.md
+++ b/content/talks/_index.md
@@ -5,4 +5,4 @@ menu: "main"
weight: 6
---
-Every talk the association has put on a programme, newest first. Each one has a page of its own with its speakers, the day it was given, its description, its photo, and whatever the speaker published: the video, the slides, and the code.
+Every talk the association has put on a program, newest first. Each one has a page of its own with its speakers, the day it was given, its description, its photo, and whatever the speaker published: the video, the slides, and the code.
diff --git a/data/event_emoji.yaml b/data/event_emoji.yaml
index f91b4b6f7..4d1b41b00 100644
--- a/data/event_emoji.yaml
+++ b/data/event_emoji.yaml
@@ -20,7 +20,7 @@
# 2. The group. A page whose front matter carries group: "PyLadies BCN"
# is a pyladies, whatever its title says: a PyLadies dojo shows the
# PyLadies marker and not the dojo one, because the community that
-# organised it is the more distinctive fact.
+# organized it is the more distinctive fact.
# 3. The kind, from a word of the title: dojo, practice session,
# barbecue, hacktoberfest or hackathon (one kind), sprint,
# coderetreat, and workshop last. Three titles carry two of those
@@ -49,7 +49,7 @@
# community, and the glyph says so next to 👥. A martial arts uniform for
# a coding dojo, which is a kata in the sense the word came with. Books
# for a practice session, a laptop for a workshop (the icon the workshop
-# talks of a programme carry already, fa-laptop), meat on a bone for a
+# talks of a program carry already, fa-laptop), meat on a bone for a
# barbecue, a wrench for a hackathon, a runner for a sprint, and a person
# in lotus position for a coderetreat, which is a day of retreat.
#
diff --git a/data/role_emoji.yaml b/data/role_emoji.yaml
index fa6470fe0..f38f49393 100644
--- a/data/role_emoji.yaml
+++ b/data/role_emoji.yaml
@@ -4,7 +4,7 @@
# of the event page through roles.yaml. For a roles row it is the label of
# the row, which is a level name of an organizers page through roles.yaml,
# and a level name that is not a role ("Permanent Committee",
-# "Management Board (2026)") is not here and takes the "*" entry. Right side: one emoji. A role that is not here takes the "*"
+# "Board (2026)") is not here and takes the "*" entry. Right side: one emoji. A role that is not here takes the "*"
# entry, so a new role shows up with a neutral glyph rather than with
# none, and the row does not change shape when it is added. The three
# level names above are the live test of that fallback.
@@ -25,7 +25,7 @@
Speaker: 🎤
Mentor: 🎓
Volunteer: 🙋
-Organizer: 🧭
+Event organizer: 🧭
Collaborator: 🤝
President: 🔑
Former President: 🔑
@@ -45,12 +45,12 @@ Events: 📅
# needs a row of its own, and until it has one its glyph is the neutral
# one, not a wrong one.
Permanent Committee: 🧭
-Management Board (2026): 📋
-Former Management Board (2018 - 2025): 📋
+Board (2026): 📋
+Former Board (2018 - 2025): 📋
# Not a role and not a level: the tab of /people/ that answers "who came"
# with the fact that the association never recorded it (see
# content/people/_content.gotmpl). An empty chair, for the audience the
# archive has no list of. U+1FA91 has emoji presentation by default, as
# the rule above asks.
-Assistants: 🪑
+Attendees: 🪑
diff --git a/data/roles.yaml b/data/roles.yaml
index 953976663..be584d6fd 100644
--- a/data/roles.yaml
+++ b/data/roles.yaml
@@ -19,8 +19,8 @@
# 2016. Unmapped, it printed "Collaborators at PyBCN" on the page of one
# person, a plural for one.
Speakers: Speaker
-Organizers: Organizer
+Organizers: Event organizer
Collaborators: Collaborator
Mentors: Mentor
Volunteers: Volunteer
-PyLadiesBCN Organizers: Organizer
+PyLadiesBCN Organizers: Event organizer
diff --git a/layouts/_default/_markup/render-link.html b/layouts/_default/_markup/render-link.html
index 6b476d5a2..55ecb22a4 100644
--- a/layouts/_default/_markup/render-link.html
+++ b/layouts/_default/_markup/render-link.html
@@ -3,9 +3,9 @@
Content used to write raw to open an
external site in a new tab. Those were converted to plain markdown links,
- so the behaviour has to come from here. The raw ones would still render,
+ so the behavior has to come from here. The raw ones would still render,
because unsafe=true is set in [markup.goldmark.renderer] in config.toml
- for the two pre-Hugo programmes pasted in as tables, but no new content
+ for the two pre-Hugo programs pasted in as tables, but no new content
writes an anchor of its own.
An external link gets target="_blank" and rel="noopener noreferrer".
@@ -13,7 +13,7 @@
window.opener handle to this one, which is a reverse tabnabbing path.
A relative link, an anchor, a mailto: link and a link back to this site
- keep the default behaviour and open in the same tab.
+ keep the default behavior and open in the same tab.
*/ -}}
{{- $url := urls.Parse .Destination -}}
{{- $external := and $url.Host (ne $url.Host (urls.Parse .Page.Site.BaseURL).Host) -}}
diff --git a/layouts/_default/rss.xml b/layouts/_default/rss.xml
index 1299c8609..3e52fcdf6 100644
--- a/layouts/_default/rss.xml
+++ b/layouts/_default/rss.xml
@@ -49,7 +49,7 @@
feed. They are in the sitemap, where a page of the site belongs. */ -}}
{{- $pages = where $pages "Section" "ne" "people" }}
{{- /* The talk pages are not in the feed. There is one per talk of every
- programme the association has published (bin/check-content prints the
+ program the association has published (bin/check-content prints the
count), and they are built from the front matter of the events, which
the feed already carries (see content/talks/_content.gotmpl). None of
them is a publication: the date of a talk is the day it was given, as
diff --git a/layouts/partials/friends.html b/layouts/partials/friends.html
index ab4fb46aa..21158e48a 100644
--- a/layouts/partials/friends.html
+++ b/layouts/partials/friends.html
@@ -12,7 +12,7 @@
publish no favicon at
all: bcneng.org and pythongirona.cat answer 404 on every usual path
and declare no icon link, so what is kept here is the logo each one
- draws on its own page, which is the mark a reader recognises anyway.
+ draws on its own page, which is the mark a reader recognizes anyway.
Python España does publish one, and that is the file used.
The file is in this repository and is never fetched from the other
diff --git a/layouts/shortcodes/association-identity.html b/layouts/shortcodes/association-identity.html
index 70db41d91..93af1354a 100644
--- a/layouts/shortcodes/association-identity.html
+++ b/layouts/shortcodes/association-identity.html
@@ -23,7 +23,7 @@
- Name: {{ $a.legal_name }}
- Tax ID (CIF): {{ $a.tax_id }}
- - Registered address: {{ with $a.address }}{{ . }}{{ else }}not published yet. The Management Board has to supply it.{{ end }}
- - Registry: {{ with $a.registry }}{{ . }}{{ with $a.registered_on }}, registered on {{ . }}{{ end }}{{ else }}not published yet. The entry in the Registre d'Associacions de la Generalitat de Catalunya has to come from the Management Board.{{ end }}
+ - Registered address: {{ with $a.address }}{{ . }}{{ else }}not published yet. The Board has to supply it.{{ end }}
+ - Registry: {{ with $a.registry }}{{ . }}{{ with $a.registered_on }}, registered on {{ . }}{{ end }}{{ else }}not published yet. The entry in the Registre d'Associacions de la Generalitat de Catalunya has to come from the Board.{{ end }}
- Email: {{ site.Params.main_contact_email }}
diff --git a/layouts/shortcodes/logo-row.html b/layouts/shortcodes/logo-row.html
index 624a440ce..2dd2e8026 100644
--- a/layouts/shortcodes/logo-row.html
+++ b/layouts/shortcodes/logo-row.html
@@ -1,5 +1,5 @@
{{- /*
- logo-row: a centred row of sponsor logos.
+ logo-row: a centered row of sponsor logos.
Usage:
{{< logo-row >}}
diff --git a/static/humans.txt b/static/humans.txt
index f0cb76cb0..13986e94f 100644
--- a/static/humans.txt
+++ b/static/humans.txt
@@ -61,4 +61,10 @@
Search Pagefind, https://pybcn.org/search/ The index is built with
the site and served from it: searching asks nobody else
Language English
- Privacy No page asks another site for anything to draw itself
+ Privacy Scripts, styles, fonts, and images are served from this site.
+ A page asks another site only for the YouTube player of a
+ recorded talk, the Google Form of the talk proposals, the
+ Google Calendar of PyDay BCN 2019, the PayPal button of the
+ membership page, and the Eventbrite button of PyDay BCN 2018.
+ The whole list:
+ https://pybcn.org/pybcn_association/privacy-policy/
diff --git a/themes/pybcn_theme/assets/scss/agenda.scss b/themes/pybcn_theme/assets/scss/agenda.scss
index 3a6e0f76b..fe96afb78 100644
--- a/themes/pybcn_theme/assets/scss/agenda.scss
+++ b/themes/pybcn_theme/assets/scss/agenda.scss
@@ -75,9 +75,9 @@ $blockTimes15: 700,715,730,745,800,815,830,845,900,915,930,945,1000,1015,1030,10
// rather than push the grid wider than the screen. Issue #212.
overflow-wrap: break-word;
/*
- The fallback for an entry with no colour class. White text on
+ The fallback for an entry with no color class. White text on
the CSS orange was 1.97:1. #A15C00 is 5.19:1 on white, so an
- entry that omits its colour stays readable. bin/check-content
+ entry that omits its color stays readable. bin/check-content
reports such an entry, so nothing should reach this fallback.
*/
background-color: #A15C00;
@@ -105,8 +105,8 @@ $blockTimes15: 700,715,730,745,800,815,830,845,900,915,930,945,1000,1015,1030,10
/*
The title of a row that holds a talk goes to the page of that
talk. Underlined, so it reads as a link before the pointer
- reaches it: colour alone cannot say it here, because the whole
- block is one colour and the title takes the same white or dark
+ reaches it: color alone cannot say it here, because the whole
+ block is one color and the title takes the same white or dark
text as the rest of it. WCAG 1.4.1 asks for a second mark, and
the underline is the mark a link takes everywhere else on this
site (see .photo_source in photo_gallery.scss).
@@ -157,7 +157,7 @@ $blockTimes15: 700,715,730,745,800,815,830,845,900,915,930,945,1000,1015,1030,10
text and so needs 4.5:1 against its background. White on the old
yellow was 1.81:1 and on the old orange 2.63:1.
- Yellow and orange keep their brand colour and take dark text
+ Yellow and orange keep their brand color and take dark text
instead, which reads better than any darkened version would:
8.51:1 and 5.87:1. Blue and pink work with neither white nor dark
text as they were, so they are darkened just enough for white to
@@ -264,13 +264,13 @@ $blockTimes15: 700,715,730,745,800,815,830,845,900,915,930,945,1000,1015,1030,10
* meaning, the dot is a redundant cue (WCAG 1.4.1 Use of Color).
*
* The badge draws its own light background, so dot contrast does not depend
- * on the colour of the agenda cell behind it. Contrast of each dot against
+ * on the color of the agenda cell behind it. Contrast of each dot against
* the #FFFFFF badge, against the 3:1 floor of WCAG 1.4.11 Non-text Contrast:
* beginner #2E7D32 5.1:1
* intermediate #A15C00 5.2:1
* advanced #CE1836 5.5:1
* The #404040 border keeps the badge outline at 3:1 or better against every
- * cell colour, the lightest of which is the #FF7900 orange at 3.9:1.
+ * cell color, the lightest of which is the #FF7900 orange at 3.9:1.
*
* The second selector repeats the first so that it outranks
* ".scheduleContainer .event span", which sets display block and width 100%.
diff --git a/themes/pybcn_theme/assets/scss/facts.scss b/themes/pybcn_theme/assets/scss/facts.scss
index 788ba9797..ca2be1136 100644
--- a/themes/pybcn_theme/assets/scss/facts.scss
+++ b/themes/pybcn_theme/assets/scss/facts.scss
@@ -7,7 +7,7 @@
// div, so a row is one element in the markup, and the div is display:
// contents so its dt and dd take the two cells of a row of the grid. The box
// is the bordered pill of .count_card (main.scss) at full width, in the
-// colour of the facts, so the two read as one kind of thing: a box of
+// color of the facts, so the two read as one kind of thing: a box of
// figures. At 390px the two columns still fit, because the longest label
// takes about a third of the width and a long value wraps inside its cell.
.facts_box {
@@ -47,7 +47,7 @@
overflow-wrap: anywhere;
}
- // A link inside the box needs a second mark besides the colour, which
+ // A link inside the box needs a second mark besides the color, which
// is WCAG 1.4.1 and the rule this repository applies to .photo_source
// and to the caption of a talk photo. The credit row holds text between
// two links ("A and B"), which is where axe reports link-in-text-block.
diff --git a/themes/pybcn_theme/assets/scss/footer.scss b/themes/pybcn_theme/assets/scss/footer.scss
index a71233976..cca87fec2 100644
--- a/themes/pybcn_theme/assets/scss/footer.scss
+++ b/themes/pybcn_theme/assets/scss/footer.scss
@@ -48,7 +48,7 @@ footer {
// 8. The footer in four columns, the sub-list of the pages that Take part
// also links, the accounts on one line beside the name of the association,
-// and the licence line.
+// and the license line.
.site_footer {
.site_footer_col {
margin-bottom: 1.5rem;
@@ -103,7 +103,7 @@ footer {
.site_licence {
margin: 0.75rem 0 0;
- // Centred: it is the line that closes the page and it belongs to
+ // Centered: it is the line that closes the page and it belongs to
// the whole of it, not to the column it happens to sit under.
text-align: center;
color: rgba(255, 255, 255, 0.7);
@@ -122,9 +122,9 @@ footer {
}
}
- // The live footer centres everything under 576px. A vertical list
+ // The live footer centers everything under 576px. A vertical list
// reads from a left edge, and so does its sub-list, so the columns
- // stay left; the name and the accounts take the centre.
+ // stay left; the name and the accounts take the center.
@media (max-width: 576px) {
.site_footer_col {
text-align: left;
diff --git a/themes/pybcn_theme/assets/scss/home.scss b/themes/pybcn_theme/assets/scss/home.scss
index de9fa1048..f27713bf1 100644
--- a/themes/pybcn_theme/assets/scss/home.scss
+++ b/themes/pybcn_theme/assets/scss/home.scss
@@ -16,11 +16,11 @@
// footer.scss and not here.
// The blocks of this page come from three proposals with three type scales
// and three spacings. What makes them one page is here: one h1, one h2
-// style for every section (.home_title) with a colour variant for a dark
+// style for every section (.home_title) with a color variant for a dark
// band, one card frame (.home_card) for the Meetup cards, the Take part
// boxes, and the friends, with the same border, radius, and hover, and
// one rhythm of 3rem between the sections.
-// The colours and the figures of this design ($blue-deep, $rule-grey,
+// The colors and the figures of this design ($blue-deep, $rule-grey,
// $text-grey, $ink, $paper, $hover-blue, $card-radius, $block-gap,
// $title-gap) are in main.scss since 2026-10-17, next to $blue-pybcn,
// because every other page takes them from there now: the section title,
@@ -122,20 +122,34 @@
grid-template-columns: repeat(2, 1fr);
}
+ // Six tiles since the glossary of 2026-10-25 (they were four):
+ // two rows of three from 992px, where six on one row left
+ // "8,917 Meetup RSVPs" no room beside its glyph.
@media (min-width: 992px) {
- grid-template-columns: repeat(4, 1fr);
+ grid-template-columns: repeat(3, 1fr);
gap: 1rem;
}
+
+ // Every row of tiles as tall as the tallest: the People tile
+ // carries a caption under its label, and without this its row
+ // was 16px taller than the row under it.
+ grid-auto-rows: 1fr;
}
.home_stat {
display: flex;
align-items: baseline;
- // Centred in the tile. Left aligned, the four tiles of one row
+ // Centered in the tile. Left aligned, the four tiles of one row
// put their numbers at four different distances from their own
// left edge, because "281 Events" and "371 People" are not the
// same width, and the row read as crooked.
justify-content: center;
+ // Wrapping is on so that align-content applies, which is what
+ // centers the glyph, the number, and the label in a tile taller
+ // than they are (see grid-auto-rows above). Nothing wraps at
+ // the widths measured, 390 to 1440px.
+ flex-wrap: wrap;
+ align-content: center;
gap: 0.6rem;
height: 100%;
padding: 0.75rem 1.25rem;
@@ -163,6 +177,18 @@
font-size: 1.1rem;
}
+ // The caption of the People tile, under its label, in the words
+ // the number counts. Smaller and allowed to wrap: the tile keeps
+ // nowrap for its number and its label, and a caption of four
+ // words would not fit beside them at 992px.
+ .home_stat_caption {
+ display: block;
+ font-size: 0.8rem;
+ line-height: 1.2;
+ white-space: normal;
+ opacity: 0.85;
+ }
+
&:hover,
&:focus {
border-color: $yellow-pybcn;
@@ -194,7 +220,7 @@
// 2. About, on the dark band of option 3, right under the hero: the text
// at the left, the player at the right. The links in the text take the
-// yellow, the one colour that reads on the dark grey beside white.
+// yellow, the one color that reads on the dark grey beside white.
.home_story {
padding: 2.5rem 0 3rem;
background-color: $dark-grey;
@@ -252,7 +278,7 @@
background-repeat: no-repeat;
// Flush with the top edge of the card, not floating in the
// middle of it: the two marks are drawn to sit on a line and
- // centred they read as sliding down the card.
+ // centered they read as sliding down the card.
background-position: left top;
background-size: contain;
}
diff --git a/themes/pybcn_theme/assets/scss/listing_table.scss b/themes/pybcn_theme/assets/scss/listing_table.scss
index f993f1591..bc211a1ab 100644
--- a/themes/pybcn_theme/assets/scss/listing_table.scss
+++ b/themes/pybcn_theme/assets/scss/listing_table.scss
@@ -34,7 +34,7 @@
margin-bottom: 2rem;
border-collapse: collapse;
- // The caption reads as a note about the table, in the colour and the
+ // The caption reads as a note about the table, in the color and the
// size of the facts, above the header row where a reader looks first.
.listing_caption {
caption-side: top;
@@ -93,7 +93,7 @@
// The marker of a talk: the icon of its type, in the box of the
// event emoji above, so the titles of the two tables hang by the
- // same 2.1rem. The icon is text, so it takes the colour of the facts.
+ // same 2.1rem. The icon is text, so it takes the color of the facts.
.talk_marker {
display: inline-block;
width: 1.75rem;
@@ -136,7 +136,7 @@
}
}
- // The event, in the weight of the month and the colour of the text:
+ // The event, in the weight of the month and the color of the text:
// it is a group header, and it is a link.
.talk_event_cell {
font-weight: 600;
@@ -147,7 +147,7 @@
white-space: nowrap;
}
- // The two header cells of a group, in the colour of the facts: they
+ // The two header cells of a group, in the color of the facts: they
// are labels in a margin and not titles.
.listing_year,
.listing_month {
diff --git a/themes/pybcn_theme/assets/scss/main.scss b/themes/pybcn_theme/assets/scss/main.scss
index 67131464f..cb60ae787 100644
--- a/themes/pybcn_theme/assets/scss/main.scss
+++ b/themes/pybcn_theme/assets/scss/main.scss
@@ -8,7 +8,7 @@ $blue-pybcn: #006c9b;
:root {
color-scheme: only light;
}
-// The rest colour of an icon that lights up under the pointer: a social
+// The rest color of an icon that lights up under the pointer: a social
// glyph on a card and in a modal. 4.68:1 on white, above the 3:1 WCAG
// 1.4.11 asks of a graphic that carries meaning.
$icon-grey: #6c757d;
@@ -174,7 +174,7 @@ $title-gap: 1.5rem;
// Font Awesome 5.8.2 is older than the Twitter rename, so it carries no X
// mark. This draws the mark from the Font Awesome 6 Free path (CC BY 4.0) as
// a CSS mask, which keeps one vendored icon set instead of two. The mask takes
-// its colour from `currentColor`, so the icon follows the same colour and
+// its color from `currentColor`, so the icon follows the same color and
// hover rules as every Font Awesome glyph next to it.
.icon_x {
display: inline-block;
@@ -212,11 +212,11 @@ $title-gap: 1.5rem;
// The mark of a link that leaves the site, printed by
// partials/link_mark.html in front of the words of the link: the YouTube
// mark, the GitHub mark, the X mark above, or the generic arrow. Grey at
-// rest, the $icon-grey of every icon of the site, and the colour of the
+// rest, the $icon-grey of every icon of the site, and the color of the
// link under the pointer or the keyboard, which is the rule the social
// glyphs of a person card follow. The YouTube mark took the blue of the
// link around it until 2026-10-15 while every other icon was grey. They
-// are one colour now. An inline-block, so the underline of the
+// are one color now. An inline-block, so the underline of the
// link stops at the words and is not drawn through the glyph. The gap is
// the one the credit of a gallery photo and the video line of a talk row
// already set.
@@ -400,7 +400,7 @@ button:focus:not(:focus-visible),
// The paragraph a page opens with, above the list or the cards it is the
// index of: .section_intro on /events/, /people/, /talks/ and
// /events/meetups/, .page-intro on the two monthly meetup pages. A link
-// inside a sentence needs a second mark besides the colour, which is WCAG
+// inside a sentence needs a second mark besides the color, which is WCAG
// 1.4.1 and the rule this repository already applies to .photo_source and
// to the caption of a talk photo. axe reported this one as
// link-in-text-block on 7 links over 4 pages.
@@ -494,7 +494,7 @@ button:focus:not(:focus-visible),
text-align: center;
}
- // /people/ centres its letters; /events/
+ // /people/ centers its letters; /events/
// keeps its years at the left, over the first column of its table.
// The class is the optional argument of partials/jump_bar.html.
&.jump_bar_centered ul {
@@ -503,15 +503,16 @@ button:focus:not(:focus-visible),
}
// The tabs above a listing: one link per view of the list, the current
-// one filled. See layouts/partials/filter_tabs.html, which /talks/ and
-// /people/ draw it with, and which says why the tabs are links to pages
-// and not a script.
+// one filled. See layouts/partials/filter_tabs.html, which /talks/,
+// /people/, and /events/ draw it with, and which says why the tabs are
+// links to pages and not a script.
//
// The same pills as .jump_bar, a little taller, so the two bars read as
// one family of controls: the tabs choose which rows the page holds, the
// bar under them jumps inside those rows. The list wraps, with no script,
-// as the jump bar does: at 390px the six tabs of /talks/ take three lines
-// and the ten of /people/ four, and the document stays 390px wide.
+// as the jump bar does: at 390px the six tabs of /talks/ take three lines,
+// the ten of /people/ four, and the five of /events/ three, and the
+// document stays 390px wide.
//
// The current tab is the one with aria-current, painted in the blue of the
// site with white text, which is the one pair of this stylesheet that is
@@ -573,7 +574,7 @@ button:focus:not(:focus-visible),
}
// The legend above a long index: each marker the rows draw, with how many
-// rows carry it. One line that wraps, in the colour of the facts under a
+// rows carry it. One line that wraps, in the color of the facts under a
// row, so it reads as information about the list and not as a row of it.
// See layouts/partials/marker_legend.html, which /events/ and /talks/ draw
// it with.
@@ -630,7 +631,7 @@ button:focus:not(:focus-visible),
// The card of counts of a row: one icon and one number per kind of thing
// the row holds. See layouts/partials/count_card.html, which the three
-// listings of the archive print it with. A bordered pill in the colour of
+// listings of the archive print it with. A bordered pill in the color of
// the facts, with the border and the radius of a link of .jump_bar, so it
// reads as a box of figures and not as a sentence. The items never wrap
// inside the card: the card wraps as a whole, through .row_facts.
diff --git a/themes/pybcn_theme/assets/scss/people.scss b/themes/pybcn_theme/assets/scss/people.scss
index fdb546b26..e0ad73b20 100644
--- a/themes/pybcn_theme/assets/scss/people.scss
+++ b/themes/pybcn_theme/assets/scss/people.scss
@@ -25,8 +25,8 @@
// Every row of cards starts on the same left edge as the heading above
// it, which is the line the eye follows down the page. Three rules are
// needed. The row caps its own width further down, so it must not be
- // centred in the column. The cards of a row that does not fill must not
- // be centred under the cards above them. And the half gutter each card
+ // centered in the column. The cards of a row that does not fill must not
+ // be centered under the cards above them. And the half gutter each card
// carries on its left has to come back off the row, so the edge of the
// first card, not the edge of its gutter, is what lands on the line.
.row.level {
@@ -35,6 +35,13 @@
margin-right: -$gutter / 2;
}
+ // A level heading is a link target (people-grid.html gives it an id
+ // from its name), so it clears the fixed navigation when a link
+ // lands on it, as the year headers of a listing do (listing_table.scss).
+ .level_name {
+ scroll-margin-top: 80px;
+ }
+
// Every card is the same width in every section, and so is the space
// between them. The row caps its own width at the number of cards it is
// asked for, and each slot is that fraction of the row. The cap is what
@@ -134,10 +141,10 @@
// The photo, the name and the role are one link to the page of
// the person (see people_summary.html). A block, so the two
// boxes inside it stack as they did when each was a button. It
- // keeps the colours of the card: the name is black at rest and
+ // keeps the colors of the card: the name is black at rest and
// the PyBCN blue under the pointer or the keyboard, which the
// rules of the card below set on the h3, and the link must not
- // paint it the link blue over them or underline it. The colour
+ // paint it the link blue over them or underline it. The color
// photograph and the blue name are the hover and the focus
// signal, so the whole card reads as the target.
.person_card_link {
@@ -178,7 +185,7 @@
display: block;
width: 100%;
- // In colour, at rest, as the rows of /people/ and the
+ // In color, at rest, as the rows of /people/ and the
// portrait of a person page are. The photographs used to be grey until
// the pointer was on them, which a touch screen never
// undid, and a grid of grey faces reads as an archive
@@ -200,7 +207,7 @@
// The side padding keeps the text off the border now that
// the card has none.
padding: 5px 10px 0;
- // Centred, like the icon row under it. The name and the role
+ // Centered, like the icon row under it. The name and the role
// used to sit on the left edge while the icons sat in the
// middle, so one card showed two alignments.
text-align: center;
@@ -210,7 +217,7 @@
// One size on every card. The size used to be a share of
// the card so a long name could stay on one line, but
// that made a long name visibly smaller than its
- // neighbours and read as a different heading level
+ // neighbors and read as a different heading level
// rather than as the same name in less room.
font-size: 1.2em;
// 3px here against 7px over the icons. What a reader
@@ -240,7 +247,7 @@
p {
margin-bottom: 0;
// Italic sets the role apart from the name above it,
- // which is the same colour and only a little larger.
+ // which is the same color and only a little larger.
font-style: italic;
// Smaller than the name, including a long name. At the
// inherited 16px the role was larger than any name that
@@ -326,13 +333,13 @@
}
}
- // With no border to colour, the hover and the focus are the
- // photograph in colour and the name in blue, which the rules
+ // With no border to color, the hover and the focus are the
+ // photograph in color and the name in blue, which the rules
// below and above set. The card has no outline of its own to
// give.
- // Keyboard focus shows the colour photo too, because the card holds
+ // Keyboard focus shows the color photo too, because the card holds
// two focusable triggers.
&:hover,
&:focus-within {
diff --git a/themes/pybcn_theme/assets/scss/people_index.scss b/themes/pybcn_theme/assets/scss/people_index.scss
index 0dc8e970a..77f905b25 100644
--- a/themes/pybcn_theme/assets/scss/people_index.scss
+++ b/themes/pybcn_theme/assets/scss/people_index.scss
@@ -114,7 +114,7 @@
}
// The placeholder of a person with no photo, at the size of the photo
- // of a row. The colours and the letters are the shared rule at the end
+ // of a row. The colors and the letters are the shared rule at the end
// of this file; the page of the person sets its own size in
// people_page.scss.
.person_initials {
@@ -166,7 +166,7 @@
// The sentence of the second line, "Speaker at 3 events:", in the grey
// and the size of the pages after it. The italic "at" and the bold
// count are the markup of the row of the Events table of the person
- // page, so the two read alike; the count is in the colour of the text,
+ // page, so the two read alike; the count is in the color of the text,
// so the number stands out of the grey line.
// The glyph of a role, in front of the word it marks. Same box as the
// marker of a page below, so the two lines of a row hang alike.
@@ -268,10 +268,10 @@
}
}
-// The placeholder of a person with no photo: the initials on a colour from
+// The placeholder of a person with no photo: the initials on a color from
// the name, drawn by partials/person_placeholder.html, which is the one
// place to change it (its header says why). A round badge, white text, the
-// ten colours below: every one of them is at 5:1 or more under white (WCAG
+// ten colors below: every one of them is at 5:1 or more under white (WCAG
// 1.4.3 asks 4.5:1), measured with the WCAG relative luminance formula when
// they were chosen. Upright and at the normal weight of a heading, and
// line-height 1 so the letters sit in the middle of the circle. The size is
diff --git a/themes/pybcn_theme/assets/scss/people_page.scss b/themes/pybcn_theme/assets/scss/people_page.scss
index 2632a4db2..80370d063 100644
--- a/themes/pybcn_theme/assets/scss/people_page.scss
+++ b/themes/pybcn_theme/assets/scss/people_page.scss
@@ -74,7 +74,7 @@
}
// The placeholder of a person with no photo, at the size of the
- // portrait: the initials on a colour, the shared rule of
+ // portrait: the initials on a color, the shared rule of
// people_index.scss, five times the size of the row.
.person_initials {
flex: 0 0 auto;
@@ -172,7 +172,7 @@
// give their lists a disc and a 1.25em indent on top of their own.
// The day under a video is a grey line with a link in it, and a link
- // inside a line of the same colour needs a second mark (WCAG 1.4.1),
+ // inside a line of the same color needs a second mark (WCAG 1.4.1),
// the rule talks.scss applies to a caption and meetup.scss to the
// source line. axe reported link-in-text-block on every talk row.
.talk_meta a {
@@ -213,7 +213,7 @@
// The last block, how the page is made and how to correct it: smaller
// than the content it follows, and it reads as a note, as the source
// line of a meetup page does. A link inside a sentence needs a second mark besides the
- // colour (WCAG 1.4.1), the rule meetup.scss and talks.scss apply.
+ // color (WCAG 1.4.1), the rule meetup.scss and talks.scss apply.
.person_correction p {
color: $text-grey;
font-size: 0.9rem;
@@ -321,8 +321,8 @@
// three is after the same page. focus-within does
// the same for the keyboard, where the link is what
// takes focus. The glyph drops its grey and comes
- // back in colour, which is the only place on the
- // page a role shows its own colour.
+ // back in color, which is the only place on the
+ // page a role shows its own color.
li:hover,
li:focus-within {
.role_emoji {
@@ -372,7 +372,7 @@
}
- // A colour change, not a move, so there is nothing
+ // A color change, not a move, so there is nothing
// for prefers-reduced-motion to turn off.
.role_emoji,
strong {
@@ -457,8 +457,8 @@
//
// Desaturated, so the glyph sits with the black icons
// of Social Links rather than being the one spot of
- // colour in the lists. grayscale and nothing else: a
- // colour emoji is a shaded picture, and in grey it is
+ // color in the lists. grayscale and nothing else: a
+ // color emoji is a shaded picture, and in grey it is
// a light one, which is what this list wants. The
// marker labels the row; the text beside it is what
// the reader is here for, and a grey mark does not
@@ -481,7 +481,7 @@
// some platforms and never a style. line-height: 1
// keeps the glyph from opening the line box of its
// row further than its own height, and middle-aligned
- // the text sits on the centre of the glyph instead of
+ // the text sits on the center of the glyph instead of
// on its bottom edge.
.role_emoji {
display: inline-block;
diff --git a/themes/pybcn_theme/assets/scss/photo_gallery.scss b/themes/pybcn_theme/assets/scss/photo_gallery.scss
index 4a73a550f..64d66a682 100644
--- a/themes/pybcn_theme/assets/scss/photo_gallery.scss
+++ b/themes/pybcn_theme/assets/scss/photo_gallery.scss
@@ -29,7 +29,7 @@ $quote-rule: #ced4da;
// 900x506 and 379x675 at 1280px, 358x201 and 358x636 at 390px.
$photo-max-height: 675px;
-// There is no band of colour behind the section, and no rule above it any
+// There is no band of color behind the section, and no rule above it any
// more. The gallery sat on a light grey band, with every card on it, until
// 2026-10-14. Each figure is its own card, on the white of the page,
// and the air between the cards is what separates them. The hr above the
@@ -40,7 +40,7 @@ $photo-max-height: 675px;
.photo_gallery {
// The gallery is the last section and it is set apart from the
- // programme, so it does not have to sit inside the reading column the
+ // program, so it does not have to sit inside the reading column the
// text uses. Breaking out of it gives a photograph 900px instead of
// 775px, measured at the 1140px container of this theme: the section is
// 902px, and the 1px border of the card on each side leaves 900 for the
@@ -54,10 +54,10 @@ $photo-max-height: 675px;
// worse than any saving is worth.
// 1200px is the xl breakpoint of Bootstrap 4, written out because this
// file is compiled without the Bootstrap mixins in scope. It was 992,
- // the lg one, and that was too early: margin-left 50% centres the
+ // the lg one, and that was too early: margin-left 50% centers the
// section on its containing block, which is the col-md-9 of the page
// and not the window, so between 992px and 1200px the 902px section
- // landed off centre and ran past the right edge of the screen. Measured
+ // landed off center and ran past the right edge of the screen. Measured
// on the live site, the event page was 1067px wide on a 992px screen
// and 1083px on a 1024px one, which is the same sideways drag issue
// #212 reports for the schedule, on a different element and at a
@@ -104,7 +104,7 @@ $photo-max-height: 675px;
// The cap on the height: $photo-max-height, with the reason
// beside it. The box of the image keeps the width of the card
// (card-img-top sets width 100%), and the photograph is
- // painted inside it at its own ratio, centred, so a portrait
+ // painted inside it at its own ratio, centered, so a portrait
// shows at 380x675 on a white card instead of 900x1600 and a
// landscape up to 4:3 is not touched. object-fit and not
// width auto: with width auto a landscape whose source is
@@ -156,8 +156,8 @@ $photo-max-height: 675px;
// The links of the post: a mention, a hashtag, or a URL the post
// wrote. Underlined, because they sit inside a run of text where a
- // colour alone is the only thing that would mark them, and WCAG
- // 1.4.1 asks for more than colour. A mention and a hashtag carry
+ // color alone is the only thing that would mark them, and WCAG
+ // 1.4.1 asks for more than color. A mention and a hashtag carry
// the X mark in front (partials/caption_links.html), smaller than
// the mark of a credit line because it sits inside a sentence, and
// the underline stops at it: .icon_x is an inline-block.
@@ -179,7 +179,7 @@ $photo-max-height: 675px;
color: $dark-grey;
// The line goes to the page of the talk. Same treatment as the
- // credit below it: the colour of the line at rest with an
+ // credit below it: the color of the line at rest with an
// underline, and the PyBCN blue under the pointer. The underline
// is the second mark WCAG 1.4.1 asks for, and keeping the grey
// stops two links in one figcaption from shouting at each other.
@@ -212,7 +212,7 @@ $photo-max-height: 675px;
align-items: baseline;
// The link to this figure: #3 for the third photo of the day. It
- // takes the same colour and underline as the credit, and the
+ // takes the same color and underline as the credit, and the
// margin pushes it to the right edge when there is no credit to
// sit at the left.
.photo_number {
@@ -223,7 +223,7 @@ $photo-max-height: 675px;
color: $icon-grey;
transition: color 0.15s linear;
// Underlined, so the credit reads as a link before the pointer
- // reaches it. Grey text in a grey line said nothing, and colour
+ // reaches it. Grey text in a grey line said nothing, and color
// alone would not say it either: WCAG 1.4.1 asks for a second
// mark, and this is the mark a link takes everywhere else.
text-decoration: underline;
diff --git a/themes/pybcn_theme/assets/scss/sponsors.scss b/themes/pybcn_theme/assets/scss/sponsors.scss
index e083eaab5..d5308c245 100644
--- a/themes/pybcn_theme/assets/scss/sponsors.scss
+++ b/themes/pybcn_theme/assets/scss/sponsors.scss
@@ -124,7 +124,7 @@ $sponsor-gap: 1rem;
// whole card scales and not the logo inside it, because a
// logo that grows alone spills over the padding and crosses
// the white edge onto the band. 7px of growth against a gap
- // of 12px, so it never touches its neighbour.
+ // of 12px, so it never touches its neighbor.
transform: scale(1.04);
z-index: 1;
}
diff --git a/themes/pybcn_theme/assets/scss/talks.scss b/themes/pybcn_theme/assets/scss/talks.scss
index 480dccaaf..c4082dfe1 100644
--- a/themes/pybcn_theme/assets/scss/talks.scss
+++ b/themes/pybcn_theme/assets/scss/talks.scss
@@ -22,7 +22,7 @@
// announcement, with the rule down the left side that the caption of a
// gallery photo takes (.photo_caption in photo_gallery.scss, which has
// the reason for not using Bootstrap's .blockquote: it sets 1.25rem and
- // would print the abstract larger than the page). The colour of the
+ // would print the abstract larger than the page). The color of the
// body text stays, because the abstract is the body of this page.
// Italic, as the caption is and as a quotation is set in print, so
// the two blockquotes of the site read alike; it was upright and did
@@ -139,7 +139,7 @@
// The video of the talk, under the names: the link
// partials/video_link.html prints, with the YouTube mark in front.
- // Underlined, because colour alone cannot mark a link in a run of
+ // Underlined, because color alone cannot mark a link in a run of
// text (WCAG 1.4.1, the rule .photo_source already follows). The mark
// is an inline-block, so the underline is not drawn through it.
.talk_video {
@@ -201,7 +201,7 @@
}
}
-// A link inside a sentence needs a second mark besides the colour, which is
+// A link inside a sentence needs a second mark besides the color, which is
// WCAG 1.4.1 and the rule this repository already applies to .photo_source.
// axe reported this one as link-in-text-block.
.talk_photo figcaption a,
diff --git a/themes/pybcn_theme/layouts/_default/contact.html b/themes/pybcn_theme/layouts/_default/contact.html
index b15a957f5..8cdb4a177 100644
--- a/themes/pybcn_theme/layouts/_default/contact.html
+++ b/themes/pybcn_theme/layouts/_default/contact.html
@@ -10,7 +10,7 @@ PyBCN
{{ range sort $.Site.Params.social_items "weight" }}
-
+
{{ end }}
{{ end }}
@@ -19,7 +19,7 @@ PyLadiesB
{{ range sort $.Site.Params.social_items_pyladies "weight" }}
-
+
{{ end }}
diff --git a/themes/pybcn_theme/layouts/_default/event.html b/themes/pybcn_theme/layouts/_default/event.html
index e65e1d675..8e2933ece 100644
--- a/themes/pybcn_theme/layouts/_default/event.html
+++ b/themes/pybcn_theme/layouts/_default/event.html
@@ -19,7 +19,7 @@
YouTube with 20 videos and no photograph, so its gallery is the
Talks & Videos subsection alone (the header of
partials/gallery_content.html says why the videos are there and
- not under the programme, and why a page with a Talks block prints
+ not under the program, and why a page with a Talks block prints
them there instead). */ -}}
{{ $gallery := partialCached "gallery_content.html" . .RelPermalink }}
@@ -74,7 +74,7 @@
(partials/hero_header.html, which also writes the
kind), plus the captions of the gallery, each at its
figure (partials/photo_gallery.html). The sections of
- the page, the programme grid, the sponsors, and the
+ the page, the program grid, the sponsors, and the
people grids are out: a talk and a person have pages of
their own, and a name indexed here as well would match
twice. The venue is not printed on this page (the row of
@@ -99,7 +99,7 @@
{{- end }}
{{- /* How many people came, which is a count and not a
registration: AGENTS.md keeps the two words apart, and
- the meetup pages say "Registrations" because an RSVP of
+ the meetup pages say "RSVPs" because an RSVP of
Meetup is an intention. An edition sold its tickets
elsewhere, so the only number it has is the one the
association counted and published on the day. The front
@@ -144,10 +144,10 @@ {{ $section.title }}
the CSS grid, so a page with an agenda and no eventTimes has
no grid to draw: it would emit grid-template-rows: repeat(0)
and stack every block of the day on one line. The two pre-Hugo
- programmes, PyDay BCN 2018 and 2019, are in that state on
+ programs, PyDay BCN 2018 and 2019, are in that state on
purpose. They carry agenda, talks and rooms because a photo of
the gallery joins to a talk by id, and they publish the
- programme the association froze in their own body: the pasted
+ program the association froze in their own body: the pasted
agenda table of 2018 and the calendar embed of 2019. Give
either one eventTimes and numTracks and its grid appears. */ -}}
{{ if and .Params.agenda .Params.eventTimes }}
@@ -162,7 +162,7 @@ Schedule
{{ end }}
- {{/* The talks of an edition that has them and has no programme
+ {{/* The talks of an edition that has them and has no program
grid, as rows, where the grid would be: the rows of
partials/talk_rows.html, the ones a meetup page draws, so
the two read alike. Each row links to the page of its talk,
@@ -172,9 +172,9 @@ Schedule
no record of the room or the hour of any of them, so no
grid to draw. The gate is the absence of agenda and not of
eventTimes: PyDay BCN 2018 and 2019 carry an agenda with no
- eventTimes on purpose (see above) and publish the programme
+ eventTimes on purpose (see above) and publish the program
in their body, and a list of rows under it would print the
- programme twice.
+ program twice.
The heading carries both counts, "Talks (32) & Videos
(29)": each row prints the video of its talk, so this block
@@ -192,7 +192,7 @@ Talks ({{ len .Params.talks }}){{ with $nvideos }} &am
{{ end }}
- {{/* The videos of a day with a programme grid are not here:
+ {{/* The videos of a day with a program grid are not here:
they are the Talks & Videos subsection of the gallery at
the end of the page, with the photographs
(partials/photo_gallery.html). A Videos block sat here,
@@ -202,7 +202,7 @@ Talks ({{ len .Params.talks }}){{ with $nvideos }} &am
the gallery of a page with the Talks block above. */}}
{{/* The recordings of a whole session, which belong to the day and
- to no talk, right after the programme: see
+ to no talk, right after the program: see
partials/session_videos.html. No edition carries the block
today (the three that do are meetups, on
layouts/_default/meetup.html); bin/import-videos may write
@@ -238,9 +238,9 @@ {{ $section.title }}
{{/* The gallery is last, after the sponsors and the people of the
day. It is what the day left behind, the photographs the
association published and the recordings, and the rest of
- the page is the day itself: the programme, who paid for it,
+ the page is the day itself: the program, who paid for it,
and who ran it. It used to sit between the schedule and the
- sponsors, which read as part of the programme. */}}
+ sponsors, which read as part of the program. */}}
{{ partial "photo_gallery.html" . }}
diff --git a/themes/pybcn_theme/layouts/_default/events_index.html b/themes/pybcn_theme/layouts/_default/events_index.html
index 0ac76a072..b9b347c17 100644
--- a/themes/pybcn_theme/layouts/_default/events_index.html
+++ b/themes/pybcn_theme/layouts/_default/events_index.html
@@ -95,7 +95,7 @@
bin/check-content reports it. The italics are a style and not an em
element: the venue is not stressed, it is set apart.
- The gallery is partials/count_card.html: the talks of the programme of
+ The gallery is partials/count_card.html: the talks of the program of
the day, the photos its gallery renders, and the videos its page prints,
an icon and a number each. The counts come from
partials/listing_counts.html, the one walk of the site that also feeds
@@ -104,11 +104,13 @@
include the recording of a whole session, which belongs to no talk) is
written there once for the three listings.
- Reached through layout: events_index in content/events/_index.md, and not
- through a layouts/events/list.html, because Page.Section of a nested
- section is its top level: an events/list.html would also draw
- /events/pyday_bcn/, /events/pydatabcn/ and /events/other_events/, which
- are index pages of a series and want the fallback list they have.
+ Reached through layout: events_index in content/events/_index.md,
+ which Hugo looks up before layouts/events/list.html. That file draws
+ the index pages of the four series, /events/meetups/,
+ /events/pyday_bcn/, /events/pydatabcn/, and /events/other_events/,
+ with the same body as this one, cut to the events of the series (they
+ took the fallback list of titles until 2026-10-25). The two layouts
+ differ only in what partials/listing_total.html counts for their h1.
monthly_events.md selects its own layout the same way.
What is a row. A page under content/events/ that carries a year in its
@@ -154,55 +156,17 @@
year and by month and prints it. Both moved out of this layout on
2026-10-16, when the home page started printing the ten newest rows
(layouts/_default/home.html): one row and one table for the two pages,
- so the home page cannot print an event differently from this one. This
- layout keeps what is its own: the intro, the jump bar, and the legend.
+ so the home page cannot print an event differently from this one. The
+ rest, the intro, the tabs of the series (partials/events_tabs.html,
+ All and the four series with their counts, as /talks/ and /people/
+ have), the jump bar, the legend, and the call to the table, is
+ partials/event_listing.html since 2026-10-25, shared with
+ layouts/events/list.html, so a series page cannot list its events
+ differently from this one either. This layout is the header above and
+ one call.
*/ -}}
{{ define "main" }}
-
- {{ with .Content }}
{{ . }}
{{ end }}
-
- {{- /* The counts of the legend, from one cached walk of the site: see
- partials/listing_counts.html. The card of every row reads the
- same walk, inside partials/event_row.html. */ -}}
- {{- $counts := partialCached "listing_counts.html" site "listing-counts" -}}
-
- {{- /* One row per event, through partials/event_row.html, then sorted
- by the key of the row, which reads newest first: the year, the
- date, and then the title and the URL as the tiebreak. The same
- rows, sorted the same way, are what the home page keeps the
- first ten of. */ -}}
- {{- $rows := slice -}}
- {{- range .RegularPagesRecursive -}}
- {{- if not .Params.year }}{{ continue }}{{ end -}}
- {{- $rows = $rows | append (partial "event_row.html" .) -}}
- {{- end -}}
- {{- $rows = sort $rows "key" -}}
-
- {{- /* The years, as links to the groups below, through the bar
- partials/jump_bar.html draws for this page and for /people/. The
- far end of 281 rows under 20 years is many screens of scrolling
- away. Only the years that have a row are here, in the order the
- table draws them, so the bar reads newest first the way the page
- does: a row whose year differs from the row before it opens a
- year, which is the cut partials/event_table.html makes. */}}
- {{- $jump := slice -}}
- {{- $open := "" -}}
- {{- range $rows }}{{ if ne .year $open }}{{ $jump = $jump | append (dict "anchor" .year "text" .year) }}{{ $open = .year }}{{ end }}{{ end }}
- {{ partial "jump_bar.html" (dict "label" "Jump to a year" "items" $jump) }}
-
- {{- /* The legend: each marker the table draws, with how many rows carry
- it, through partials/marker_legend.html. The counts come from
- the type of every row through the same partial the rows do, so
- the legend and the rows cannot disagree. It sits between the bar
- and the table, right above the rows it explains. */ -}}
- {{- $legend := slice -}}
- {{- range $token, $entry := site.Data.event_emoji -}}
- {{- $legend = $legend | append (dict "emoji" $entry.emoji "one" $entry.one "many" $entry.many "count" (int (default 0 (index $counts.events $token)))) -}}
- {{- end }}
- {{ partial "marker_legend.html" (dict "label" "Event types" "items" $legend) }}
-
- {{ partial "event_table.html" (dict "rows" $rows) }}
-
+ {{ partial "event_listing.html" . }}
{{ end }}
diff --git a/themes/pybcn_theme/layouts/_default/home.html b/themes/pybcn_theme/layouts/_default/home.html
index 4ccba36c2..b94ab07ef 100644
--- a/themes/pybcn_theme/layouts/_default/home.html
+++ b/themes/pybcn_theme/layouts/_default/home.html
@@ -2,7 +2,7 @@
The home page.
The blocks, in order: the hero
- with the four counts of the Archive, About Python Barcelona with the
+ with the six counts of the Archive, About Python Barcelona with the
video, the two Meetup groups, the recent events, the photographs,
About us with the faces of the board and the committee, Take part, and
Our friends.
@@ -23,6 +23,43 @@
{{- $counts := partialCached "listing_counts.html" site "listing-counts" -}}
{{- $sponsors_total := len (partial "sponsor_ids.html" site) -}}
{{- $glyphs := site.Data.role_emoji -}}
+{{- /* The rule of the tiles: the number of a tile is the number of the
+ page it leads to, counted by the partial that page counts with,
+ so a reader who follows a tile finds the figure again in the
+ heading or the text of the page. Events, Talks, and People are the
+ totals of the h1 of the three listings (partials/listing_total.html
+ reads the same map), Sponsors is the h1 of /sponsors/, the RSVPs
+ are the sum the Attendees page prints (partials/meetup_rsvps.html),
+ and the board and the committee are the people the Who we are page
+ lists under its two home_faces levels, which the faces of About us
+ below draw from the same front matter. */ -}}
+{{- /* The board and the committee: the ids under the levels of
+ content/pybcn_association/organizers.md that carry home_faces, the
+ two bodies that run the association today (the former board and
+ the collaborators are not in the count), each person once, so a
+ person on both bodies is one. The link lands on the heading of the
+ first of those levels, which partials/people-grid.html gives an id
+ from its name. */ -}}
+{{- $who := site.GetPage "/pybcn_association/organizers" -}}
+{{- $board_ids := dict -}}
+{{- $board_anchor := "" -}}
+{{- range $who.Params.people_levels -}}
+ {{- if not .home_faces }}{{ continue }}{{ end -}}
+ {{- if not $board_anchor }}{{ $board_anchor = printf "#%s" (anchorize .name) }}{{ end -}}
+ {{- range .people -}}
+ {{- $id := . -}}
+ {{- if reflect.IsMap . }}{{ $id = .id }}{{ end -}}
+ {{- $board_ids = merge $board_ids (dict $id true) -}}
+ {{- end -}}
+{{- end -}}
+{{- $board_total := len $board_ids -}}
+{{- /* The RSVPs: the sum of the attendance field over the pages of
+ content/events/meetups/, which is the yes count of Meetup and not
+ who came (AGENTS.md: RSVPs are not attendance). The label says
+ Meetup, because the figure is Meetup's and covers no PyDay. The
+ tile leads to the Attendees page, which prints the same sum and
+ says what it is. */ -}}
+{{- $rsvps_total := (partialCached "meetup_rsvps.html" site "meetup-rsvps").total -}}
{{- $events := site.GetPage "/events" -}}
{{- $rows := slice -}}
{{- range $events.RegularPagesRecursive -}}
@@ -35,11 +72,27 @@
+ {{- /* Six tiles. The label is the title of the page the tile
+ leads to, except where that title would say something
+ else: the board and the committee are two levels of the
+ Who we are page, so the tile names them and lands on
+ their heading, and the RSVPs are a sum the Attendees
+ page prints, so the tile names the sum. The People
+ tile carries a caption, so the number under the word
+ is not read as the people who run the association,
+ which is the tile beside it. A number is printed with
+ a thousands separator, so 8917 reads as 8,917 next to
+ 607. The glyphs are the ones of data/role_emoji.yaml,
+ as on /people/, except the speech balloon of the
+ talks: a talk type has a Font Awesome icon and no emoji
+ (partials/event_types.html). */ -}}
{{- $tiles := slice
- (dict "path" "/events" "total" $counts.events_total "glyph" (index $glyphs "Events"))
- (dict "path" "/talks" "total" $counts.talks_total "glyph" (index $glyphs "Speaker"))
- (dict "path" "/people" "total" $counts.people_total "glyph" (index $glyphs "*"))
- (dict "path" "/sponsors" "total" $sponsors_total "glyph" (index $glyphs "Collaborator")) -}}
+ (dict "path" "/events" "total" $counts.events_total "glyph" (index $glyphs "Events"))
+ (dict "path" "/talks" "total" $counts.talks_total "glyph" "💬")
+ (dict "path" "/people" "total" $counts.people_total "glyph" (index $glyphs "*") "caption" "Speakers, organizers, and others")
+ (dict "path" "/pybcn_association/organizers" "total" $board_total "glyph" (index $glyphs "Board (2026)") "label" "Board and Committee" "anchor" $board_anchor)
+ (dict "path" "/people/role/attendees" "total" $rsvps_total "glyph" (index $glyphs "Attendees") "label" "Meetup RSVPs")
+ (dict "path" "/sponsors" "total" $sponsors_total "glyph" (index $glyphs "Collaborator")) -}}
Python Barcelona, since {{ $first_year }}
@@ -49,10 +102,10 @@
Python Barcelona, since {{ $first_year }}
{{- $tile := . }}
{{- with site.GetPage .path }}
-
+
{{ $tile.glyph }}
- {{ $tile.total }}
- {{ .Title }}
+ {{ lang.FormatNumberCustom 0 $tile.total }}
+ {{ default .Title $tile.label }}{{ with $tile.caption }}{{ . }}{{ end }}
{{- else }}{{ errorf "home: the page %q is missing" $tile.path }}{{ end }}
@@ -132,7 +185,7 @@
Recent events
-
Our favourite pictures from our favourite events
+ Our favorite pictures from our favorite events
@@ -170,7 +223,7 @@ Our favourite pictures from our favourite eventsAbout us
{{- $boxes := slice
(dict "path" "/pybcn_association/membership" "icon" "fa-sign-in-alt" "text" "Join the association: 20 euros a year, and a voice and a vote in the general assembly.")
(dict "path" "/pybcn_association/organize-with-us" "icon" "fa-calendar-day" "text" "Help us run a meetup, or ask us to help with yours.")
- (dict "path" "/pybcn_association/propose-a-talk" "icon" "fa-comment" "text" "Twenty minutes on something you built, learnt, or broke.")
+ (dict "path" "/pybcn_association/propose-a-talk" "icon" "fa-comment" "text" "Twenty minutes on something you built, learned, or broke.")
(dict "path" "/contact" "icon" "fa-envelope" "text" "A question, an idea, a venue to offer: write to us.") -}}
diff --git a/themes/pybcn_theme/layouts/_default/list.html b/themes/pybcn_theme/layouts/_default/list.html
index e9f0e613b..54bc873ff 100644
--- a/themes/pybcn_theme/layouts/_default/list.html
+++ b/themes/pybcn_theme/layouts/_default/list.html
@@ -4,6 +4,11 @@
Without this, Hugo emits no index.html for those URLs, and GitHub Pages
falls back to the index.xml it does emit: six URLs on this site served raw
RSS to a visitor, including the "The association" link in the main menu.
+
+ The index pages of the event series (/events/meetups/ and the other
+ three) took this list until 2026-10-25, by title, which put the
+ meetups of twenty years in alphabetical order; they have
+ layouts/events/list.html now, the table of /events/ cut to the series.
*/ -}}
{{ define "main" }}
diff --git a/themes/pybcn_theme/layouts/_default/meetup.html b/themes/pybcn_theme/layouts/_default/meetup.html
index 2b61cbdd0..86b86a458 100644
--- a/themes/pybcn_theme/layouts/_default/meetup.html
+++ b/themes/pybcn_theme/layouts/_default/meetup.html
@@ -20,17 +20,17 @@
An almost empty page is the normal case here and not a failure. 266
events came out of the export, and most of them will never hold more
- than a day, a place, and a count of registrations. The page prints the
+ than a day, a place, and a count of RSVPs. The page prints the
facts it has in the box of partials/facts_box.html and leaves out a
fact with no data behind it, which is the rule
layouts/_default/events_index.html and layouts/people/list.html already
follow for a row of theirs: nothing reads "unknown" and nothing reads
"0". A file with no venue (a few of the early meetups) or with no
- registrations gets a shorter box rather than a row that says the field
+ RSVPs gets a shorter box rather than a row that says the field
is missing.
attendance is the yesCount of the Meetup RSVPs, so this page says
- registrations and never attendance. AGENTS.md requires that, because
+ RSVPs and never attendance. AGENTS.md requires that, because
attendedCount is zero on almost every record and nobody counted the
room. The row of the box says it in words as well, behind the
disclosure of the number: it used to be the paragraph of a Source
@@ -112,23 +112,23 @@
{{- end }}
{{- /* The box of facts, partials/facts_box.html: the place, the
- group, the registrations, and the record the page was
+ group, the RSVPs, and the record the page was
read from, each row left out when the front matter does
not carry it, which the partial does for a row with no
value. The source is the last row because it is the
provenance of the page and not a part of the day. The
marker glyph of the venue is the one the event row of a
talk page carries: "where". The caveat on the
- registrations is the note of its row (AGENTS.md: RSVPs
+ RSVPs is the note of its row (AGENTS.md: RSVPs
are not attendance), one tap away on a touch screen.
Every file carries a meetup_url today, the ones from the
export and the two written by hand alike; the guard is
for the file that does not. */ -}}
- {{- $registrations := "" -}}
+ {{- $rsvps := "" -}}
{{- with .Params.attendance -}}
{{- $signups := int . -}}
{{- if gt $signups 0 -}}
- {{- $registrations = printf "%d %s" $signups (cond (eq $signups 1) "person" "people") -}}
+ {{- $rsvps = printf "%d %s" $signups (cond (eq $signups 1) "person" "people") -}}
{{- end -}}
{{- end -}}
{{- $source := "" -}}
@@ -136,7 +136,7 @@
{{ partial "facts_box.html" (dict "items" (slice
(dict "label" "Venue" "icon" "fa-map-marker-alt" "value" .Params.venue "meta" "venue")
(dict "label" "Group" "icon" "fa-user-friends" "value" .Params.group "filter" "group" "ignore" true)
- (dict "label" "Registrations" "icon" "fa-user-check" "value" $registrations
+ (dict "label" "RSVPs" "icon" "fa-user-check" "value" $rsvps
"note" "The people who said yes on Meetup. It is the only figure the record holds, so it is not a count of who came."
"note_label" "Who is counted")
(dict "label" "Source" "mark_url" .Params.meetup_url "value" $source "url" .Params.meetup_url "ignore" true))) }}
@@ -146,12 +146,12 @@
{{ . }}
{{- end }}
- {{- /* The programme, when the announcement of this meetup has
+ {{- /* The program, when the announcement of this meetup has
been read. The row is the row of the /talks/ index: the
icon of the type, the title as the link to the page of
the talk, who gave it, and the Watch line of its video:
the rows of partials/talk_rows.html, which the edition
- page with talks and no programme grid draws as well. */ -}}
+ page with talks and no program grid draws as well. */ -}}
{{- with .Params.talks }}
Talks ({{ len . }})
diff --git a/themes/pybcn_theme/layouts/events/list.html b/themes/pybcn_theme/layouts/events/list.html
new file mode 100644
index 000000000..25e6ee4fc
--- /dev/null
+++ b/themes/pybcn_theme/layouts/events/list.html
@@ -0,0 +1,25 @@
+{{- /*
+ The index of a series of events: /events/meetups/, /events/pyday_bcn/,
+ /events/pydatabcn/, and /events/other_events/.
+
+ The same listing as /events/, cut to the events of the series: the
+ intro of the page, the tabs of the series (partials/events_tabs.html,
+ with this one marked current), the years, the legend, and the table
+ grouped by year and by month, newest first, through partials/event_listing.html,
+ which is where the two layouts share their one body. The h1 carries
+ the number of rows, "Monthly meetups (268)", from
+ partials/listing_total.html, the way "Events (281)" does.
+
+ Hugo picks this layout for the section pages nested under events/ by
+ their type, which is the top section. /events/ itself is not drawn
+ here: content/events/_index.md selects the events_index layout, which
+ Hugo looks up before this file. These four pages took the fallback
+ layouts/_default/list.html until 2026-10-25, a list of titles in
+ alphabetical order, which read "April" before "August" and 2016
+ beside 2025.
+*/ -}}
+{{ define "main" }}
+
+ {{ partial "event_listing.html" . }}
+
+{{ end }}
diff --git a/themes/pybcn_theme/layouts/partials/agenda.html b/themes/pybcn_theme/layouts/partials/agenda.html
index 3516fbad1..abed94316 100644
--- a/themes/pybcn_theme/layouts/partials/agenda.html
+++ b/themes/pybcn_theme/layouts/partials/agenda.html
@@ -29,7 +29,7 @@
{{- /* The talks and the rooms of this page by id, so a slot of the agenda
finds its own and nothing else. Same join as photo_gallery.html.
- One colour per room as well, taken in the order the grid first names
+ One color per room as well, taken in the order the grid first names
them and kept for the whole day. See agenda_entry.html. */ -}}
{{- $talks := dict -}}
{{- range $talk := .talks -}}
@@ -67,11 +67,11 @@
{{ $title_lang := partial "title_lang.html" $event }}
{{- /* A slot that spans every track is a banner: the registration, a
break, the lunch, or a closing session that fills the room. Its
- text is centred. The retired "class: middle" said the same by
+ text is centered. The retired "class: middle" said the same by
hand, on 46 of the 54 rows that span the full width, so the
other 8 sat left-aligned for no reason. Width is the rule, not
whether the row holds a talk: the closing session of 2025 is a
- talk, spans every track, and was centred. */ -}}
+ talk, spans every track, and was centered. */ -}}
{{- $banner := ge (int $event.track_length) $numTracks -}}
@@ -146,7 +146,7 @@
{{ with $event.room }}
{{ if or (in . "www") (in . "http") }}
- {{ . }}
+ {{ . }}
{{ else }}
{{ . }}
{{ end }}
diff --git a/themes/pybcn_theme/layouts/partials/agenda_entry.html b/themes/pybcn_theme/layouts/partials/agenda_entry.html
index 08510b78a..0270c2973 100644
--- a/themes/pybcn_theme/layouts/partials/agenda_entry.html
+++ b/themes/pybcn_theme/layouts/partials/agenda_entry.html
@@ -5,7 +5,7 @@
slot one entry of the agenda list of the page
talks the talks of the page, keyed by id
rooms the rooms of the page, keyed by id
- colors the colour of each room, keyed by room id
+ colors the color of each room, keyed by room id
people the name of every person record, keyed by id
event_url the RelPermalink of the event page, or absent. It is half
the key of partials/talk_pages_index.html, so a caller
@@ -29,11 +29,11 @@
What this partial computes rather than reads from the page:
- - The colour. It used to be written on every entry, and it meant
- nothing: across the eight editions 24 colour-and-room combinations
+ - The color. It used to be written on every entry, and it meant
+ nothing: across the eight editions 24 color-and-room combinations
covered more than one room and only 20 mapped to a single room, and
- the colour followed neither the type, nor the topic, nor the level.
- Now every room of an event gets one colour of the palette below and
+ the color followed neither the type, nor the topic, nor the level.
+ Now every room of an event gets one color of the palette below and
keeps it for the whole day, so a reader can follow a track down the
grid. A slot with no room gets grey.
@@ -118,7 +118,7 @@
is what fails the build for it; the page still reads.
A slot with no talk reads its own speakers, and a slot that credits
- no person carries none: the organising committee of an edition is not
+ no person carries none: the organizing committee of an edition is not
a person and gets no record. */ -}}
{{- $names := slice -}}
{{- range $id := $source.speakers -}}
@@ -131,7 +131,7 @@
{{- end -}}
{{- /* credited_as is the credit of something that is not a person, so it has
- no record to point at: the organising committee of an edition runs the
+ no record to point at: the organizing committee of an edition runs the
registration, the breaks, and the closing. Moving speakers to person
ids dropped those eight credits, because a committee cannot have a
person record. A session never has both: speakers names people, and
diff --git a/themes/pybcn_theme/layouts/partials/appearances_index.html b/themes/pybcn_theme/layouts/partials/appearances_index.html
index bd5c2c318..650d8751d 100644
--- a/themes/pybcn_theme/layouts/partials/appearances_index.html
+++ b/themes/pybcn_theme/layouts/partials/appearances_index.html
@@ -38,7 +38,7 @@
speakers index like a curated entry, under the heading "Speakers". The
curated lists are the only source for the two pages with no year and the
only source of the other roles; the talks are the only source for the
- three editions that carry a programme and no people_sections, PyData
+ three editions that carry a program and no people_sections, PyData
Barcelona 2017, PyDay BCN 2018, and PyDay BCN 2019.
The heading is the level name when the level has one, and the section
diff --git a/themes/pybcn_theme/layouts/partials/attendees_note.html b/themes/pybcn_theme/layouts/partials/attendees_note.html
new file mode 100644
index 000000000..07af4715f
--- /dev/null
+++ b/themes/pybcn_theme/layouts/partials/attendees_note.html
@@ -0,0 +1,22 @@
+{{- /*
+ The text of the Attendees page, /people/role/attendees/.
+
+ The page has no rows: the association never recorded who came to an
+ event, and this is the place that says so, and the place that holds
+ the one figure there is, the Meetup RSVPs. The Meetup RSVPs tile of
+ the home page leads here and prints the same number, from the same
+ partial (partials/meetup_rsvps.html), so the tile and the page cannot
+ disagree. The figures are computed, and the sentence that explains
+ them is written here and nowhere else.
+
+ Printed by layouts/people/role.html for the page whose filter is
+ Attendees, where /people/ prints its intro. The page itself is added
+ by content/people/_content.gotmpl, which cannot compute the figure: a
+ content adapter runs before the pages exist.
+*/ -}}
+{{- $rsvps := partialCached "meetup_rsvps.html" site "meetup-rsvps" -}}
+
+
We don't track that!
+
{{ lang.FormatNumberCustom 0 $rsvps.total }} Meetup RSVPs is the sum of the "RSVP: yes" answers on Meetup over the {{ $rsvps.counted }} meetups whose page records the figure, of {{ $rsvps.meetups }}. It is the number the home page prints.
+
An RSVP is a promise to come, not a seat filled: the people in the room on the day were more or fewer than that, and nobody counted them. The association never recorded who came, so nobody who only attended is named in this archive. It names the people who spoke, organized, mentored, or collaborated, because a program, a board page, or a credit names them.
+
diff --git a/themes/pybcn_theme/layouts/partials/count_card.html b/themes/pybcn_theme/layouts/partials/count_card.html
index a27f78f11..5934a9e49 100644
--- a/themes/pybcn_theme/layouts/partials/count_card.html
+++ b/themes/pybcn_theme/layouts/partials/count_card.html
@@ -51,9 +51,9 @@
the figures). The talk and the photo take their icon from
event_types.html, the vocabulary of agenda entry types, by token, so
the comment of a talk and the camera of a photo are the glyphs the
- programme grid already draws for them, and a change there reaches
+ program grid already draws for them, and a change there reaches
here. The nouns are this table's own: the "photo" entry of that table
- is the group photo slot of a programme, and a photo counted here is a
+ is the group photo slot of a program, and a photo counted here is a
picture of a gallery. The other three kinds are not entry types,
which is why they are not added to that table: a token of
event_types.html is a value a talk's type field may hold, and a talk
diff --git a/themes/pybcn_theme/layouts/partials/event_detail.html b/themes/pybcn_theme/layouts/partials/event_detail.html
index 3f79d39bb..3dba89044 100644
--- a/themes/pybcn_theme/layouts/partials/event_detail.html
+++ b/themes/pybcn_theme/layouts/partials/event_detail.html
@@ -6,7 +6,7 @@
the strings it replaces held more than one address, with a label around
each in raw HTML. The label is data here and this template owns the
markup, so the
scaffolding those two carried is gone. A single
- unlabelled address renders as it did: markdownify turns a bare URL into
+ unlabeled address renders as it did: markdownify turns a bare URL into
a link. */ -}}
{{ $title_lang := partial "title_lang.html" $.event }}
@@ -37,7 +37,7 @@
{{ with $.event.room }}
{{ if or (in . "www") (in . "http") }}
- {{ . }}
+ {{ . }}
{{ else }}
{{ . }}
{{ end }}
diff --git a/themes/pybcn_theme/layouts/partials/event_listing.html b/themes/pybcn_theme/layouts/partials/event_listing.html
new file mode 100644
index 000000000..bb24a6b05
--- /dev/null
+++ b/themes/pybcn_theme/layouts/partials/event_listing.html
@@ -0,0 +1,63 @@
+{{- /*
+ The listing of the events under a page: the intro of the page, the
+ tabs of the series, the jump bar of its years, the legend of its
+ types, and the table of partials/event_table.html, newest first.
+
+ Argument: the page. /events/ passes itself (layouts/_default/
+ events_index.html) and so does the index of each series under it,
+ /events/meetups/, /events/pyday_bcn/, /events/pydatabcn/, and
+ /events/other_events/ (layouts/events/list.html), so a series reads
+ as the whole listing does, cut to its own events: the series pages
+ listed their editions by title until 2026-10-25, which put "Python
+ Meetup April" before "Python Meetup August" of another year.
+
+ What is a row. A regular page under the page that carries a year in
+ its front matter, which is the test of the whole listing (the header
+ of events_index.html says which five pages it keeps out and why). The
+ rows are the dicts of partials/event_row.html, sorted by their key,
+ which reads newest first; the home page builds the same rows and
+ keeps the ten newest (layouts/_default/home.html).
+
+ The tabs, through partials/events_tabs.html, are the same bar on
+ /events/ and on each series page, All and the four series with their
+ counts, the current one marked, as /talks/ and /people/ have above
+ their rows; they sit under the intro, as on those two, and above the
+ years and the legend, which are about the rows the tab chose.
+
+ The jump bar, through partials/jump_bar.html, names the years that
+ have a row, in the order the table draws them, and only when there
+ are two or more: a bar with one link leads nowhere the reader is not.
+ The legend, through partials/marker_legend.html, names each type the
+ rows carry with its count, counted from the rows themselves, so on
+ /events/ it says what partials/listing_counts.html says (the same
+ rule, the same type partial) and on a series page it says what that
+ page draws and nothing of the others.
+*/ -}}
+{{ with .Content }}{{ . }}
{{ end }}
+
+{{ partial "events_tabs.html" . }}
+
+{{- $rows := slice -}}
+{{- $types := dict -}}
+{{- range .RegularPagesRecursive -}}
+ {{- if not .Params.year }}{{ continue }}{{ end -}}
+ {{- $row := partial "event_row.html" . -}}
+ {{- $rows = $rows | append $row -}}
+ {{- $types = merge $types (dict $row.type (add 1 (int (default 0 (index $types $row.type))))) -}}
+{{- end -}}
+{{- $rows = sort $rows "key" -}}
+
+{{- $jump := slice -}}
+{{- $open := "" -}}
+{{- range $rows }}{{ if ne .year $open }}{{ $jump = $jump | append (dict "anchor" .year "text" .year) }}{{ $open = .year }}{{ end }}{{ end }}
+{{- if gt (len $jump) 1 }}
+{{ partial "jump_bar.html" (dict "label" "Jump to a year" "items" $jump) }}
+{{- end }}
+
+{{- $legend := slice -}}
+{{- range $token, $entry := site.Data.event_emoji -}}
+ {{- $legend = $legend | append (dict "emoji" $entry.emoji "one" $entry.one "many" $entry.many "count" (int (default 0 (index $types $token)))) -}}
+{{- end }}
+{{ partial "marker_legend.html" (dict "label" "Event types" "items" $legend) }}
+
+{{ partial "event_table.html" (dict "rows" $rows) }}
diff --git a/themes/pybcn_theme/layouts/partials/event_row.html b/themes/pybcn_theme/layouts/partials/event_row.html
index c5a60f091..268f1467a 100644
--- a/themes/pybcn_theme/layouts/partials/event_row.html
+++ b/themes/pybcn_theme/layouts/partials/event_row.html
@@ -12,6 +12,8 @@
url where the row links: the page, or the url of its menu
entry when it declares one
emoji the glyph of the type, from data/event_emoji.yaml
+ type the token of the type, a key of data/event_emoji.yaml,
+ which the legend of a listing counts rows by
type_label the name of the type, the accessible name of the glyph
venue a dict with text, the short name, and full, the whole
string when it says more than the short name; empty
@@ -44,7 +46,7 @@
front matter when the table has no row for it. venue is the place, and
it comes from the Meetup export, which records one per event. It is not
rooms: that lists the rooms inside the venue, so its first entry is the
- first column of the programme, which printed "B6" where the reader
+ first column of the program, which printed "B6" where the reader
expects "Universitat de Barcelona". It goes through the escaping of the
template and never through safeHTML: a venue is content, and AGENTS.md
says to assume any content field can inject HTML.
@@ -57,7 +59,7 @@
data/venues.yaml is what decides
how a venue reads, and the page of the event holds the whole record.
- The card: what the day holds, the talks of its programme, the photos
+ The card: what the day holds, the talks of its program, the photos
its gallery renders, and the videos it prints, from
partials/listing_counts.html, the one walk of the site. The card
leaves out a count of zero, so no row reads "0 photos", and a day with
@@ -126,6 +128,7 @@
"title" .Title
"url" $url
"emoji" $marker.emoji
+ "type" $type
"type_label" $marker.label
"venue" $venue
"card" $card
diff --git a/themes/pybcn_theme/layouts/partials/event_type_icon.html b/themes/pybcn_theme/layouts/partials/event_type_icon.html
index 92df04f28..f0d4e8374 100644
--- a/themes/pybcn_theme/layouts/partials/event_type_icon.html
+++ b/themes/pybcn_theme/layouts/partials/event_type_icon.html
@@ -10,7 +10,7 @@
facts of a talk page. A named icon carries the label of its type as its
accessible name and as its hover, from the one field of
event_types.html, so the two cannot disagree. The rows of a listing
- (/talks/, the programme of a meetup) want that: nothing else on the row
+ (/talks/, the program of a meetup) want that: nothing else on the row
says that a talk was a workshop or a lightning talk. A title attribute
on a hidden icon would have been a hover for a mouse and nothing for a
screen reader, which is the reader the name is for, so the icon is an
diff --git a/themes/pybcn_theme/layouts/partials/event_videos.html b/themes/pybcn_theme/layouts/partials/event_videos.html
index 74a0c1a1e..77aad3d37 100644
--- a/themes/pybcn_theme/layouts/partials/event_videos.html
+++ b/themes/pybcn_theme/layouts/partials/event_videos.html
@@ -1,6 +1,6 @@
{{- /*
The videos of one edition page, as rows for the Videos subsection of
- its gallery, in the order of the programme.
+ its gallery, in the order of the program.
Argument: the event page.
@@ -21,7 +21,7 @@
Why rows of their own. A player belongs on a page about one talk and
a link belongs on a row. The grid of the
- programme is neither: a block of the grid is a slot, at its hour and
+ program is neither: a block of the grid is a slot, at its hour and
in its room, and the grid of PyDay BCN 2020 was the one schedule of
the site that printed a video, 20 links on 20 blocks, while the page
of every other edition printed none. The links left the grid and
@@ -35,15 +35,15 @@
photographs, because a recording is material added after the day
(the header of partials/gallery_content.html has the decision).
- One row per video, in programme order. The agenda is walked first,
+ One row per video, in program order. The agenda is walked first,
slot by slot: a slot with a talk takes the video of its talk, a slot
with none takes its own (the Welcome Session is the one case, see
partials/listing_counts.html), and a talk the grid places twice is
printed once. Then the talks the agenda does not place, in the order
of the talks block, so a video reaches the page whether or not the
- programme has a slot for it; none is in that state today. A session
+ program has a slot for it; none is in that state today. A session
with no video has no row: this is the list of what was recorded, not
- a second programme. The first link of type video is the one, the rule
+ a second program. The first link of type video is the one, the rule
of partials/agenda_entry.html; no session of the archive carries two.
The one caller is partials/gallery_content.html, for every edition
@@ -52,7 +52,7 @@
order of its talks block; its Talks block prints the Watch line on
each row as well, and the Gallery lists the same 29 recordings
together, a mild redundancy on purpose: the
- row says this talk was filmed while you read the programme.
+ row says this talk was filmed while you read the program.
*/ -}}
{{- $page := . -}}
{{- $pages := partialCached "talk_pages_index.html" site "talk-pages-index" -}}
diff --git a/themes/pybcn_theme/layouts/partials/events_tabs.html b/themes/pybcn_theme/layouts/partials/events_tabs.html
new file mode 100644
index 000000000..c58b09513
--- /dev/null
+++ b/themes/pybcn_theme/layouts/partials/events_tabs.html
@@ -0,0 +1,73 @@
+{{- /*
+ The tabs of the events listing: All, then one tab per series under
+ /events/ that holds an event, each with its count, through
+ partials/filter_tabs.html.
+
+ [ All N ] [ Monthly meetups N ] [ PyDay BCN N ] [ PyDataBCN N ] [ Other events N ]
+
+ Argument: the page being rendered, /events/ or the index of one
+ series, so that its tab is marked current.
+
+ The tabs are the ones of /talks/ and /people/, with one difference:
+ a view of those two listings is a page a content adapter adds, and
+ a view of this one is a section that already exists,
+ content/events/meetups/, pyday_bcn/, pydatabcn/, and other_events/,
+ each drawn by layouts/events/list.html with the table of /events/
+ cut to its own events. So the tabs are read from the sections of
+ /events/ and not from a list written here: a fifth series is a
+ folder with an _index.md and gets its tab, and a section that holds
+ no event (no regular page with a year under it, which is the test
+ of a row in partials/event_listing.html) gets none, so a tab never
+ leads to an empty table. The text of a tab is the title of its
+ section page, as the tabs of /talks/ read theirs.
+
+ The counts are counted here, by the rule of the row, from the same
+ walk of site.RegularPages that partials/listing_counts.html makes
+ for the total of /events/: a page of the events section with a
+ year, filed under its CurrentSection, which for a page of a series
+ is the index of that series. So the count of a tab is the count
+ partials/listing_total.html prints in the h1 of the page it leads
+ to, "Monthly meetups (268)", both from the one test, and the four
+ add up to the All tab (268 + 9 + 1 + 3 = 281 on 2026-10-25). A page
+ of the events section with a year that sits in no series would
+ count in All and in no tab; none does today, and monthly_events.md,
+ the one regular page directly under /events/, has no year and is a
+ row of nothing.
+
+ The order is the order of the Events menu, the weight of each
+ section page (pyday_bcn 1, pydatabcn 2, other_events 4), with the
+ meetups first: content/events/meetups/_index.md has no menu entry
+ and no weight, which sorts as 0, and its header says why it is kept
+ out of the menu. That is also the tab that holds 268 of the 281
+ rows, the one a reader needs first, which is the rule of
+ partials/people_tabs.html. Two sections of one weight fall back to
+ their title. No glyph: the legend under the tabs names the types
+ the rows of the page carry (a series is not a type: the meetups
+ hold eleven of them, and other_events/ holds a PyDataBCN edition),
+ so a glyph on the tab would say one type for a page of several.
+*/ -}}
+{{- $here := . -}}
+{{- $section := site.GetPage "/events" -}}
+{{- $counts := dict -}}
+{{- $total := 0 -}}
+{{- range $pg := site.RegularPages -}}
+ {{- if ne $pg.Section "events" }}{{ continue }}{{ end -}}
+ {{- if not $pg.Params.year }}{{ continue }}{{ end -}}
+ {{- $total = add $total 1 -}}
+ {{- $key := $pg.CurrentSection.RelPermalink -}}
+ {{- $counts = merge $counts (dict $key (add 1 (int (default 0 (index $counts $key))))) -}}
+{{- end -}}
+{{- $items := slice (dict "url" $section.RelPermalink "text" "All" "count" $total "current" (eq $here.RelPermalink $section.RelPermalink)) -}}
+{{- $series := slice -}}
+{{- range $section.Sections -}}
+ {{- $count := int (default 0 (index $counts .RelPermalink)) -}}
+ {{- if not $count }}{{ continue }}{{ end -}}
+ {{- $series = $series | append (dict
+ "url" .RelPermalink
+ "text" .Title
+ "count" $count
+ "current" (eq $here.RelPermalink .RelPermalink)
+ "key" (printf "%03d %s" (int .Weight) .Title)) -}}
+{{- end -}}
+{{- with $series }}{{ $items = $items | append (sort . "key") }}{{ end -}}
+{{- partial "filter_tabs.html" (dict "label" "Event series" "items" $items) -}}
diff --git a/themes/pybcn_theme/layouts/partials/facts_box.html b/themes/pybcn_theme/layouts/partials/facts_box.html
index 27c4ee0d5..1b354929a 100644
--- a/themes/pybcn_theme/layouts/partials/facts_box.html
+++ b/themes/pybcn_theme/layouts/partials/facts_box.html
@@ -1,5 +1,5 @@
{{- /*
- facts_box: the box of facts about the subject of a page, one labelled
+ facts_box: the box of facts about the subject of a page, one labeled
row per fact.
[ (user) Speaker Marc Pous ]
@@ -69,7 +69,7 @@
The search. The box sits inside the element the layout marks as the
search body of the page (data-pagefind-body, see
partials/hero_header.html), so its values are what a reader
- searches: the names of the speakers, the venue, the registrations.
+ searches: the names of the speakers, the venue, the RSVPs.
Three things in it are not. The dt is the label, "Venue" on 281
pages, and is ignored; a row the caller marks ignore is ignored whole;
and the note behind the disclosure is a sentence this site wrote, the
@@ -96,16 +96,16 @@
div is display: contents in facts.scss and the dt and dd land in the
two columns of the grid of the dl, the label column as wide as its
longest label. At 390px the two columns still fit: the longest label,
- Registrations, takes about a third of the width, and a long value
+ RSVPs, takes about a third of the width, and a long value
wraps inside its cell. The box is the bordered pill of
- partials/count_card.html at full width, in the colour of the facts,
+ partials/count_card.html at full width, in the color of the facts,
so the two read as the same kind of thing: a box of figures.
The icons are Font Awesome and not emoji, one per line. The site
already keeps three vocabularies of glyph with one
job each: an emoji is the type of an event (data/event_emoji.yaml,
the rows of /events/ and /people/), a Font Awesome icon is a count
- (partials/count_card.html) or a type of session (the programme grid,
+ (partials/count_card.html) or a type of session (the program grid,
partials/event_types.html), and a Font Awesome brand mark is where a
link goes (partials/person_social_icons.html). An emoji per fact
would be a fourth, and it would sit on the page of a person next to
@@ -122,7 +122,7 @@
touch screen does not have and a keyboard reaches
unreliably, so the note is one tap or one Enter away, the browser
announces it as expanded or collapsed, and a page with no JavaScript
- still opens it. The sentence about the registrations of a meetup
+ still opens it. The sentence about the RSVPs of a meetup
being the people who said yes and not a count of who came lives
behind one of these, because AGENTS.md requires it and the end of
the page, where it was, is gone.
diff --git a/themes/pybcn_theme/layouts/partials/filter_tabs.html b/themes/pybcn_theme/layouts/partials/filter_tabs.html
index f78290562..0375ab7f0 100644
--- a/themes/pybcn_theme/layouts/partials/filter_tabs.html
+++ b/themes/pybcn_theme/layouts/partials/filter_tabs.html
@@ -2,23 +2,24 @@
The tabs above a listing: one link per view of the list, with the
current one marked.
- [ All 607 ] [ 💬 Talks 398 ] [ 💻 Workshops 172 ] [ ⚡ Lightning talks 27 ] ...
+ [ All N ] [ 💬 Talks N ] [ 💻 Workshops N ] [ ⚡ Lightning talks N ] ...
Arguments:
- label the aria-label of the nav, "Talk types" or "Roles"
+ label the aria-label of the nav, "Talk types", "Roles", or
+ "Event series"
items a slice of dicts, one per tab, in the order to print:
url the page the tab leads to
text what the tab reads, "Workshops"
count optional, how many rows that page lists;
left out when it is not a number the page
- has (the Assistants tab of /people/)
+ has (the Attendees tab of /people/)
emoji optional, the glyph in front of the text, or
type optional, the token of a talk type, for
partials/event_type_icon.html
current true on the tab of the page being rendered
- Why links and not a widget. The filter of /talks/ and /people/ is a
- set of tabs that are sub-pages.
+ Why links and not a widget. The filter of /talks/, /people/, and
+ /events/ is a set of tabs that are sub-pages.
Each tab is a page with an address, so the filter works with no
script, a crawler indexes every view, and a reader can send one view
in a message. The markup is therefore a nav of links and not the ARIA
diff --git a/themes/pybcn_theme/layouts/partials/footer.html b/themes/pybcn_theme/layouts/partials/footer.html
index 8cc1acf66..2a08f4248 100644
--- a/themes/pybcn_theme/layouts/partials/footer.html
+++ b/themes/pybcn_theme/layouts/partials/footer.html
@@ -6,7 +6,7 @@
- The Association, with the capital A.
- Contact us is here as "Contact PyBCN", in the How we behave
column, and nowhere in the header.
- - "Our Github", the organisation on GitHub. It sits in The website,
+ - "Our Github", the organization on GitHub. It sits in The website,
the one column that is
about the site and its sources rather than about the pages of the
association.
@@ -18,13 +18,13 @@
association, under the four columns.
- The feed and the sitemap left that line. The Follow us column is
The website: plain text links to the search first (the second
- review), then the feed, the sitemap, and the GitHub organisation,
+ review), then the feed, the sitemap, and the GitHub organization,
no glyph.
- The last line is the legal name of the association and its short
name, from config.toml, so it is "Associació Python Barcelona
(PyBCN)" and not the English extended_name.
- The licence line names the two licences LICENSING.md states and
+ The license line names the two licenses LICENSING.md states and
links the file, as in the other options.
*/ -}}
{{- $rss := "" -}}
@@ -89,7 +89,7 @@
{{ range sort site.Params.social_items "weight" }}
-
+
{{ end }}
diff --git a/themes/pybcn_theme/layouts/partials/footer_link.html b/themes/pybcn_theme/layouts/partials/footer_link.html
index b41cf400c..5500f4e77 100644
--- a/themes/pybcn_theme/layouts/partials/footer_link.html
+++ b/themes/pybcn_theme/layouts/partials/footer_link.html
@@ -3,7 +3,7 @@
Argument: a dict with either path, an internal page resolved through
site.GetPage so a moved page fails the build, or name and url, for
- the feed, the sitemap, and the GitHub organisation. name overrides
+ the feed, the sitemap, and the GitHub organization. name overrides
the title of a page ("Contact PyBCN" for /contact). external marks a
link that leaves the site, which opens in a new tab as the accounts
of the social line do.
diff --git a/themes/pybcn_theme/layouts/partials/gallery_content.html b/themes/pybcn_theme/layouts/partials/gallery_content.html
index b5ab3097f..e0f6cd025 100644
--- a/themes/pybcn_theme/layouts/partials/gallery_content.html
+++ b/themes/pybcn_theme/layouts/partials/gallery_content.html
@@ -7,9 +7,9 @@
thread the URL of the thread of the day, or ""
photos a slice of the photos the gallery renders, in page order
videos a slice of the recordings of the day, the rows of
- partials/event_videos.html in programme order, on an
+ partials/event_videos.html in program order, on an
edition page (layouts/_default/event.html) whose
- programme is a grid; an empty slice on every other page,
+ program is a grid; an empty slice on every other page,
and on an edition page that prints its talks as rows
Each photo is a dict:
@@ -75,17 +75,17 @@
became one list: the Talks heading reads
"Talks (32) & Videos (29)" and the gallery of that page holds its
photographs alone. The Videos subsection stays for a page whose
- programme is a grid, PyDay BCN 2020 today, where the video of a slot
+ program is a grid, PyDay BCN 2020 today, where the video of a slot
is in the block and its modal and no list of recordings exists. The
link on the row of a slot stays as well, a mild redundancy on purpose:
the block says this talk was filmed while you read the
- programme, and the Gallery lists the recordings of the day together.
+ program, and the Gallery lists the recordings of the day together.
Edition pages only, the pages with layout event. A meetup page
(layouts/_default/meetup.html) prints its talks as rows with the Watch
line on each, and the recording of a whole session, which belongs to
no talk, under its own Recordings heading (partials/session_videos.html,
- which an edition page prints under the programme too); its gallery is
+ which an edition page prints under the program too); its gallery is
its photographs. partials/listing_counts.html counts the videos of a
day from the front matter itself, not from here, so the row of /events/
and this subsection agree by reading the same records.
@@ -123,7 +123,7 @@
"talk" $talk) -}}
{{- end -}}
{{- end -}}
-{{- /* The videos, on an edition page with a programme grid and no other:
+{{- /* The videos, on an edition page with a program grid and no other:
see the header. A page with talks and no agenda prints its Talks
block instead. The partial reads the talk pages and the person
names through partialCached, so a second edition pays for neither
diff --git a/themes/pybcn_theme/layouts/partials/head-meta.html b/themes/pybcn_theme/layouts/partials/head-meta.html
index 2494842ab..c29d999ec 100644
--- a/themes/pybcn_theme/layouts/partials/head-meta.html
+++ b/themes/pybcn_theme/layouts/partials/head-meta.html
@@ -32,7 +32,6 @@
images/social-card.png, so the card is never empty.
*/ -}}
{{- $title := or .Params.name .Title site.Title -}}
-{{- $description := or .Description .Summary site.Params.description -}}
{{- $social := partial "social_image.html" . -}}
{{- $card := "summary" -}}
{{- $image := "" -}}
@@ -46,16 +45,92 @@
file and not a crop of the logo: the logo is 920x273, and filling
it into the 1200x630 a card wants cut 43 per cent of the width,
so the card read "python barcelo" on a transparent background
- that each client painted its own colour. social-card.png is the
- whole logo, centred, on white. */ -}}
+ that each client painted its own color. social-card.png is the
+ whole logo, centered, on white. */ -}}
{{- with resources.Get "images/social-card.png" -}}
{{- $image = .Permalink -}}
{{- end -}}
{{- end -}}
+{{- /*
+ The meta description, the sentence a search engine shows under the
+ title of a result. No page had one until 2026-10-21: a result showed
+ whatever text the engine picked from the page, the bar and the first
+ row of a table included.
+
+ The source, in order. The description of the front matter when the
+ page sets one (17 of the 285 event pages, the listings, the
+ association pages, and the pages the two content adapters add). Else
+ a sentence built from the record the page already prints: for a talk, who gave it, at which event and on which
+ day, from partials/talk_record.html, the join the page of the talk
+ reads; for an event, its type (data/event_emoji.yaml through
+ partials/event_type.html), its date (partials/event_date.html), and
+ its venue, each part left out when the record lacks it; for a person,
+ the name and the roles the archive credits them with, from
+ partials/appearances_index.html in the order of
+ partials/role_order.html, the same roles the row of /people/ prints.
+ Else site.Params.description, one sentence about the community.
+
+ Not .Summary: the summary of a person page is the start of a bio,
+ and the summary of a page with raw HTML is a slice of a table.
+ og:description and twitter:description read the same sentence, so a
+ shared link says what a search result says.
+
+ The text goes through plainify and the escaping of the attribute
+ context, never through safeHTML: a title and a venue are content
+ (AGENTS.md). truncate keeps whole words and counts the ellipsis, so
+ the attribute is never longer than 160 characters.
+*/ -}}
+{{- $meta := "" -}}
+{{- /* .Params.description as well: the pages content/talks/_content.gotmpl
+ and content/people/_content.gotmpl add write their description under
+ params, where .Description does not look. */ -}}
+{{- if or .Description .Params.description -}}
+ {{- $meta = or .Description .Params.description -}}
+{{- else if and (eq .Section "talks") .Params.talk -}}
+ {{- $record := partial "talk_record.html" . -}}
+ {{- with $record.talk -}}
+ {{- $entry := $record.entry -}}
+ {{- $kind := "Talk" -}}
+ {{- with index (partial "event_types.html" .) $entry.type }}{{ $kind = .label }}{{ end -}}
+ {{- $meta = $kind -}}
+ {{- with $entry.speaker }}{{ $meta = printf "%s by %s" $meta . }}{{ end -}}
+ {{- with $record.event -}}
+ {{- $meta = printf "%s at %s" $meta .Title -}}
+ {{- with (partial "event_date.html" (dict "date" .Params.date "end_date" .Params.end_date)).text -}}
+ {{- $meta = printf "%s, %s" $meta . -}}
+ {{- end -}}
+ {{- end -}}
+ {{- $meta = printf "%s." $meta -}}
+ {{- end -}}
+{{- else if and (eq .Section "events") .Params.year -}}
+ {{- $type := partial "event_type.html" . -}}
+ {{- $marker := default (index site.Data.event_emoji "*") (index site.Data.event_emoji $type) -}}
+ {{- $meta = $marker.label -}}
+ {{- with (partial "event_date.html" (dict "date" .Params.date "end_date" .Params.end_date)).text -}}
+ {{- $meta = printf "%s on %s" $meta . -}}
+ {{- end -}}
+ {{- with .Params.venue }}{{ $meta = printf "%s at %s" $meta . }}{{ end -}}
+ {{- $meta = printf "%s." $meta -}}
+{{- else if and (eq .Section "people") .Params.id .Params.name -}}
+ {{- $labels := slice -}}
+ {{- range index (partialCached "appearances_index.html" site "appearances-index") .Params.id -}}
+ {{- if not (in $labels .label) }}{{ $labels = $labels | append .label }}{{ end -}}
+ {{- end -}}
+ {{- with $labels -}}
+ {{- $roles := partial "role_order.html" . -}}
+ {{- /* The serial comma: "A and B", but "A, B, and C". */ -}}
+ {{- $last := cond (gt (len $roles) 2) ", and " " and " -}}
+ {{- $meta = printf "%s: %s at Python Barcelona." $.Params.name (delimit $roles ", " $last) -}}
+ {{- end -}}
+{{- end -}}
+{{- $meta = default site.Params.description $meta -}}
+{{- with $meta }}
+
+{{- end }}
-{{ with $description }}{{ end }}
+{{ with $meta }}{{ end }}
{{ with $image }}
@@ -64,7 +139,7 @@
{{ end }}
-{{ with $description }}{{ end }}
+{{ with $meta }}{{ end }}
{{ with $image }}
{{ end }}
diff --git a/themes/pybcn_theme/layouts/partials/jump_bar.html b/themes/pybcn_theme/layouts/partials/jump_bar.html
index 0d05151a2..b05fd132f 100644
--- a/themes/pybcn_theme/layouts/partials/jump_bar.html
+++ b/themes/pybcn_theme/layouts/partials/jump_bar.html
@@ -8,7 +8,7 @@
anchor the id of the heading of the group
text what the link reads
class optional, one more class on the nav: /people/ passes
- jump_bar_centered, which centres the letters, and
+ jump_bar_centered, which centers the letters, and
/events/ keeps its years at the left edge of the table
under them. See .jump_bar in main.scss.
diff --git a/themes/pybcn_theme/layouts/partials/level_badge.html b/themes/pybcn_theme/layouts/partials/level_badge.html
index b323b5082..71290bc5f 100644
--- a/themes/pybcn_theme/layouts/partials/level_badge.html
+++ b/themes/pybcn_theme/layouts/partials/level_badge.html
@@ -4,10 +4,10 @@
Context: the level token as a string. Valid tokens are:
beginner, intermediate, advanced
- The badge shows a coloured dot AND the text label. The level is never
- given by colour alone (WCAG 1.4.1 Use of Color). The badge has its own
+ The badge shows a colored dot AND the text label. The level is never
+ given by color alone (WCAG 1.4.1 Use of Color). The badge has its own
light background, so the dot keeps at least 3:1 contrast whatever the
- colour of the agenda cell behind it (WCAG 1.4.11 Non-text Contrast).
+ color of the agenda cell behind it (WCAG 1.4.11 Non-text Contrast).
The token is matched against the table below before it goes into a class
name. An unknown token prints as escaped text and logs a build warning.
diff --git a/themes/pybcn_theme/layouts/partials/link_mark.html b/themes/pybcn_theme/layouts/partials/link_mark.html
index a746dbd4c..67dd7e023 100644
--- a/themes/pybcn_theme/layouts/partials/link_mark.html
+++ b/themes/pybcn_theme/layouts/partials/link_mark.html
@@ -33,7 +33,7 @@
mark with the long tail.
Before this partial only YouTube and x.com carried a mark, each printed
- where it was used, and the YouTube mark took the colour of the link
+ where it was used, and the YouTube mark took the color of the link
around it while every other icon of the site is grey. There is one
mark per destination now, grey like the rest. The grey
is .link_mark in main.scss, and a caller that needs a different gap or
diff --git a/themes/pybcn_theme/layouts/partials/listing_total.html b/themes/pybcn_theme/layouts/partials/listing_total.html
index 18225042b..43c452c24 100644
--- a/themes/pybcn_theme/layouts/partials/listing_total.html
+++ b/themes/pybcn_theme/layouts/partials/listing_total.html
@@ -6,10 +6,13 @@
Three pages are a list of the whole archive: /events/, /talks/, and
/people/. Their h1 carries the total, and this is where the page is
told apart from the rest. /events/ is the one page that selects the
- events_index layout; the series pages under it are sections of the
- same section and keep the fallback list. /talks/ and /people/ are the
- section page of a section that holds no other section, so the kind
- and the section name are enough.
+ events_index layout. The index of a series under it (/events/meetups/
+ and the other three, layouts/events/list.html) is a section page of
+ the events section, and its h1 carries the rows of its own table,
+ "Monthly meetups (268)": the regular pages under it with a year,
+ which is the test partials/event_listing.html draws a row by. /talks/
+ and /people/ are the section page of a section that holds no other
+ section, so the kind and the section name are enough.
The page of one type of talk, /talks/type/workshop/, is a view of the
talks listing (content/talks/_content.gotmpl adds it, with the token
@@ -17,7 +20,7 @@
Workshops (172)", the count its tab reads from the same map. The page
of one role, /people/role/speaker/, is the same for the people
listing (content/people/_content.gotmpl, partials/people_index.html):
- "People: Speaker (358)". A view with no rows, Assistants, gets 0 and
+ "People: Speaker (358)". A view with no rows, Attendees, gets 0 and
so no count in its h1, which is the fact.
The totals come from partials/listing_counts.html, cached once per
@@ -28,6 +31,8 @@
{{- $listing := "" -}}
{{- if eq .Layout "events_index" -}}
{{- $listing = "events_total" -}}
+{{- else if and (eq .Kind "section") (eq .Section "events") -}}
+ {{- range .RegularPagesRecursive }}{{ if .Params.year }}{{ $total = add $total 1 }}{{ end }}{{ end -}}
{{- else if and (eq .Kind "section") (eq .Section "talks") -}}
{{- $listing = "talks_total" -}}
{{- else if and (eq .Kind "section") (eq .Section "people") -}}
diff --git a/themes/pybcn_theme/layouts/partials/meetup-events.html b/themes/pybcn_theme/layouts/partials/meetup-events.html
index b6fcb37df..7265d32d2 100644
--- a/themes/pybcn_theme/layouts/partials/meetup-events.html
+++ b/themes/pybcn_theme/layouts/partials/meetup-events.html
@@ -9,7 +9,7 @@
2026, out of the Meetup export plus the two written by hand (the header
of content/events/meetups/_index.md counts them), /events/meetups/ is the
list of them, and each one has a page with its day, venue, group, and
- registrations. The body of content/events/monthly_events.md links that
+ RSVPs. The body of content/events/monthly_events.md links that
list, and every one of those pages also has a row on /events/.
The other half cannot be closed from this repository. This block is about
diff --git a/themes/pybcn_theme/layouts/partials/meetup_rsvps.html b/themes/pybcn_theme/layouts/partials/meetup_rsvps.html
new file mode 100644
index 000000000..cbdf9f425
--- /dev/null
+++ b/themes/pybcn_theme/layouts/partials/meetup_rsvps.html
@@ -0,0 +1,45 @@
+{{- /*
+ The Meetup RSVPs of the archive, summed once per build.
+
+ Returns a dict:
+
+ total the sum of the attendance field over the meetup pages
+ that carry it: the "RSVP: yes" answers on Meetup
+ counted how many meetup pages carry the field
+ meetups how many meetup pages there are, the rows of
+ /events/meetups/
+
+ No argument is read: the pages are the regular pages of
+ content/events/meetups/, which is where the Meetup export wrote the
+ figure (bin/import-meetups, both groups, python-barcelona and
+ pyladies-bcn). Call it through partialCached with a constant variant:
+
+ partialCached "meetup_rsvps.html" site "meetup-rsvps"
+
+ Two pages print the figure, the Meetup RSVPs tile of the home page
+ (layouts/_default/home.html) and the Attendees page it leads to
+ (partials/attendees_note.html), and the rule of the site is that a
+ tile says the number of the page it links to, so the sum is computed
+ here and in neither of them.
+
+ What the figure is, and is not. The front matter key is attendance,
+ and the value is the yes count of Meetup, a promise to come and not a
+ seat filled: AGENTS.md says RSVPs are not attendance, and the two
+ pages say so in words. A meetup with no figure is a page the export
+ gave none for, or one written by hand; it counts as a meetup and adds
+ nothing to the sum.
+*/ -}}
+{{- $total := 0 -}}
+{{- $counted := 0 -}}
+{{- $meetups := 0 -}}
+{{- with site.GetPage "/events/meetups" -}}
+ {{- range .RegularPages -}}
+ {{- if not .Params.year }}{{ continue }}{{ end -}}
+ {{- $meetups = add $meetups 1 -}}
+ {{- with .Params.attendance -}}
+ {{- $total = add $total (int .) -}}
+ {{- $counted = add $counted 1 -}}
+ {{- end -}}
+ {{- end -}}
+{{- end -}}
+{{- return dict "total" $total "counted" $counted "meetups" $meetups -}}
diff --git a/themes/pybcn_theme/layouts/partials/people-grid.html b/themes/pybcn_theme/layouts/partials/people-grid.html
index 29b64f93b..1a1d93398 100644
--- a/themes/pybcn_theme/layouts/partials/people-grid.html
+++ b/themes/pybcn_theme/layouts/partials/people-grid.html
@@ -71,13 +71,20 @@
index of "" finds no key, and default then falls through. */ -}}
{{- $section_role := index site.Data.roles (default $.section $level.name) -}}
{{- /* The heading is a sibling of the row, not a child of it. It
- is a title between two rules, centred on the page, and the row
+ is a title between two rules, centered on the page, and the row
below caps its own width at the number of cards the section
asks for: inside the row the heading took that cap, so the
- four headings of /organizers/ were centred on four different
+ four headings of /organizers/ were centered on four different
widths and their rules came out four different lengths. */ -}}
+ {{- /* The heading carries an id from its name, "board-2026" for
+ "Board (2026)", so a link can land on one level: the Board
+ and Committee tile of the home page points at the first
+ home_faces level of the Who we are page this way. The key
+ is not in it, so the id reads as the name does; a page
+ that drew two levels of one name under two keys would
+ repeat an id, and no page does. */ -}}
{{ if $level.name }}
-
+
{{ $level.name }}
{{ end }}
diff --git a/themes/pybcn_theme/layouts/partials/people_letters.html b/themes/pybcn_theme/layouts/partials/people_letters.html
index be7d0cdcc..bdd384bd3 100644
--- a/themes/pybcn_theme/layouts/partials/people_letters.html
+++ b/themes/pybcn_theme/layouts/partials/people_letters.html
@@ -47,7 +47,7 @@
h1, h2, h3 with no level skipped: the hero prints the h1, a letter is
an h2, and the name of a row is an h3 (partials/person_row.html).
- The bar of letters is partials/jump_bar.html, centred. Only the
+ The bar of letters is partials/jump_bar.html, centered. Only the
letters that have a row are in it: a dead A to Z bar would send a
reader to a heading that is not on the page.
*/ -}}
diff --git a/themes/pybcn_theme/layouts/partials/people_summary.html b/themes/pybcn_theme/layouts/partials/people_summary.html
index b36dd07e0..9ad8f8e8c 100644
--- a/themes/pybcn_theme/layouts/partials/people_summary.html
+++ b/themes/pybcn_theme/layouts/partials/people_summary.html
@@ -86,16 +86,16 @@
{{ $.person.Params.name }}
{{ if $.person.Params.linkedin }}
-
+
{{ end }}
{{ if $.person.Params.github }}
-
+
{{ end }}
{{ if $.person.Params.twitter }}
-
+
{{ end }}
{{ if $.person.Params.site }}
-
+
{{ end }}
diff --git a/themes/pybcn_theme/layouts/partials/people_tabs.html b/themes/pybcn_theme/layouts/partials/people_tabs.html
index c40accdf7..271cde82a 100644
--- a/themes/pybcn_theme/layouts/partials/people_tabs.html
+++ b/themes/pybcn_theme/layouts/partials/people_tabs.html
@@ -4,13 +4,14 @@
then any view with no rows behind it, through
partials/filter_tabs.html.
- [ All 371 ] [ 📋 Management Board (2026) 4 ] [ 🧭 Permanent Committee 6 ] [ 🧭 Organizer 21 ] ... [ Assistants ]
+ [ All N ] [ 🎤 Speakers N ] [ 🧭 Event organizers N ] ... [ 📋 Board (2026) N ] ... [ 🪑 Attendees ]
Argument: the page being rendered, /people/ or the page of one role,
so that its tab is marked current.
The tabs are the ones of /talks/: All, and then each role with its
- emoji. The counts
+ emoji, reading the title of its page ("Speakers", "Event organizers",
+ "Board (2026)") as the tabs of /talks/ read theirs. The counts
come from partials/people_index.html, the one walk that also builds
the rows, so a tab says how many rows the page behind it draws. The
pages come from content/people/_content.gotmpl, which adds one per
@@ -30,7 +31,7 @@
After them, any page of the section with a filter that no row holds:
a view with no count, because there is no number to print. The one
- such page is Assistants, which says that the association never
+ such page is Attendees, which says that the association never
tracked who attended (see the adapter). It is listed from the pages
and not named here, so a second such view is one more page and no
edit to this bar.
@@ -64,7 +65,7 @@
{{- $count := int (index $people.labels $label) -}}
{{- $ranked = $ranked | append (dict
"url" $pg.RelPermalink
- "text" $label
+ "text" $pg.Title
"count" $count
"emoji" (default (index site.Data.role_emoji "*") (index site.Data.role_emoji $label))
"current" (eq $here.RelPermalink $pg.RelPermalink)
@@ -78,7 +79,7 @@
{{- if index $people.labels $label }}{{ continue }}{{ end -}}
{{- $empty = $empty | append (dict
"url" $pg.RelPermalink
- "text" $label
+ "text" $pg.Title
"emoji" (default (index site.Data.role_emoji "*") (index site.Data.role_emoji $label))
"current" (eq $here.RelPermalink $pg.RelPermalink)
"key" $label) -}}
diff --git a/themes/pybcn_theme/layouts/partials/person_appearances.html b/themes/pybcn_theme/layouts/partials/person_appearances.html
index b82898975..16acca93e 100644
--- a/themes/pybcn_theme/layouts/partials/person_appearances.html
+++ b/themes/pybcn_theme/layouts/partials/person_appearances.html
@@ -60,7 +60,7 @@
index and parsed through partials/event_date.html with the URL as the
cache key, the key the listings use, so an edition parsed for /talks/
is a cache hit here. Within one year the rows are newest first, then
- the event title and URL, then the place of the talk in the programme
+ the event title and URL, then the place of the talk in the program
of the day, so the rows of one event are together and the day cell
spans them. The markup is the one of layouts/talks/list.html, with
every table element carrying its role written out, because under lg
diff --git a/themes/pybcn_theme/layouts/partials/person_placeholder.html b/themes/pybcn_theme/layouts/partials/person_placeholder.html
index 4ce128bc5..f16c48b02 100644
--- a/themes/pybcn_theme/layouts/partials/person_placeholder.html
+++ b/themes/pybcn_theme/layouts/partials/person_placeholder.html
@@ -1,9 +1,9 @@
{{- /*
The mark of a person with no photo: the initials of the name on a
- colour derived from the name. In the 48 px slot of a row of /people/,
+ color derived from the name. In the 48 px slot of a row of /people/,
and at 240 px where the portrait of the page of the person would be.
- [ DA ] on one of ten colours, always the same one for one name
+ [ DA ] on one of ten colors, always the same one for one name
Argument: a dict with
name the name of the person, as the record writes it (required)
@@ -13,20 +13,20 @@
else draws it, so a different placeholder (a pattern drawn by CSS, a
figure, a glyph) is a change to this file and to its block of
people_index.scss, and to no layout. The size is the caller's: the
- colours and the letters are the shared rule of people_index.scss, the
+ colors and the letters are the shared rule of people_index.scss, the
48 px of the row sit under .people_rows there, and the 240 px of the
page under .person_page in people_page.scss. The page showed nothing
where the portrait goes until 2026-10-15, and the placeholder of the
- row is drawn there now: the initials on a colour.
+ row is drawn there now: the initials on a color.
- Why initials and a colour. 250 of the 378 records carry no photo. The
+ Why initials and a color. 250 of the 378 records carry no photo. The
row used to print the emoji of the first role of the person there
(data/role_emoji.yaml), which put 🎤 on some 230 rows in a column: a
marker that nearly every row shares marks nothing, and it read as an
icon of the site and not as a stand-in for a face. The initials are
the one fact about the person the row already has, and they differ
from row to row, so a reader who scans the column can tell the rows
- apart; the colour does the same for a reader who does not read the
+ apart; the color does the same for a reader who does not read the
letters. No image is requested for them, which the anonymous
silhouette of the grid (anon_member.webp) would have cost 250 times.
@@ -36,13 +36,13 @@
archive is built. A name of one word gives one letter. The letters are
cut by rune, not by byte, so an accented initial stays one letter.
- The colour. One of ten, picked by the FNV-1a hash of the name modulo
- ten, so one name gets one colour on every build and on every page
+ The color. One of ten, picked by the FNV-1a hash of the name modulo
+ ten, so one name gets one color on every build and on every page
that may draw it, and two builds cannot disagree. The ten are set in
people_index.scss, every one of them at 5:1 or more under white text
(WCAG 1.4.3 asks 4.5:1 for text of this size), and the class carries
the index, hue_0 to hue_9: no inline style, which bin/check-rendered
- inspects, and no colour value in the markup.
+ inspects, and no color value in the markup.
Hidden from a screen reader, as the photo it stands in for is: the
name is the heading right beside it, and the initials said aloud
diff --git a/themes/pybcn_theme/layouts/partials/person_row.html b/themes/pybcn_theme/layouts/partials/person_row.html
index 17aae374b..82ca16d02 100644
--- a/themes/pybcn_theme/layouts/partials/person_row.html
+++ b/themes/pybcn_theme/layouts/partials/person_row.html
@@ -25,7 +25,7 @@
The avatar: the photo, or the placeholder of
partials/person_placeholder.html when there is none, the initials of
- the name on a colour derived from the name. One column either way, so
+ the name on a color derived from the name. One column either way, so
the names line up down the page. The link around the photo repeats
the name link beside it, so it is out of the tab order and hidden
from a screen reader (tabindex -1, aria-hidden): two links to one
@@ -38,7 +38,7 @@
not 128 times on load (see people_index.scss).
Line one: the name, which is the link to the page of the person, then
- the post when the caller gives one, in the colour of the facts under a
+ the post when the caller gives one, in the color of the facts under a
row so the name stays what the eye reads first, then the social links
of the record as brand marks (partials/person_social_icons.html). The name
is an h3 at the size of the text around it: an h3 at its default size
diff --git a/themes/pybcn_theme/layouts/partials/person_talks_index.html b/themes/pybcn_theme/layouts/partials/person_talks_index.html
index 77094c35c..16c8c0be9 100644
--- a/themes/pybcn_theme/layouts/partials/person_talks_index.html
+++ b/themes/pybcn_theme/layouts/partials/person_talks_index.html
@@ -23,7 +23,7 @@
video the URL of the video of the talk, or "" when the day
published none (see agenda_entry.html)
key a sort key: newest day first, then the event, then
- the place of the talk in the programme of that day
+ the place of the talk in the program of that day
No argument is read: the data comes from site.RegularPages. Call it
through partialCached with a constant variant, so the site is walked
diff --git a/themes/pybcn_theme/layouts/partials/photo_gallery.html b/themes/pybcn_theme/layouts/partials/photo_gallery.html
index d4ca0ef6d..154096373 100644
--- a/themes/pybcn_theme/layouts/partials/photo_gallery.html
+++ b/themes/pybcn_theme/layouts/partials/photo_gallery.html
@@ -27,7 +27,7 @@
and not under the schedule; the gallery was photographs only for one
day, from 2026-10-14). The row of a talk keeps its own video link as
well, a mild redundancy on purpose: the row says this talk was
- filmed while you read the programme, and the Gallery lists the
+ filmed while you read the program, and the Gallery lists the
recordings of the day together. A video prints as the row of the
Talks block of a meetup page (partials/talk_rows.html): the icon of
the type, the title as the link to the page of the talk, where the
@@ -145,7 +145,7 @@
2026-10-17: the hr it opened with was a second rule over a title
that draws its own. Each photograph is a card of its own, on the
white of the page, in the frame of every card of the site: the band
- of colour that held every card until 2026-10-14 is gone. See
+ of color that held every card until 2026-10-14 is gone. See
assets/scss/photo_gallery.scss.
The section does not carry link_anchor, the class the other sections of
@@ -317,7 +317,7 @@
Photos ({
{{- end }}
{{- end }}
- {{- /* The recordings of the day: one row per video, in programme
+ {{- /* The recordings of the day: one row per video, in program
order, from partials/event_videos.html. The title links to the
page of the talk, where the player is; the Welcome Session of
PyDay BCN 2020 is a slot with no talk and no page, and prints
diff --git a/themes/pybcn_theme/layouts/partials/role_order.html b/themes/pybcn_theme/layouts/partials/role_order.html
index 496bf35a6..f93c5b65a 100644
--- a/themes/pybcn_theme/layouts/partials/role_order.html
+++ b/themes/pybcn_theme/layouts/partials/role_order.html
@@ -7,7 +7,7 @@
Returns the same labels, sorted:
- Management Board, Permanent Committee, Organizer, Collaborator,
+ Board, Permanent Committee, Event organizer, Collaborator,
Speaker, Mentor, Volunteer
and any label the list above does not name after them, in
@@ -20,12 +20,12 @@
did at one event.
The match is on the role and not on the whole label, by prefix: a
- board label carries its term, "Management Board (2026)" and
- "Former Management Board (2018 - 2025)". A label that starts with
+ board label carries its term, "Board (2026)" and
+ "Former Board (2018 - 2025)". A label that starts with
"Former " sorts with the role it was: the word is a tense, not a
rank, and inside the rank the present comes before the past, so the
- tabs of /people/ read "Management Board (2026)" before "Former
- Management Board (2018 - 2025)" (it was alphabetical, which put the
+ tabs of /people/ read "Board (2026)" before "Former
+ Board (2018 - 2025)" (it was alphabetical, which put the
former board first, 2026-10-16). The sort orders the labels and
rewrites none, so a label with a defect still shows the defect where
a reader can see it. Two labels of one rank and one tense keep the
@@ -36,10 +36,10 @@
Measured over the 378 rows of /people/ on 2026-10-15: Speaker 358,
Organizer 21, Mentor 10, Collaborators 8, Permanent Committee 6,
- Management Board (2026) 4, Former Management Board (2018 - 2025) 3,
+ Board (2026) 4, Former Board (2018 - 2025) 3,
Volunteer 1, Collaborator 1.
*/ -}}
-{{- $ranks := slice "Management Board" "Permanent Committee" "Organizer" "Collaborator" "Speaker" "Mentor" "Volunteer" -}}
+{{- $ranks := slice "Board" "Permanent Committee" "Event organizer" "Collaborator" "Speaker" "Mentor" "Volunteer" -}}
{{- $keyed := slice -}}
{{- range $label := . -}}
{{- $rank := len $ranks -}}
diff --git a/themes/pybcn_theme/layouts/partials/search_kind.html b/themes/pybcn_theme/layouts/partials/search_kind.html
index 448debebd..6baac8e24 100644
--- a/themes/pybcn_theme/layouts/partials/search_kind.html
+++ b/themes/pybcn_theme/layouts/partials/search_kind.html
@@ -6,7 +6,7 @@
Pagefind indexes a page only where it finds data-pagefind-body, and
every attribute that says what a page is (the kind meta and filter
- the results are labelled and filtered by) is written from this one
+ the results are labeled and filtered by) is written from this one
answer: partials/hero_header.html puts them on the h1, and the layouts
of the three kinds mark their record. So a page is one kind in one
place, and a kind that is added or taken out of the search is one
diff --git a/themes/pybcn_theme/layouts/partials/session_videos.html b/themes/pybcn_theme/layouts/partials/session_videos.html
index 8fcab7ef3..01a4b199e 100644
--- a/themes/pybcn_theme/layouts/partials/session_videos.html
+++ b/themes/pybcn_theme/layouts/partials/session_videos.html
@@ -27,8 +27,8 @@ Recordings
2026-10-15 (see the header of partials/gallery_content.html), and the
video of a talk sits on the row of its talk as well. A session
recording has no row to sit on and no talk, so it is printed here,
- under the programme of the day and before the gallery: it is part of
- what happened that evening, where the programme is. The player is partials/video_frame.html, the
+ under the program of the day and before the gallery: it is part of
+ what happened that evening, where the program is. The player is partials/video_frame.html, the
frame the page of a talk uses: a recording of a session has no page of
its own, so the page of its day is the page about it, and a player
belongs on the page about the thing it plays (the block printed a
diff --git a/themes/pybcn_theme/layouts/partials/sponsor_summary.html b/themes/pybcn_theme/layouts/partials/sponsor_summary.html
index 534cf777e..35b4b7cb4 100644
--- a/themes/pybcn_theme/layouts/partials/sponsor_summary.html
+++ b/themes/pybcn_theme/layouts/partials/sponsor_summary.html
@@ -19,11 +19,11 @@
A sponsor with no usable logo shows its name as text, and a sponsor with no
web address is not wrapped in an empty link. A broken image reads as a
- mistake, and an organisation that supported the event deserves better than
+ mistake, and an organization that supported the event deserves better than
looking like a missing asset.
The link carries the name of the sponsor as its title, so a reader who
- does not recognise a logo can hover it and read who it is. It is the
+ does not recognize a logo can hover it and read who it is. It is the
same string as the alt of the image, which is
what a screen reader announces.
*/ -}}
diff --git a/themes/pybcn_theme/layouts/partials/talk_pages_index.html b/themes/pybcn_theme/layouts/partials/talk_pages_index.html
index d8cb044b3..81909b29e 100644
--- a/themes/pybcn_theme/layouts/partials/talk_pages_index.html
+++ b/themes/pybcn_theme/layouts/partials/talk_pages_index.html
@@ -1,6 +1,6 @@
{{- /*
The page of each talk, keyed by the event that gave it and the id of the
- talk, so an event page can link a row of its programme or a photo of its
+ talk, so an event page can link a row of its program or a photo of its
gallery to the talk itself.
Returns a flat map. The key is "|" and the
@@ -13,7 +13,7 @@
partialCached "talk_pages_index.html" site "talk-pages-index"
- There are 607 talk pages, 10 programme grids with 138 rows that hold a
+ There are 607 talk pages, 10 program grids with 138 rows that hold a
talk, and 107 gallery photos that name one. An index built per event
page would walk the talk pages ten times, and one built per row 138.
diff --git a/themes/pybcn_theme/layouts/partials/talk_record.html b/themes/pybcn_theme/layouts/partials/talk_record.html
index 33cd10274..86ab89374 100644
--- a/themes/pybcn_theme/layouts/partials/talk_record.html
+++ b/themes/pybcn_theme/layouts/partials/talk_record.html
@@ -10,7 +10,7 @@
event the event page, or "" when the path resolves to nothing
talk the talk record, as the front matter of that event writes it
- position the place of the talk in the programme of that event,
+ position the place of the talk in the program of that event,
counted from 1, which is the order the index at /talks/
lists the talks of one day in
entry what partials/agenda_entry.html resolves for that record:
@@ -50,7 +50,7 @@
site.Pages, so the pages are added with the two ids above and the data
is joined here, at render time, out of the event front matter. That is
the decision this archive already took for the talks: the event owns its
- programme, and a page of one talk is a view of it.
+ program, and a page of one talk is a view of it.
Why agenda_entry.html and not a second join. That partial is where the
archive resolves a talk already: it turns the speaker ids into the names
@@ -63,7 +63,7 @@
It takes a slot of an agenda, because that is what the grid has. A talk
page has no slot: it is the talk, wherever the grid put it. So the slot
passed in names the talk and a start of "0:00", and the start, the end,
- the room, and the colour of the answer are not read. The fields a slot
+ the room, and the color of the answer are not read. The fields a slot
owns rather than the talk, python_level, topic_level, requirements, and
sponsor, come back empty for the same reason, and this page does not
print them: they describe a session of a day, and the row of the grid
diff --git a/themes/pybcn_theme/layouts/partials/talk_rows.html b/themes/pybcn_theme/layouts/partials/talk_rows.html
index adf2e0408..7d3885658 100644
--- a/themes/pybcn_theme/layouts/partials/talk_rows.html
+++ b/themes/pybcn_theme/layouts/partials/talk_rows.html
@@ -20,7 +20,7 @@
The markup is the one the meetup page carried until the edition page
needed the same rows: PyData Barcelona 2017 holds 32 talks and no
- programme grid, and listed its slides in its body as a numbered list
+ program grid, and listed its slides in its body as a numbered list
with the speaker names typed in, a worse copy of its own talk records.
One partial, so the two pages read alike and a change reaches both.
The styles are .talk_rows of talks.scss, which the person page uses as
diff --git a/themes/pybcn_theme/layouts/partials/talks_index.html b/themes/pybcn_theme/layouts/partials/talks_index.html
index 9b0f5cd53..aa7fe2fd6 100644
--- a/themes/pybcn_theme/layouts/partials/talks_index.html
+++ b/themes/pybcn_theme/layouts/partials/talks_index.html
@@ -19,7 +19,7 @@
month_group "|", the key of the month group
event_group "|", the key of the event group
key the sort key: newest day first, then the event,
- then the place of the talk in its programme
+ then the place of the talk in its program
No argument is read: the data comes from site.RegularPages. Call it
through partialCached with a constant variant, so the 607 records are
@@ -71,7 +71,7 @@
{{- $talk := $record.talk -}}
{{- /* The year of the event, with the date of the page as the fallback
- for a programme whose event carries no year. */ -}}
+ for a program whose event carries no year. */ -}}
{{- $year := 0 -}}
{{- with $event }}{{ with .Params.year }}{{ $year = int . }}{{ end }}{{ end -}}
{{- if and (not $year) (not $pg.Date.IsZero) }}{{ $year = $pg.Date.Year }}{{ end -}}
@@ -124,7 +124,7 @@
{{- end -}}
{{- /* The type as the counts key it: lower case and trimmed, the
- normalisation of partials/event_type_icon.html. */ -}}
+ normalization of partials/event_type_icon.html. */ -}}
{{- $type := "" -}}
{{- with $entry.type }}{{ $type = lower (trim (printf "%v" .) " ") }}{{ end -}}
diff --git a/themes/pybcn_theme/layouts/partials/talks_table.html b/themes/pybcn_theme/layouts/partials/talks_table.html
index e4038991e..cf27a87a8 100644
--- a/themes/pybcn_theme/layouts/partials/talks_table.html
+++ b/themes/pybcn_theme/layouts/partials/talks_table.html
@@ -81,7 +81,7 @@
The order. Years newest first, and inside a year the rows by the
date of their event newest first, then the event title and its URL as
the tiebreak for two events on one day, then the place of the talk in
- the programme of its event: a day is a sequence, and the first talk of
+ the program of its event: a day is a sequence, and the first talk of
the morning is not the one whose title starts with an A. The months
and the events fall out of that order as runs of rows, and the render
loop opens a group where the key of a row differs from the row before
diff --git a/themes/pybcn_theme/layouts/partials/video_frame.html b/themes/pybcn_theme/layouts/partials/video_frame.html
index 29bed4c88..b18298573 100644
--- a/themes/pybcn_theme/layouts/partials/video_frame.html
+++ b/themes/pybcn_theme/layouts/partials/video_frame.html
@@ -26,7 +26,7 @@
on the home page, in the About PyBCN block (layouts/_default/home.html),
which plays the presentation of the community at PyConES 2020, the one
video of the channel that belongs to no event and so to no page of the
- archive. A listing or a programme grid prints a link and no frame: the
+ archive. A listing or a program grid prints a link and no frame: the
PyDay BCN 2020 page has a video on almost every row, and a frame per
row would make one request to Google per row before a reader asked for
any of them. bin/check-rendered allows the frame on those paths with
diff --git a/themes/pybcn_theme/layouts/partials/video_link.html b/themes/pybcn_theme/layouts/partials/video_link.html
index 4c1cc1abb..8c4ff3602 100644
--- a/themes/pybcn_theme/layouts/partials/video_link.html
+++ b/themes/pybcn_theme/layouts/partials/video_link.html
@@ -17,9 +17,9 @@
YouTube, so the words said it twice, and they are gone
wherever the phrase appeared.
blank optional. true opens the video in a new tab, for the block
- of the programme grid and its modal, which did so before.
+ of the program grid and its modal, which did so before.
- One partial, so the row of a meetup page, the block of the programme
+ One partial, so the row of a meetup page, the block of the program
grid, the modal behind it, the page of the talk, and the recording of
a whole session print the same link in the same words. The mark is
partials/link_mark.html, the one mark per destination the whole site
diff --git a/themes/pybcn_theme/layouts/people/list.html b/themes/pybcn_theme/layouts/people/list.html
index 75a846734..45232deda 100644
--- a/themes/pybcn_theme/layouts/people/list.html
+++ b/themes/pybcn_theme/layouts/people/list.html
@@ -3,7 +3,7 @@
first letter of its id, A first, under the tabs that filter it by
role.
- [ All 371 ] [ 📋 Management Board (2026) 4 ] [ 🧭 Permanent Committee 6 ] [ 🧭 Organizer 21 ] ...
+ [ All N ] [ 📋 Board (2026) N ] [ 🧭 Permanent Committee N ] [ 🧭 Event organizers N ] ...
A | B | C | ...
M
[photo] Marc Pous [in] [gh]
@@ -29,7 +29,7 @@
What an identity record looks like here. 240 of the 378 records carry
an id and a name and nothing else: they exist so that a talk of a
- programme can credit its speaker by id. A row of one of those is a
+ program can credit its speaker by id. A row of one of those is a
name, the role the archive credits it with, and the day it was
credited, which is everything the site knows. It gets no photo,
because it has none: the anonymous silhouette of the grid,
diff --git a/themes/pybcn_theme/layouts/people/role.html b/themes/pybcn_theme/layouts/people/role.html
index 07b11c051..d7760c987 100644
--- a/themes/pybcn_theme/layouts/people/role.html
+++ b/themes/pybcn_theme/layouts/people/role.html
@@ -16,9 +16,12 @@
carries, both from the same index.
A page with content prints it above the list, where /people/ prints
- its own intro: the Assistants page is all content and no rows, the
- answer that the association never tracked who attended (see the
- adapter), and it prints its paragraph and no empty letter bar.
+ its own intro. The Attendees page is all text and no rows, the answer
+ that the association never tracked who attended, with the one figure
+ there is, the Meetup RSVPs, computed at build time: the text is
+ partials/attendees_note.html (the adapter that adds the page cannot
+ count, see content/people/_content.gotmpl), and the page prints it
+ and no empty letter bar.
*/ -}}
{{ define "main" }}
@@ -26,6 +29,9 @@
{{ partial "people_tabs.html" . }}
{{ with .Content }}
{{ . }}
{{ end }}
+ {{- if eq .Params.filter "Attendees" }}
+ {{ partial "attendees_note.html" . }}
+ {{- end }}
{{- $filter := .Params.filter -}}
{{- $rows := slice -}}
diff --git a/themes/pybcn_theme/layouts/people/single.html b/themes/pybcn_theme/layouts/people/single.html
index 1a11c0bd6..099a72cb4 100644
--- a/themes/pybcn_theme/layouts/people/single.html
+++ b/themes/pybcn_theme/layouts/people/single.html
@@ -80,7 +80,7 @@
read off an event description. AGENTS.md has the rule.
The header: the portrait, or the placeholder of the row of /people/
- (partials/person_placeholder.html, the initials on a colour) when the
+ (partials/person_placeholder.html, the initials on a color) when the
record has no photo, which is 250 of the 378 records. The page showed
nothing there until 2026-10-15. Beside it the Bio, the body of the
record, and then the social links under a "Social links" heading, as
@@ -144,7 +144,7 @@
{{- end -}}
{{- /* The photos and the videos of the talks, in the order of the talks:
- newest day first, then the place in the programme of the day.
+ newest day first, then the place in the program of the day.
Guarded by with: sort of a nil list is a build error, and 25 of the
378 records are credited by no talk, so the list is nil on their
pages. */ -}}
@@ -260,7 +260,7 @@
Videos ({{ len . }})
{{- with .File }}
About this page
- This page is generated from the archive of past events. The events, the photos, and the videos come from the programmes of the days this person took part in; the name, the bio, and the links come from one file. To change or remove anything on it, {{ partial "link_mark.html" "https://github.com/" }}edit that file on GitHub and open a pull request, or write to {{ site.Params.main_contact_email }}.
+ This page is generated from the archive of past events. The events, the photos, and the videos come from the programs of the days this person took part in; the name, the bio, and the links come from one file. To change or remove anything on it, {{ partial "link_mark.html" "https://github.com/" }}edit that file on GitHub and open a pull request, or write to {{ site.Params.main_contact_email }}.
{{- end }}
diff --git a/themes/pybcn_theme/layouts/talks/list.html b/themes/pybcn_theme/layouts/talks/list.html
index b75066d8a..c182505d0 100644
--- a/themes/pybcn_theme/layouts/talks/list.html
+++ b/themes/pybcn_theme/layouts/talks/list.html
@@ -1,8 +1,8 @@
{{- /*
- The /talks/ page: every talk of every programme the association has
+ The /talks/ page: every talk of every program the association has
published, in one table, under the tabs that filter it by type.
- [ All 607 ] [ 💬 Talks 398 ] [ 💻 Workshops 172 ] [ ⚡ Lightning talks 27 ] ...
+ [ All N ] [ 💬 Talks N ] [ 💻 Workshops N ] [ ⚡ Lightning talks N ] ...
2025 | 2024 | ... | 2007
Year Month Day Event Talk Gallery
...
diff --git a/themes/pybcn_theme/layouts/talks/single.html b/themes/pybcn_theme/layouts/talks/single.html
index 9d1f29edd..971381f6d 100644
--- a/themes/pybcn_theme/layouts/talks/single.html
+++ b/themes/pybcn_theme/layouts/talks/single.html
@@ -5,7 +5,7 @@
The page itself holds no data. content/talks/_content.gotmpl adds it
with the id of the talk and the content path of its event, and
partials/talk_record.html joins the record out of the front matter of
- that event at render time. So this page and the row of the programme
+ that event at render time. So this page and the row of the program
grid of that day print the same facts from the same place.
The h1 is the title of the talk, printed by partials/hero_header.html
@@ -21,7 +21,7 @@
youtube-nocookie.com player, and its header says what the frame asks
of Google, where the privacy policy says so, and which other pages
carry a player: the Recordings block of a day and the Videos block of
- a person. A listing or a programme grid prints a link and no frame.
+ a person. A listing or a program grid prints a link and no frame.
What is not here: the room, the start, and the end of the session.
Those belong to the slot of the grid and not to the talk, and the
@@ -201,7 +201,7 @@
The scheme of an http URL is raised to https first. This
page is the first to render these descriptions: the
- PyDataBCN 2017 programme carries no eventTimes, so it
+ PyDataBCN 2017 program carries no eventTimes, so it
draws no grid and opens no modal, and the text of its
talks reached no page of this site until now. The site
publishes no insecure link, which bin/check-rendered