Skip to content

Commit a2f2401

Browse files
committed
Add new meetup, and meetup component
1 parent b879036 commit a2f2401

File tree

4 files changed

+156
-77
lines changed

4 files changed

+156
-77
lines changed

index.html.pm

Lines changed: 98 additions & 76 deletions
Original file line numberDiff line numberDiff line change
@@ -3,96 +3,118 @@
33
◊(require string-interpolation)
44

55
◊`(div ([class ,"flex bg-[@{raisin-black}]"])
6-
(div ([class "hidden my-2 md:flex flex-col items-center shrink-0 justify-around ml-6 lg:ml-12 xl:ml-36"])
7-
,(badge "Locality of Behavior")
8-
(a ([href "https://nixos.org"])
9-
(img ([src "assets/logos/nix.png"] [class "aspect-auto w-16 lg:w-24"])))
10-
,(badge "Simplicity")
11-
(a ([href "https://clojure.org"])
12-
(img ([src "assets/logos/clojure.svg"] [class "aspect-auto w-16 lg:w-24"])))
13-
,(badge "Functional Optics")
14-
(a ([href "https://rust-lang.org"])
15-
(img ([src "assets/logos/ferris.svg"] [class "aspect-auto w-16 lg:w-24"])))
16-
,(badge "Reproducibility")
6+
(div ([class "hidden my-2 md:flex flex-col items-center shrink-0 justify-around ml-6 lg:ml-12 xl:ml-36"])
7+
,(badge "Locality of Behavior")
8+
(a ([href "https://nixos.org"])
9+
(img ([src "assets/logos/nix.png"] [class "aspect-auto w-16 lg:w-24"])))
10+
,(badge "Simplicity")
11+
(a ([href "https://clojure.org"])
12+
(img ([src "assets/logos/clojure.svg"] [class "aspect-auto w-16 lg:w-24"])))
13+
,(badge "Functional Optics")
14+
(a ([href "https://rust-lang.org"])
15+
(img ([src "assets/logos/ferris.svg"] [class "aspect-auto w-16 lg:w-24"])))
16+
,(badge "Reproducibility")
17+
)
18+
(div ([class ,"flex flex-col justify-between mx-auto min-h-screen max-w-screen-xl px-4 pt-12 md:px-8 md:pt-20 lg:px-16 text-zinc-300"])
19+
(div ([class "my-6"])
20+
(h1 ([class ,"my-4 text-4xl text-[@{jordy}] font-fira-code tracking-tighter leading-snug text-center"])
21+
"Coding is hard —")
22+
(p ([class "my-2 sm:text-lg leading-relaxed text-center"])
23+
"Many tools and languages make it easy to add accidental complexity.")
24+
(p ([class "my-2 sm:text-lg leading-relaxed text-center"])
25+
"Accidental complexity creates unnecessary cognitive load.")
26+
(p ([class "my-2 sm:text-lg leading-relaxed text-center"])
27+
"If we constantly battle cognitive load, we get exhausted, unhappy and frustrated.")
1728
)
18-
(div ([class ,"flex flex-col justify-between mx-auto min-h-screen max-w-screen-xl px-4 pt-12 md:px-8 md:pt-20 lg:px-16 text-zinc-300"])
19-
(div ([class "my-6"])
20-
(h1 ([class ,"my-4 text-4xl text-[@{jordy}] font-fira-code tracking-tighter leading-snug text-center"])
21-
"Coding is hard —")
22-
(p ([class "my-2 sm:text-lg leading-relaxed text-center"])
23-
"Many tools and languages make it easy to add accidental complexity.")
24-
(p ([class "my-2 sm:text-lg leading-relaxed text-center"])
25-
"Accidental complexity creates unnecessary cognitive load.")
26-
(p ([class "my-2 sm:text-lg leading-relaxed text-center"])
27-
"If we constantly battle cognitive load, we get exhausted, unhappy and frustrated.")
28-
)
29-
(div ([class "my-6"])
30-
(h1 ([class ,"my-4 text-4xl text-[@{jordy}] font-fira-code tracking-tighter leading-snug text-center"])
31-
"but does it have to be " (span ([class "italic"]) "that") " hard?")
32-
(p ([class "my-2 sm:text-lg leading-relaxed text-center"])
33-
"There are tools and techniques that manage complexity well.")
34-
(p ([class "my-2 sm:text-lg leading-relaxed text-center"])
35-
"Using those tools and techniques " (span ([class "italic"]) "reduces") " cognitive load.")
36-
(p ([class "my-2 sm:text-lg leading-relaxed text-center"])
37-
"So that you can be energetic, happy and joyful while coding.")
38-
)
39-
(div ([class "mx-auto"])
40-
(a ([href "#meetup"]
41-
[class ,"mb-4 flex flex-col gap-2 items-center hover:text-[@{jordy}] focus-visible:text-[@{jordy}] duration-300"])
42-
(span ([class "text-xl text-[@{jordy}] font-fira-code tracking-tighter leading-snug"])"Interested?")
43-
(svg ([xmlns "http://www.w3.org/2000/svg"] [fill "none"] [viewBox "0 0 24 24"] [stroke-width "1"] [stroke "currentColor"] [class "size-16"])
44-
(path ([stroke-linecap "round"] [stroke-linejoin "round"] [d "m19.5 8.25-7.5 7.5-7.5-7.5"]))))
45-
)
29+
(div ([class "my-6"])
30+
(h1 ([class ,"my-4 text-4xl text-[@{jordy}] font-fira-code tracking-tighter leading-snug text-center"])
31+
"but does it have to be " (span ([class "italic"]) "that") " hard?")
32+
(p ([class "my-2 sm:text-lg leading-relaxed text-center"])
33+
"There are tools and techniques that manage complexity well.")
34+
(p ([class "my-2 sm:text-lg leading-relaxed text-center"])
35+
"Using those tools and techniques " (span ([class "italic"]) "reduces") " cognitive load.")
36+
(p ([class "my-2 sm:text-lg leading-relaxed text-center"])
37+
"So that you can be energetic, happy and joyful while coding.")
4638
)
47-
(div ([class "hidden my-2 md:flex flex-col items-center shrink-0 justify-around mr-6 lg:mr-12 xl:mr-36"])
48-
,(badge "Functional Data Structures")
49-
(a ([href "https://www.haskell.org/"])
50-
(img ([src "assets/logos/haskell.svg"] [class "aspect-auto w-16 lg:w-28"])))
51-
,(badge "Category Theory")
52-
(a ([href "https://elixir-lang.org"])
53-
(img ([src "assets/logos/elixir.svg"] [class "aspect-auto w-16 lg:w-24"])))
54-
,(badge "Distributed Systems")
55-
(a ([href "https://racket-lang.org"])
56-
(img ([src "assets/logos/racket.svg"] [class "aspect-auto w-16 lg:w-24"])))
57-
,(badge "Low Coupling")
39+
(div ([class "mx-auto"])
40+
(a ([href "#meetup"]
41+
[class ,"mb-4 flex flex-col gap-2 items-center hover:text-[@{jordy}] focus-visible:text-[@{jordy}] duration-300"])
42+
(span ([class "text-xl text-[@{jordy}] font-fira-code tracking-tighter leading-snug"])"Interested?")
43+
(svg ([xmlns "http://www.w3.org/2000/svg"] [fill "none"] [viewBox "0 0 24 24"] [stroke-width "1"] [stroke "currentColor"] [class "size-16"])
44+
(path ([stroke-linecap "round"] [stroke-linejoin "round"] [d "m19.5 8.25-7.5 7.5-7.5-7.5"]))))
5845
)
46+
)
47+
(div ([class "hidden my-2 md:flex flex-col items-center shrink-0 justify-around mr-6 lg:mr-12 xl:mr-36"])
48+
,(badge "Functional Data Structures")
49+
(a ([href "https://www.haskell.org/"])
50+
(img ([src "assets/logos/haskell.svg"] [class "aspect-auto w-16 lg:w-28"])))
51+
,(badge "Category Theory")
52+
(a ([href "https://elixir-lang.org"])
53+
(img ([src "assets/logos/elixir.svg"] [class "aspect-auto w-16 lg:w-24"])))
54+
,(badge "Distributed Systems")
55+
(a ([href "https://racket-lang.org"])
56+
(img ([src "assets/logos/racket.svg"] [class "aspect-auto w-16 lg:w-24"])))
57+
,(badge "Low Coupling")
58+
)
5959
)
6060

6161
div[#:class "bg-white"]{
6262
div[#:id "meetup" #:class "min-h-[94vh] text-zinc-700 mx-auto h-full max-w-screen-md px-6 pt-12 md:px-12 md:pt-20 lg:px-24"]{
63-
◊heading["About"]
64-
◊par{Hi 👋}
65-
◊par{
66-
We're ◊(link "Dirk" "https://www.linkedin.com/in/dirk-hüsken-414b8b101"), ◊(link "Thomas" "https://www.linkedin.com/in/thomas-graf-253629ba"), ◊(link "David" "https://binderdavid.github.io") and ◊(link "Beat" "https://me.beathagenlocher.com") and we thought it would be nice if the wonderful city of Tübingen had a functional programming meetup (again!).
67-
}
68-
◊par{
69-
We want to create a space where people interested in functional programming can meet and learn from each other. To achieve this, we will start off with talks, followed by food and an open exchange between the participants.
70-
}
63+
◊heading["About"]
64+
◊par{Hi 👋}
65+
◊par{
66+
We're ◊(link "Dirk" "https://www.linkedin.com/in/dirk-hüsken-414b8b101"), ◊(link "Thomas" "https://www.linkedin.com/in/thomas-graf-253629ba"), ◊(link "David" "https://binderdavid.github.io") and ◊(link "Beat" "https://me.beathagenlocher.com") and we thought it would be nice if the wonderful city of Tübingen had a functional programming meetup (again!).
67+
}
68+
◊par{
69+
We want to create a space where people interested in functional programming can meet and learn from each other. To achieve this, we will start off with talks, followed by food and an open exchange between the participants.
70+
}
71+
◊par{
72+
Looking forward to see you at the next edition of ◊(link "Tü.λ—Functional Programming Night Tübingen" "https://www.meetup.com/tu-lambda/")!
73+
}
74+
◊meetups{
75+
◊meetup[#:title "06.11.24"]{
7176
◊par{
72-
Looking forward to see you at the next edition of ◊(link "Tü.λ—Functional Programming Night Tübingen" "https://www.meetup.com/tu-lambda/")!
77+
The next meetup will take place at the 06.11.24 at the ◊link["itdesign office" "https://itdesign.de/"], Friedrichstraße 12.
7378
}
79+
◊ul[#:class "list-disc list-inside mx-2 my-4 sm:text-lg leading-relaxed"]{
80+
◊li{18.45 Doors open & Welcome}
81+
◊li{Talk 1 (maybe you?)}
82+
◊; ◊p[#:class "ml-10 my-2 italic text-base"]{
7483

75-
◊heading["Schedule"]
84+
◊; }
85+
◊li{Short break}
86+
◊li{Talk 2 (maybe you?)}
87+
◊; ◊p[#:class "ml-10 my-2 italic text-base"]{
88+
89+
◊; }
90+
◊li{Food, talking, coding, whatever}
91+
◊li{22.00 End}
92+
}
93+
}
94+
◊meetup[#:title "28.08.24"]{
7695
◊par{
77-
The next event will take place at the 28.08.24 at the ◊link["itdesign office" "https://itdesign.de/"], Friedrichstraße 12.
96+
This meetup took place at the 28.08.24 at the ◊link["itdesign office" "https://itdesign.de/"], Friedrichstraße 12.
7897
}
7998
◊ul[#:class "list-disc list-inside mx-2 my-4 sm:text-lg leading-relaxed"]{
80-
◊li{18.45 Doors open & Welcome}
81-
◊li{Simple development environments with Nix (Beat)}
82-
◊p[#:class "ml-10 my-2 italic text-base"]{
83-
Setting up development environments is more complex than it should be. Nix makes entering development environments as easy as running nix develop, making them simple and reproducible. This talk explores what an ideal workflow could look like and walks through a project setup with Nix, outlining its benefits and deficiencies.
84-
}
85-
◊li{Short break}
86-
◊li{Persistent Data Structures: From Lists to Hashmaps (David)}
87-
◊p[#:class "ml-10 my-2 italic text-base"]{
88-
Functional programmers cannot use the same data structures and algorithms that imperative programmers are used to. Functional data structures make it easier to reason about what our code does, but have different performance characteristics. This talk will introduce some of the basic and advanced techniques we use when we implement functional data structures efficiently.
89-
}
90-
◊li{Food, talking, coding, whatever}
91-
◊li{22.00 End}
92-
}
93-
◊par{
94-
If you want to attend the meetup, please ◊(link "tell us about it" "https://www.meetup.com/tu-lambda/") so that we can plan accordingly 😊
99+
◊li{18.45 Doors open & Welcome}
100+
◊li{Simple development environments with Nix (Beat)}
101+
◊p[#:class "ml-10 my-2 italic text-base"]{
102+
Setting up development environments is more complex than it should be. Nix makes entering development environments as easy as running nix develop, making them simple and reproducible. This talk explores what an ideal workflow could look like and walks through a project setup with Nix, outlining its benefits and deficiencies.
103+
}
104+
◊li{Short break}
105+
◊li{Persistent Data Structures: From Lists to Hashmaps (David)}
106+
◊p[#:class "ml-10 my-2 italic text-base"]{
107+
Functional programmers cannot use the same data structures and algorithms that imperative programmers are used to. Functional data structures make it easier to reason about what our code does, but have different performance characteristics. This talk will introduce some of the basic and advanced techniques we use when we implement functional data structures efficiently.
108+
}
109+
◊li{Food, talking, coding, whatever}
110+
◊li{22.00 End}
95111
}
112+
}
113+
}
114+
115+
◊par{
116+
If you want to attend the meetup, please ◊(link "tell us about it" "https://www.meetup.com/tu-lambda/") so that we can plan accordingly 😊
117+
}
96118

97119
◊heading["Contact"]
98120
div[#:class "pb-6"]{

main.js

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
document.addEventListener('DOMContentLoaded', function() {
2+
const meetupContainer = document.getElementById('meetups-container');
3+
const scrollLeftBtn = document.getElementById('meetups-scroll-left');
4+
const scrollRightBtn = document.getElementById('meetups-scroll-right');
5+
6+
if (scrollLeftBtn && scrollRightBtn && meetupContainer) {
7+
scrollLeftBtn.addEventListener('click', () => {
8+
const containerWidth = meetupContainer.clientWidth;
9+
const scrollAmount = containerWidth * 1.0;
10+
meetupContainer.scrollBy({
11+
left: -scrollAmount,
12+
behavior: 'smooth'
13+
});
14+
});
15+
16+
scrollRightBtn.addEventListener('click', () => {
17+
const containerWidth = meetupContainer.clientWidth;
18+
const scrollAmount = containerWidth * 1.0;
19+
meetupContainer.scrollBy({
20+
left: scrollAmount,
21+
behavior: 'smooth'
22+
});
23+
});
24+
} else {
25+
console.error('One or more required elements are missing from the DOM');
26+
}
27+
});

pollen.rkt

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,3 +37,32 @@
3737
(define (heading text)
3838
`(h1 ([id ,(id-ify text)] [class ,"text-3xl font-fira-code text-[@{jordy}] tracking-tighter leading-snug"])
3939
,text))
40+
41+
(define (meetup #:title title #:img [img ""] . body)
42+
`(div ([class "overflow-hidden my-4 snap-center flex w-[90%] shrink-0 mx-8 sm:mx-16 shadow-lg rounded-lg"])
43+
,(if (string=? img "")
44+
""
45+
`(img ([class "w-full"] [src ,img])))
46+
(div ([class "px-6 py-4"])
47+
,(heading title)
48+
,@body)))
49+
50+
(define (meetups . body)
51+
`(div ([class "scroll-container mb-4 -mx-6 md:-mx-12 lg:-mx-24 md:gap-4 lg:gap-8"])
52+
(div ([class "flex justify-between"])
53+
(button ([id "meetups-scroll-left"] [class "text-zinc-500 hover:cursor-pointer hover:scale-125 duration-200 ease-out transition"])
54+
(svg ([xmlns "http://www.w3.org/2000/svg"] [fill "none"] [viewBox "0 0 24 24"] [stroke-width "1.5"] [stroke "currentColor"] [class "size-10"])
55+
(path ([stroke-linecap "round"] [stroke-linejoin "round"] [d "M15.75 19.5 8.25 12l7.5-7.5"]))
56+
)
57+
)
58+
(div ([id "meetups-container"] [class "relative flex items-center flex-grow snap-x overflow-x-auto"])
59+
,@body
60+
)
61+
(button ([id "meetups-scroll-right"] [class "text-zinc-500 hover:cursor-pointer hover:scale-125 duration-200 ease-out transition"])
62+
(svg ([xmlns "http://www.w3.org/2000/svg"] [fill "none"] [viewBox "0 0 24 24"] [stroke-width "1.5"] [stroke "currentColor"] [class "size-10"])
63+
(path ([stroke-linecap "round"] [stroke-linejoin "round"] [d "m8.25 4.5 7.5 7.5-7.5 7.5"]))
64+
)
65+
)
66+
)
67+
)
68+
)

template.html.p

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,10 +36,11 @@
3636

3737
<link rel="stylesheet" href="fonts.css">
3838
<script src="https://cdn.tailwindcss.com"></script>
39+
<script src="main.js"></script>
3940
</head>
4041
<body class="antialiased scroll-smooth font-fira-sans selection:bg-[◊|jordy-light|] selection:text-[◊|raisin-black|]">
4142
◊(->html `(div ([class ""])
42-
,doc))
43+
,doc))
4344
<footer class="p-6 sm:p-8 md:p-12">
4445
<div class="flex flex-wrap justify-center items-center gap-4 sm:gap-6 md:gap-8 text-sm text-zinc-400">
4546
<div class="flex flex-wrap gap-x-2 justify-center">

0 commit comments

Comments
 (0)